Nginx配置詳解
Nginx的配置是在nginx.conf中進行配置的
主要由三部分組成
- 全局塊
- events塊
- http塊
全局塊
從配置文件開始到events塊之間的內容是全局塊,主要用來配置Nginx服務器整體運行的配置指令,主要包括配置運行Nginx的用戶組、允許生成的worker process數,進行PID存放路徑、日志存放路徑和類型以及配置文件的引入
#nginx的用戶和用戶組
#user nobody;
# nginx處理并發的數量,值越大,處理并發數量越多
# 通常為cpu數量
worker_processes 1;
#全局錯誤日志定義 位置 級別([ debug | info | notice | warn | error | crit ])
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#進程文件
#pid logs/nginx.pid;
#一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(系統的值ulimit -n)與nginx進程數相除,但是nginx分配請求并不均勻,所以建議與ulimit -n的值保持一致.
worker_rlimit_nofile 65535;
events塊
主要是影響Nginx服務器與用戶網絡的連接,常用的配置包括是否開啟對多worker process下的網絡連接進行序列化,是否允許同時接受多個網絡連接,選取那種事件驅動模型來處理連接請求,每個worker process可以同時支持的并發數
events {
#use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
#epoll模型是linux內核中的高性能網絡I/O模型,如果在mac上面,就用kqueue模型。
use kqueue;
# 每個worker process可以同時支持的連接數為1024
# nginx支持的最大并發數是worker_processes*worker_connections
#如果是作為反向代理服務器的話,最大并發數是worker_processes*worker_connections/2,因為反向代理服務器,每個并發會建立與客戶端的連接和與后端的連接,會占用兩個連接
worker_connections 1024;
}
http塊
Nginx配置中修改最頻繁的配置就是http塊的配置
http塊又分為了http全局塊和server塊
http全局塊
主要配置的是文件的引入、MIME-TYPE定義、日志自定義、連接超時時間、單鏈接請求上限等
server塊主要是虛擬主機的配置
又分為了server全局塊和location塊
http {
# 文件擴展名與文件類型映射表
include mime.types;
# 默認文件類型
default_type Application/octet-stream;
#默認編碼
#charset utf-8;
#服務器名字的hash表大小
server_names_hash_bucket_size 128;
#上傳文件大小限制
client_header_buffer_size 32k;
#設定請求緩沖
large_client_header_buffers 4 64k;
#設定請求緩沖
client_max_body_size 8m;
# 開啟目錄列表訪問,合適下載服務器,默認關閉.
# 顯示目錄
autoindex on;
# 顯示文件大小 默認為on,顯示出文件的確切大小,單位是bytes 改為off后,顯示出文件的大概大小,單位是kB或者MB或者GB
autoindex_exact_size on;
# 顯示文件時間 默認為off,顯示的文件時間為GMT時間 改為on后,顯示的文件時間為文件的服務器時間
autoindex_localtime on;
#日志格式化
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# 日志保存 日志的格式使用main
#access_log logs/access.log main;
# sendfile 高效傳輸文件的模式
sendfile on;
# 將文件一次性一起傳輸給客戶端,提高網絡包的傳輸效率
#tcp_nopush on;
# 開啟實時傳輸,與tcp_nopush相反,只在長連接下有效
#tcp_nodelay on;
#連接超時時間
#keepalive_timeout 0;
keepalive_timeout 65;
# FastCGI相關參數是為了改善網站的性能:減少資源占用,提高訪問速度.下面參數看字面意思都能理解.
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip壓縮
#gzip on;
#允許壓縮的頁面的最小字節數,頁面字節數從header偷得content-length中獲取.默認是0,不管頁面多大都進行壓縮.建議設置成大于1k的字節數,小于1k可能會越壓越大
gzip_min_length 1k;
#表示申請4個單位為16k的內存作為壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果
gzip_buffers 4 16k;
#壓縮版本(默認1.1,目前大部分瀏覽器已經支持gzip解壓.前端如果是squid2.5請使用1.0)
gzip_http_version 1.1;
#壓縮等級.1壓縮比最小,處理速度快.9壓縮比最大,比較消耗cpu資源,處理速度最慢,但是因為壓縮比最大,所以包最小,傳輸速度快
gzip_comp_level 2;
#壓縮類型,默認就已經包含text/html,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn.
gzip_types text/plain application/x-JAVAscript text/css application/xml;
#選項可以讓前端的緩存服務器緩存經過gzip壓縮的頁面.例如:用squid緩存經過nginx壓縮的數據
gzip_vary on;
#實際的服務器列表
#upstream myserver {
# server 127.0.0.1:8080;
# server 127.0.0.1:8082;
#}
# 虛擬主機設置
server {
#監聽的端口號
listen 8080;
#訪問域名
server_name localhost;
#編碼格式
#charset koi8-r;
#虛擬主機訪問日志定義
#access_log logs/host.access.log main;
# url匹配
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
# 禁止訪問.ht文件
#location ~ /.ht {
# 禁止下載
# deny all;
#}
}
server
{
# 監聽端口 HTTPS
listen 443 ssl;
server_name ably.com;
# 配置域名證書
ssl_certificate /server/Certs/certificate.crt;
ssl_certificate_key /WebServer/Certs/private.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
index index.html index.htm index.php;
root /data/www/;
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
# 配置地址攔截轉發,解決跨域驗證問題
location /oauth/{
proxy_pass https://localhost:13580/oauth/;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 圖片緩存時間設置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 10d;
}
# JS和CSS緩存時間設置
location ~ .*.(js|css)?$ {
expires 1h;
}
# 日志格式設定
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
# 定義本虛擬主機的訪問日志
access_log /var/log/nginx/access.log access;
# 設定查看Nginx狀態的地址.StubStatus模塊能夠獲取Nginx自上次啟動以來的工作狀態,此模塊非核心模塊,需要在Nginx編譯安裝時手工指定才能使用
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
#htpasswd文件的內容可以用apache提供的htpasswd工具來產生.
}
}
include servers/*;
}
location配置
匹配規則
location有多種匹配規則[=|~|~*|^~] /url/
- =表示精確匹配,優先級最高
- ^~表示uri以某個字符串開頭,即^~/spring/ 可以被所有以/spring/開頭的匹配到
- ~為區分大小寫的正則匹配,如果使用!~則表示取反,不匹配的正則
- ~*為不區分大小寫的正則匹配,如果使用!~*則表示取反,不匹配的正則
- /通用匹配,任何請求都會匹配到
靜態文件路徑
可以使用root或alias來指定靜態資源文件路徑,root可以配置在http塊、server塊、location塊以及if塊中,alias只能配置在location塊中
root
使用root來表示請求的url時會進行完整的拼接,即如果請求使用的uri是/pic/index.html的話,使用root實際獲取的是
/data/www/web/pic/index.html
location /pic/ {
root /data/www/web;
}
alias
alias會將location中配置的路徑丟棄掉,即即如果請求使用的uri是/pic/index.html的話,使用alias實際獲取的是/data/www/web/index.html
location /pic/ {
alias /data/www/web;
}
Nginx常見配置參數
- servernameshashmaxsize 1024;
- servernameshashbucketsize 512;
- clientheaderbuffer_size 32k; # 客戶端請求頭部的緩沖區大
- largeclientheader_buffers 4 32k;
- clientmaxbody_size 10m;#設置最大的允許客戶端請求主體的大小(上傳文件大小限制), 默認為1m
- clientbodybuffer_size 128k;
- keepalive_timeout 60; #客戶端連接超時時間,單位是秒, 默認是75秒
- sendfile on; # 開啟高效傳輸模式,默認為off
- tcp_nopush on;
- tcp_nodelay on;
- ssi on; # 開啟ssi支持,默認為false
- ssisilenterrors on; # 設置為on表示在處理ssi文件時不輸出錯誤信息,默認為false
- ssitypes text/html; # 默認支持html ,如果需要支持shtml(服務器執行腳本),需要設置為ssitypes text/shtml
- server_tokens off; # 關閉nginx版本號的顯示,默認為on
Nginx優化相關參數
- worker_processes 2; # 配置生成的worker process數量,一般為cpu核數
- workerrlimitnofile 65536; # 一個nginx進程打開的最多文件描述符數目,一般設置為與系統設定的值相同(ulimit -n)
- workercpuaffinity 01 10;# 為每個進程分配CPU的工作內核
- use epoll; # 事務模型
events {
use epoll; # 事務模型
worker_connections 20000; # 一個nginx進程的連接數,nginx服務器允許的同事連接的客戶端最大數量Client = worker_processes * worker_connections/2;
}
Nginx常見用法
依據UA屏蔽爬蟲
if ($http_user_agent ~* "qihoobot|Baiduspider|googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou
spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot") {
return 403;
}
屏蔽IP訪問
allow 133.27.182.82;
allow 113.106.18.0/24;
allow 121.201.104.0/24;
deny all;
使用Auth權限訪問
auth_basic "bbs-auth";
auth_basic_user_file /usr/local/nginx/conf/bbsauthpwd;
限制帶寬
# 用戶下載達到 500k 后,便控制其速度在 50k 以內
location /download/ {
limit_rate_after 500k;
limit_rate 50k;
}
限制連接
# 定義了一個名為“down”,10M大小,以連接IP為key的連接數據存儲空間
limit_conn_zone $binary_remote_addr zone=down:10m;
# 讀取名為`down`連接數據存儲空間的數據,限制每個key(上面是以ip作為IP) 最大同時連接數為4
location ~ .*.(rar|zip|apk)?$ {
limit_conn down 4;
limit_rate 150k;
}
limit_conn_log_level notice: 指定當觸發limit的時候日志打印級別
限制請求
# 定義一個名為”one”, 10M大小,每秒1個請求的請求數據存儲空間
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
# 引用名為“one”的存儲空間,burst為等待請求數量數,當等待請求數量超過50個時,則拋出503錯誤,nodelay 針對的是 burst 參數,burst=50 nodelay 表示這50個請求立馬處理,不能延遲,相當于特事特辦。不過,即使這20個突發請求立馬處理結束,后續來了請求也不會立馬處理。burst=50 相當于緩存隊列中占了50個坑,即使請求被處理了,這20個位置這只能按 100ms一個來釋放
limit_req zone=one burst=50 nodelay;
limit_req_log_level notice: 指定當觸發limit的時候日志打印級別
實時顯示Nginx運行狀況
在安裝nginx是編譯httpstubstatusmodule即可,使用參數為–with-httpstubstatusmodule
location /ngx_status {
stub_status on;
access_log on;
}
設置錯誤頁面
error_page 404 /404.html
Nginx 常見錯誤碼
- 301 永久重定向
- 302 臨時重定向
- 403 禁止訪問
- 404 文件不存在
- 413 文件上傳超過限制
- 500 服務器錯誤
- 502 后臺服務器無響應
- 504 Nginx超時,請求過多,工作進程不足