Nginx 服務器配置和詳解
阿新 • • 發佈:2018-08-16
proxy erer 模塊 了解 bin 變量 linux 系統 auto 參數
目錄
- Nginx 服務器配置和詳解
- Nginx 模板配置
- Nginx 模塊說明
- 核心模塊
- http 模塊
Nginx 服務器配置和詳解
Nginx 扮演 web 開發的服務端入口控制的角色,相比 Apache,Nginx 使用更少的資源,支持更多的並發連接,體現更高的效率。這需要開發人員對其配置有一定程度的了解,主要用到的是負載均衡和反向代理這兩項功能。
Nginx 模板配置
user www www; worker_processes 2; pid /var/run/nginx.pid; #[ debug | info | notice | warn | error | crit ] error_log /var/log/nginx.error_log info; events { worker_connections 2000; # use [ kqueue | epoll | /dev/poll | select | poll ]; use kqueue; } http { include conf/mime.types; default_type application/octet-stream; log_format main ‘$remote_addr - $remote_user [$time_local] ‘ ‘"$request" $status $bytes_sent ‘ ‘"$http_referer" "$http_user_agent" ‘ ‘"$gzip_ratio"‘; log_format download ‘$remote_addr - $remote_user [$time_local] ‘ ‘"$request" $status $bytes_sent ‘ ‘"$http_referer" "$http_user_agent" ‘ ‘"$http_range" "$sent_http_content_range"‘; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; client_header_buffer_size 1k; large_client_header_buffers 4 4k; gzip on; gzip_min_length 1100; gzip_buffers 4 8k; gzip_types text/plain; output_buffers 1 32k; postpone_output 1460; sendfile on; tcp_nopush on; tcp_nodelay on; send_lowat 12000; keepalive_timeout 75 20; #lingering_time 30; #lingering_timeout 10; #reset_timedout_connection on; server { listen one.example.com; server_name one.example.com www.one.example.com; access_log /var/log/nginx.access_log main; location / { proxy_pass http://127.0.0.1/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; client_body_temp_path /var/nginx/client_body_temp; proxy_connect_timeout 70; proxy_send_timeout 90; proxy_read_timeout 90; proxy_send_lowat 12000; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_temp_path /var/nginx/proxy_temp; charset koi8-r; } error_page 404 /404.html; location = /404.html { root /spool/www; } location /old_stuff/ { rewrite ^/old_stuff/(.*)$ /new_stuff/$1 permanent; } location /download/ { valid_referers none blocked server_names *.example.com; if ($invalid_referer) { #rewrite ^/ http://www.example.com/; return 403; } #rewrite_log on; # rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3 rewrite ^/(download/.*)/mp3/(.*)\..*$ /$1/mp3/$2.mp3 break; root /spool/www; #autoindex on; access_log /var/log/nginx-download.access_log download; } location ~* \.(jpg|jpeg|gif)$ { root /spool/www; access_log off; expires 30d; } } }
上述模板來自於 Nginx 官方示例
Nginx 模塊說明
核心模塊
控制整個 Nginx 的基本功能和程序配置
主模塊
user www www;
worker_processes 2;
error_log /var/log/nginx-error.log info;
...
user user [group]
:定義運行 Nginx 的用戶和其所在組,該項默認ser nobody nobody
可以使用默認配置。在 linux 系統上,一切皆文件,每個文件都有其訪問權限,如果訪問了權限外的文件,客戶端會接受到服務端 403 錯誤。不設置group
則組名與用戶名一致。worker_processes number | auto
error_log file [level]
:日誌存放目錄,level
日誌輸出等級pid file
:進程 id 存儲位置worker_cpu_affinity
:工作進程與 cpu 綁定
worker_processes 4;
\\1表示對應cpu核心工作
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile number
:一個工作進程可打開的最大文件數,設置該值後worker_connections
不能超過該值,理論上這個值是最多打開文件數(ulimit -n
event 模塊
events {
use kqueue;
worker_connections 2048;
}
...
use method
:事件模型,Linux 系統下設置有效,默認會找出最適合系統的事件模型,常用use epoll
worker_connections number
:設置最大並發連接數,該值不僅僅是與客戶端連接。通過worker_connections
和worker_proceses
可以計算出max_clients = worker_processes * worker_connections
,作為反向代理,max_clients = worker_processes * worker_connections/4
。multi_accept on | off
:關閉時一個進程只接受一個連接,開啟時盡可能接受連接,連接放進監聽隊列
http 模塊
配置 http 服務相關
include
:定義文件擴展名,該文件包含類型映射表default_type
:默認解析類型limit_req_zone key zone=name:size rate=rate
:如limit_req_zone $binary_remote_addr zone=limit:10m rate=1r/s;
,10m 緩存,每秒僅允許統一 ip 訪問一次 超出頻率或者緩存超出則返回 503sendfile on | off
:開啟後 Nginx 使用零拷貝的方式輸出文件,一般設置為 on,對於磁盤 IO 重負債應用時可以設置 offtcp_nopush on | off
:激活 tcp_nopush 參數可以允許把 http response header 和文件的開始放在一個文件裏發布或者發送一個滿包的文件,傳輸大量數據有利,只有 sendfile 起效是才有作用tcp_nodelay on | off
:啟用後會禁用 Nagle 算法,盡快發送數據,Nginx 只會針對 keep-alive 狀態的起作用,該選項看似與tcp_nopush
矛盾,但同時啟用產生的效果是先填滿包在盡快發送keepalive_timeout
:連接超時時間
upstream 模塊
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
#server 192.168.1.116 backup;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
該模塊主要完成負載均衡功能
server address [parameters]
weight
:代表權重,權重越高被分配的記錄越大max_conns
:限制最大活動連接數,默認為 0,表示沒有限制fail_timeout=time
:與服務器通信失敗時長,默認 10 smax_fails
:設置在fail_timeout
內連接到主機的失敗次數,超過該次數則認為該主機不可用
server 模塊
server {
server_name ~^(www\.)?(.+)$;
location / {
root /sites/$2;
}
}
listen
:可設置為只是監聽 ip 地址,或者端口,也可以是兩者都有,也可以是主機名稱
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
server_name name ...
:主機名稱,可以使用通配符,多個主機空格隔開
location 模塊
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
該模塊完成對請求分類處理
=
開頭表示精確匹配- 單個
/
表示通用匹配任何請求都能匹配到 ^~
表示匹配 url 路徑~
表示區分大小寫的正則匹配~*
表示不區分大小寫的正則匹配!~
表示區分大小寫的正則不匹配!~*
表示不區分大小寫的正則不匹配proxy_pass URL
:代理服務器地址proxy_set_header field value
:代理請求頭設置,Nginx 可以重新定義或附加請求表頭
//主機名稱
proxy_set_header Host $host;
//真實請求 ip,如果不存在該字段,則該$proxy_add_x_forwarded_for變量等於該$remote_addr變量。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
Nginx 服務器配置和詳解