#user nobody; #啟動進程,通常設置成和cpu的數量相等 worker_processes 4; #全局錯誤日志及PID文件 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #默認pid的保存位置如下,可更改 #pid logs/nginx.pid; #工作模式及連接數上限 events { #epoll是多路復用IO(I/O Multiplexing)中的一種方式, #僅用於linux2.6以上內核,可以大大提高nginx的性能 #use epoll; #單個worker process進程的最大並發鏈接數 worker_connections 1024; # 並發總數是 worker_processes 和 worker_connections 的乘積 # 即 max_clients = worker_processes * worker_connections # 在設置了反向代理的情況下,max_clients = worker_processes * worker_connections / 4 為什么 # 為什么上面反向代理要除以4,應該說是一個經驗值 # 根據以上條件,正常情況下的Nginx Server可以應付的最大連接數為:4 * 8000 = 32000 # worker_connections 值的設置跟物理內存大小有關 # 因為並發受IO約束,max_clients的值須小於系統可以打開的最大文件數 # 而系統可以打開的最大文件數和內存大小成正比,一般1GB內存的機器上可以打開的文件數大約是10萬左右 # 我們來看看360M內存的VPS可以打開的文件句柄數是多少: # $ cat /proc/sys/fs/file-max # 輸出 34336 # 32000 < 34336,即並發連接總數小於系統可以打開的文件句柄總數,這樣就在操作系統可以承受的范圍之內 # 所以,worker_connections 的值需根據 worker_processes 進程數目和系統可以打開的最大文件總數進行適當地進行設置 # 使得並發總數小於操作系統可以打開的最大文件數目 # 其實質也就是根據主機的物理CPU和內存進行配置 # 當然,理論上的並發總數可能會和實際有所偏差,因為主機還有其他的工作進程需要消耗系統資源。 # ulimit -SHn 65535 } http { #設定mime類型,類型由mime.type文件定義 include mime.types; #默認的傳輸文件方式 default_type application/octet-stream; #設定名稱為main的日志格式取代默認的combined格式,$time_iso8601(標准格式2017-01-19T09:10:52+08:00)。 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #access日志位置和格式, 需要增加http_x_forwarded_for的顯示,日志需要定時移除或改名,不支持按天分文件 access_log logs/access.log main; #緩沖,避免每次都關閉打開日志文件 open_log_file_cache max=1000 inactive=60s valid=60s min_uses=2; #sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件, #對於普通應用,必須設為 on, #如果用來進行下載等應用磁盤IO重負載應用,可設置為 off, #以平衡磁盤與網絡I/O處理速度,降低系統的uptime. sendfile on; #激活tcp_nopush參數可以允許把httpresponse header和文件的開始放在一個文件里發布,積極的作用是減少網絡報文段的數量 tcp_nopush on; #長連接超時時間,默認是75s keepalive_timeout 60s; #激活tcp_nodelay,內核會等待將更多的字節組成一個數據包,從而提高I/O性能 tcp_nodelay on; #開啟gzip壓縮 gzip on; #IE6及以下版本性能太差,不壓縮 gzip_disable "MSIE [1-6]."; gzip_min_length 1000; gzip_buffers 4 16k; gzip_types text/plain application/x-javascript text/css; #設定請求緩沖 client_header_buffer_size 128k; large_client_header_buffers 4 128k; #禁止嵌套訪問 add_header X-Frame-Options SAMEORIGIN; #設置httponly add_header Set-Cookie "HttpOnly=true; max-age=1800"; #限制每個IP只能訪問60次/分鍾,以及白名單,同時需在location中開啟代碼 limit_req_zone $binary_remote_addr zone=allips:10m rate=60r/m; geo $limited{ default 1; #My IPs 127.0.0.1/32 0; 192.168.0.0/32 0; } upstream mywebapp { #ip_hash負載,如果沒加這條指令,nginx會使用默認的round robin負載均衡(指定weight比重) #ip_hash; #max_fails表示超時重試的最大次數,當在fail_timeout時間段內重試次數達到上限則標記服務器不可用,將在fail_timeout后取消標記並重新嘗試計數。此處超時計算依賴請求的超時時間,即nginx到后端server的請求超時時間設置見server的location /部分 server 127.0.0.1:8888 weight=1 max_fails=1 fail_timeout=30s; #server 127.0.0.1:7001 weight=1 max_fails=1 fail_timeout=30s; } #設定虛擬主機配置,第一個主機為默認主機 #設置默認server防御host頭攻擊 server { listen 8100 default_server; server_name _; location / { return 403; } } server { #訪問端口 listen 8100; server_name 192.168.11.150; #此處必須是用戶瀏覽器內輸入的IP或域名 #定義服務器的默認網站根目錄位置,可相對/絕對地址,指定了靜態文件的存放位置,千萬不要寫成\ #root D:/bea12/user_projects/domains/base_domain/autodeploy/DefaultWebApp; root D:/java/tomcat-9.0.10/webapps/root; #charset koi8-r; #禁止Scrapy等工具的抓取,HttpClient仍可用 if ($http_user_agent ~* (Scrapy|Curl)) { return 403; } #禁止指定UA及UA為空的訪問,會導致一些使用接口沒法訪問了,因此需要仔細分別 #if ($http_user_agent ~* "WinHttp|WebZIP|FetchURL|node-superagent|java/|FeedDemon|Jullo|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|Java|Feedly|Apache-HttpAsyncClient|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|BOT/0.1|YandexBot|FlightDeckReports|Linguee Bot|^$" ) { # return 403; #} #屏蔽GET|POST|OPTIONS之外的請求方式:delete put trace,貌似trace默認就是返回405 if ($request_method !~* GET|POST|OPTIONS) { return 403; } #location匹配規則:=最先,^~次之,然后按配置出現順序(建議按請求頻率確定順序),最后是/根通配 #默認請求策略 location / { #使用限制器,每秒最多30個請求 limit_req zone=allips burst=30 nodelay; proxy_pass http://mywebapp; #proxy_redirect off; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_set_header Cookie $http_cookie; #nginx與server的連接超時時間(與server線程是否阻塞無關,不是等待后端返回頁面的時間),默認值是60s,不能超過75s proxy_connect_timeout 3; #nginx發送請求給server的超時時間。超時設置不是為了整個發送期間,而是在兩次write操作期間,默認值是60s #proxy_send_timeout 60s #nginx會等待多長時間來獲得server的響應,這個時間不是獲得整個response的時間,而是兩次reading操作的時間 #(與server線程是否阻塞有關,應根據server是否有大時長運算調整,同時也要增加keepalive_timeout的時間),默認值是60s #proxy_read_timeout 60s; #設置off避免編碼轉換出現不對的情況 chunked_transfer_encoding off; #讓cookies寫在根目錄下,這樣才不會丟失,如果出現cookies丟失的話 #proxy_cookie_path /examples/ /; } #給icon圖標響應空白圖片,避免讀硬盤並記錄日志 location ~ /(favicon.ico|apple-touch-icon.png|apple-touch-icon-precomposed.png)$ { empty_gif; access_log off; } #靜態文件緩存,必須設置正確的root,不記錄access日志,另外如果靜態文件是在其他服務器,應使用反向代理並緩存(見后:location ~ \.php$) #如果使用了模板引擎等,不要把html\htm設置為靜態緩存,否則可以 location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|json|css|swf|zip|rar|7z|exe|doc|docx|xls|xlsx|ppt|pptx|cab|eot|otf|fon|font|ttf|ttc|woff|woff2)$ { expires 7d; access_log off; } #關閉robots.txt不存在時記錄日志 location = /robots.txt { allow all; log_not_found off; access_log off; } # 不允許訪問隱藏文件例如 .htaccess, .htpasswd, .DS_Store (Mac). location ~ /\. { deny all; access_log off; log_not_found off; } #404頁面 #error_page 404 /404.html; # redirect server error pages to the static page /50x.html #錯誤頁面 error_page 500 502 503 504 /50x.html; #指定50x頁面的響應 location = /50x.html { root html; } #指定特定的請求使用反向代理到指定的服務,比如使用驗證碼 #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} #指定特定的請求使用特定服務 #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} #指定特定的請求拒絕服務,比如禁止訪問/web-info/ #location ~ /\.ht { # deny all; #} } }