Nginx常用功能
1朗兵、Http代理,正向/反向代理:作為web服務(wù)器最常用的功能之一顶滩,尤其是反向代理余掖。
正向代理是一個位于客戶端和目標(biāo)服務(wù)器之間的代理服務(wù)器(中間服務(wù)器)。為了從原始服務(wù)器取得內(nèi)容礁鲁,客戶端向代理服務(wù)器發(fā)送一個請求盐欺,并且指定目標(biāo)服務(wù)器,之后代理向目標(biāo)服務(wù)器轉(zhuǎn)交并且將獲得的內(nèi)容返回給客戶端仅醇。正向代理的情況下客戶端必須要進(jìn)行一些特別的設(shè)置才能使用冗美。
反向代理正好相反。對于客戶端來說析二,反向代理就好像目標(biāo)服務(wù)器粉洼。并且客戶端不需要進(jìn)行任何設(shè)置∫渡悖客戶端向反向代理發(fā)送請求属韧,接著反向代理判斷請求走向何處,并將請求轉(zhuǎn)交給客戶端蛤吓,使得這些內(nèi)容就好似他自己一樣宵喂,一次客戶端并不會感知到反向代理后面的服務(wù)。
2会傲、負(fù)載均衡
Nginx提供的負(fù)載均衡策略有2種:內(nèi)置策略和擴(kuò)展策略锅棕。
以下介紹內(nèi)置策略: 輪詢,加權(quán)輪詢淌山,Ip hash哲戚。
Ip hash算法,對客戶端請求的ip進(jìn)行hash操作艾岂,然后根據(jù)hash結(jié)果將同一個客戶端ip的請求分發(fā)給同一臺服務(wù)器進(jìn)行處理顺少,可以解決session不共享的問題。
3、動靜分離
Nginx提供的動靜分離是指把動態(tài)請求和靜態(tài)請求分離開脆炎,合適的服務(wù)器處理相應(yīng)的請求梅猿,使整個服務(wù)器系統(tǒng)的性能、效率更高秒裕。
Nginx可以根據(jù)配置對不同的請求做不同轉(zhuǎn)發(fā)袱蚓,這是動態(tài)分離的基礎(chǔ)。靜態(tài)請求對應(yīng)的靜態(tài)資源可以直接放在Nginx上做緩沖几蜻,更好的做法是放在相應(yīng)的緩沖服務(wù)器上喇潘。動態(tài)請求由相應(yīng)的后端服務(wù)器處理。
配置結(jié)構(gòu)
nginx.conf由以下結(jié)構(gòu)塊構(gòu)成梭稚。
大致的nginx.conf文件如上颖低,而下面講解各塊的作用。
配置實(shí)例:
#運(yùn)行用戶
user nobody;
#啟動進(jìn)程,通常設(shè)置成和cpu的數(shù)量相等
worker_processes 1;
#全局錯誤日志及PID文件
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#工作模式及連接數(shù)上限
events {
#epoll是多路復(fù)用IO(I/O Multiplexing)中的一種方式,
#僅用于linux2.6以上內(nèi)核,可以大大提高nginx的性能
use epoll;
#單個后臺worker process進(jìn)程的最大并發(fā)鏈接數(shù)
worker_connections 1024;
# 并發(fā)總數(shù)是 worker_processes 和 worker_connections 的乘積
# 即 max_clients = worker_processes * worker_connections
# 在設(shè)置了反向代理的情況下弧烤,max_clients = worker_processes * worker_connections / 4 為什么
# 為什么上面反向代理要除以4忱屑,應(yīng)該說是一個經(jīng)驗(yàn)值
# 根據(jù)以上條件,正常情況下的Nginx Server可以應(yīng)付的最大連接數(shù)為:4 * 8000 = 32000
# worker_connections 值的設(shè)置跟物理內(nèi)存大小有關(guān)
# 因?yàn)椴l(fā)受IO約束暇昂,max_clients的值須小于系統(tǒng)可以打開的最大文件數(shù)
# 而系統(tǒng)可以打開的最大文件數(shù)和內(nèi)存大小成正比莺戒,一般1GB內(nèi)存的機(jī)器上可以打開的文件數(shù)大約是10萬左右
# 我們來看看360M內(nèi)存的VPS可以打開的文件句柄數(shù)是多少:
# $ cat /proc/sys/fs/file-max
# 輸出 34336
# 32000 < 34336,即并發(fā)連接總數(shù)小于系統(tǒng)可以打開的文件句柄總數(shù)急波,這樣就在操作系統(tǒng)可以承受的范圍之內(nèi)
# 所以从铲,worker_connections 的值需根據(jù) worker_processes 進(jìn)程數(shù)目和系統(tǒng)可以打開的最大文件總數(shù)進(jìn)行適當(dāng)?shù)剡M(jìn)行設(shè)置
# 使得并發(fā)總數(shù)小于操作系統(tǒng)可以打開的最大文件數(shù)目
# 其實(shí)質(zhì)也就是根據(jù)主機(jī)的物理CPU和內(nèi)存進(jìn)行配置
# 當(dāng)然,理論上的并發(fā)總數(shù)可能會和實(shí)際有所偏差澄暮,因?yàn)橹鳈C(jī)還有其他的工作進(jìn)程需要消耗系統(tǒng)資源名段。
# ulimit -SHn 65535
}
http {
#設(shè)定mime類型,類型由mime.type文件定義
include mime.types;
default_type application/octet-stream;
#設(shè)定日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
#sendfile 指令指定 nginx 是否調(diào)用 sendfile 函數(shù)(zero copy 方式)來輸出文件,
#對于普通應(yīng)用赏寇,必須設(shè)為 on,
#如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用吉嫩,可設(shè)置為 off价认,
#以平衡磁盤與網(wǎng)絡(luò)I/O處理速度嗅定,降低系統(tǒng)的uptime.
sendfile on;
#tcp_nopush on;
#連接超時時間
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#開啟gzip壓縮
gzip on;
gzip_disable "MSIE [1-6].";
#設(shè)定請求緩沖
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#設(shè)定虛擬主機(jī)配置
server {
#偵聽80端口
listen 80;
#定義使用 www.nginx.cn訪問
server_name www.nginx.cn;
#定義服務(wù)器的默認(rèn)網(wǎng)站根目錄位置
root html;
#設(shè)定本虛擬主機(jī)的訪問日志
access_log logs/nginx.access.log main;
#默認(rèn)請求
location / {
#定義首頁索引文件的名稱
index index.php index.html index.htm;
}
# 定義錯誤提示頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#靜態(tài)文件,nginx自己處理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#過期30天用踩,靜態(tài)文件不怎么更新渠退,過期可以設(shè)大一點(diǎn),
#如果頻繁更新脐彩,則可以設(shè)置得小一點(diǎn)碎乃。
expires 30d;
}
#PHP 腳本請求全部轉(zhuǎn)發(fā)到 FastCGI處理. 使用FastCGI默認(rèn)配置.
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#禁止訪問 .htxxx 文件
location ~ /.ht {
deny all;
}
}
}
反向代理配置
代理轉(zhuǎn)發(fā)是在server下面的location進(jìn)行配置, 首先定義一個server監(jiān)聽某個端口
# 全匹配代理轉(zhuǎn)發(fā)
location / {
proxy_pass http://www.example.com/;
}
# proxy_pass參數(shù)中如果不包含url的路徑,則會將location的pattern識別的路徑作為絕對路徑
# 匹配符如果末尾攜帶/則url中剩余內(nèi)容也會轉(zhuǎn)發(fā)
location ^~/japan/ {
proxy_pass http://japanapi.example.com/;
proxy_set_header Host japanapi.example.com;
}
location ^~/japan {
proxy_pass http://japanapi.example.com;
proxy_set_header Host japanapi.example.com;
}
SSL證書配置
1惠奸、配置SSL證書到Nginx中
linux系統(tǒng)梅誓,推薦將證書文件放到/etc/ssl/目錄下
2、添加一個server節(jié)點(diǎn)
http{
#http節(jié)點(diǎn)中可以添加多個server節(jié)點(diǎn)
server{
#監(jiān)聽443端口
listen 443;
#對應(yīng)的域名,把baofeidyz.com改成你們自己的域名就可以了
server_name example.com;
ssl on;
#從騰訊云獲取到的第一個文件的全路徑
ssl_certificate /etc/ssl/1_baofeidyz.com_bundle.crt;
#從騰訊云獲取到的第二個文件的全路徑
ssl_certificate_key /etc/ssl/2_baofeidyz.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
#這是我的主頁訪問地址梗掰,因?yàn)槭褂玫氖庆o態(tài)的html網(wǎng)頁嵌言,所以直接使用location就可以完成了。
location / {
#文件夾
root /usr/local/service/ROOT;
#主頁文件
index index.html;
}
}
}
3及穗、http 80端口重定向
server{
listen 80;
server_name baofeidyz.com;
rewrite ^/(.*)$ https://example.com:443/$1 permanent;
}