目錄:
一、常用命令
整理到《命令匯總20190428.docx》里了 無需安裝,直接解壓即可。(如何后面要切割日志,那么一定要把nginx解壓到沒有空格的文件路徑里) Windows下Nginx的啟動、停止等命令如下(dos下進入nginx-1.15.11目錄): 1、啟動: start nginx 或 nginx.exe (注:start nginx 不保留黑窗口,nginx.exe保留黑窗口) 2、停止: nginx.exe -s stop 或 nginx.exe -s quit (注:stop是快速停止nginx,可能並不保存相關信息;quit是完整有序的停止nginx,並保存相關信息) 3、重新載入Nginx: nginx.exe -s reload (注:當配置信息修改,需要重新載入這些配置時使用此命令) 4、重新打開日志文件: nginx.exe -s reopen 5、查看Nginx版本: nginx -v 6、檢查配置文件沒有語法錯誤 nginx -t nginx-1.15.11\conf\nginx.conf配置文件含義: worker_processes: 工作進程個數,可配置多個(一般等於CPU的總核數或總核數的兩倍,例如兩個四核CPU,則綜合數為8.通過命令ps -ef|grep nginx可以看出來設置的是幾個) worker_connections: 單個進程最大連接數 server: 每一個server相當於一個代理服務器 lister: 監聽端口,默認80 server_name: 當前服務的域名,可以有多個,用空格分隔(我們是本地所以是localhost) location: 表示匹配的路徑,這時配置了/表示所有請求都被匹配到這里 index: 當沒有指定主頁時,默認會選擇這個指定的文件,可多個,空格分隔 proxy_pass: 請求轉向自定義的服務器列表 upstream name{ }: 服務器集群名稱 nginx負載均衡主要有以下五種策略:(Nginx中的upstream輪詢機制介紹:https://www.cnblogs.com/liqiu/p/3140329.html) 輪詢(默認) 每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。 weight 指定輪詢幾率,weight和訪問比率成正比,用於后端服務器性能不均的情況。 ip_hash 每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。 fair(第三方) 按后端服務器的響應時間來分配請求,響應時間短的優先分配。 url_hash(第三方) 按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效。
二、nginx.conf文件配置示例

#user nobody; #----------使用的用戶和組 worker_processes 16; #----------工作進程個數,可配置多個(一般等於CPU的總核數或總核數的兩倍,例如兩個四核CPU,則綜合數為8.通過命令ps -ef|grep nginx可以看出來設置的是幾個) error_log logs/error.log info; #----------指定錯誤日志存放的路徑,錯誤日志記錄級別可選項為:[debug|info|notice|warn|error|crit],默認是crit,記錄的日志數量從crit到debug,由少到多。eg:error_log /usr/local/nginx/logs/nginx_error.log crit; pid logs/nginx.pid; #----------指定pid存放的路徑(pid 進程控制符。即代表了各進程的進程ID,也就是說,PID就是各進程的身份標識) eg: pid /usr/local/nginx/nginx.pid; events { worker_connections 1024; #----------單個進程最大連接數 } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #----------log_format 自定義日志記錄格式設置,main為名字,在access_log命令中引用 # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; #----------指定日志存放路徑,如果想使用默認的combined格式記錄日志,可以使用access_log logs/access.log combined; 以下是使用log_format自定義的格式記錄日志的。 access_log logs/access.log; sendfile on; #----------這三個參數參照《nginx優化——keepalive等》 tcp_nopush on; tcp_nodelay on; #----------使緩沖區中的數據立即發送出去 禁用了Nagle 算法。(不需要等待0.2s) keepalive_timeout 120s; #---------- 設置keep-alive客戶端連接在ngnix服務器端保持開啟的超時值(默認75s) 值為0會禁用keep-alive客戶端連接 這兩個參數參照《nginx優化——keepalive等》 keepalive_requests 10000; #---------- 設置一個keep-alive連接上可以服務的請求的最大數量,當最大請求數量達到時,連接被關閉。默認是100 client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; client_max_body_size 500m; #--------上傳文件最大限制 不設置默認1m #client_header_buffer_size 50k; #large_client_header_buffers 4 4k; gzip on; #---------- 開啟gzip壓縮設置(只能在http模塊中設置) gzip_min_length 1024; #gzip_types text/plain text/css application/x-javascript; upstream gzy.yzs { #---------- 集群配置(這里設置集群名稱為test) upstream設置,設置代理服務器(負載均衡池),默認的負載均衡方式是輪詢,另外一種是ip_hash #max_fails=1 fail_timeout=10s server 172.16.1.237:80 ; #---------- weight為權重,不寫默認為1:1 指定輪詢幾率,weight和訪問比率成正比,用於后端服務器性能不均的情況。 server 172.16.1.131:80 ; ip_hash; #----------不寫的話是輪詢方式,ip_hash為每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。 keepalive 1000; #----------1.設置upstream服務器的空閑keepalive連接的最大數量.2. 當這個數量被突破時,最近使用最少的連接將被關閉 3.特別提醒:keepalive指令不會限制一個nginx worker進程到upstream服務器連接的總數量 4.可參考《nginx優化——keepalive等.html》 } server { #---------- 每一個server相當於一個代理服務器 listen 80; #---------- 監聽的端口(默認為80) server_name yzs; #---------- 主機名稱 #client_max_body_size 500m; #--------上傳文件最大限制 不設置默認1m location / { proxy_pass http://gzy.yzs; #----------將定向的路徑轉到訪問你服務器集群上(對應上面設置的upstream的集群名稱)(upstream設置的是test,故這里寫http://test) proxy_http_version 1.1; #------ HTTP1.0為短連接 HTTP1.1為長連接 這兩個參數參照《nginx優化——keepalive等.html》 proxy_set_header Connection ""; proxy_set_header Host $host; #--------- 變量$host等於客戶端請求頭中的Host值。 #如果是非80端口,配置為Host $host:端口號,目的是將代理服務器收到的用戶的信息傳到真實服務器上 eg: proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; #--------- $remote_addr客戶端的ip地址 proxy_set_header REMOTE-HOST $remote_addr; #--------- $remote_addr客戶端的ip地址 proxy_set_header X-Forwarded-For $http_x_forwarded_for; #--------- 后端的web服務器可以通過X-Forwarded-For獲取真實的IP地址 #proxy_connect_timeout 300s; #----------與服務器連接的超時時間,默認60s(如果一個集群服務器掛掉了(掛掉指連接不上),而負載正好到這個服務器,那么在proxy_connect_timeout時間后,負載才會跳到另一個集群服務器上) proxy_send_timeout 300s; #----------默認60s;這個指定設置了發送請求給upstream服務器的超時時間。超時設置不是為了整個發送期間,而是在兩次write操作期間。如果超時后,upstream沒有收到新的數據,nginx會關閉連接 proxy_read_timeout 600s; #----------默認60s;該指令設置與代理服務器的讀超時時間。它決定了nginx會等待多長時間來獲得請求的響應。這個時間不是獲得整個response的時間,而是兩次reading操作的時間。(??什么是兩次reading操作的時間) #client_max_body_size 500m; #--------上傳文件最大限制 不設置默認1m #proxy_next_upstream http_502 http_504 error timeout invalid_header; #---------如果后端服務器返回502,504,執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另一台服務器,實現failover。 #add_header Cache-Control no-store; #add_header Pragma no-cache; } location /nginxStatus { #----------添加的status模塊,是查看Nginx的運行狀態 stub_status on; access_log off; error_log off; } #charset koi8-r; #----------配置該虛擬機的字符設置,如果不配置繼承自http中的charset設置 #access_log logs/host.access.log main; #----------訪問日志文件設置,如果server虛擬機中不設置,則繼承http模塊中的access_log的設置 #error_page 404 /404.html; #---------- 用於設置如果出現指定的HTTP錯誤狀態碼,則返回指定的url頁面 #error_page 500 502 503 504 /50x.html; #---------- 用於設置如果出現指定的HTTP錯誤狀態碼,則返回指定的url頁面 #location = /50x.html { # root html; #} } }
查看nginx運行情況:
location /nginxStatus { #----------添加的status模塊,是查看Nginx的運行狀態
stub_status on;
access_log off;
error_log off;
}
http://xxxx/nginxStatus
active connections //對后端發起的活動連接數 server accepts handled requests //nginx 總共處理了2268692 個連接, 成功創建2268692 次握手,總共處理了15002597個請求 reading // nginx 讀取到客戶端的Header信息數 writing //nginx 返回給客戶端的Header信息數 waiting // 開啟 keep-alive 的情況下,這個值等於 active- (reading + writing),意思就是Nginx說已經處理完正在等候下一次請求指令的駐留連接 (如果reading或writing的值很高,說明正在處理的數據量很大,可能是因為后端的 php 程序處理慢,拖了后腿,而一般來說,PHP之后以慢,是因為MYSQL,另一個原因很可能就是IO慢,或者客戶端的網絡慢(這種情況在國內常見些)).
三、日志每日分割、定期清理
問題:nginx會按照nginx.conf的配置生成access.log和error.log,隨着訪問量的增長,日志文件會越來越大,既會影響訪問的速度(寫入日志時間延長),也會增加查找日志的難度。
默認的main配置如下:
解決方法:
3.1.編寫bat腳本
用一個bat腳本按天切割日志,並刪除幾天前的日志(我放到了bak文件夾下,別忘了在logs下建個bak文件夾,之前忘了導致找了半天原因)。(參照:https://www.cnblogs.com/luozx207/p/11056996.html)

@echo off rem nginx滾動日志 rem nginx工作目錄 set workspace=C:\nginx-1.16.0 rem 日志存放目錄 set logdir=C:\nginx-1.16.0\logs rem 歷史日志存放目錄 set logbakdir=C:\nginx-1.16.0\logs\bak rem 將當前日志重命名,用今日的日期 move %logdir%\access.log %logbakdir%\%date:~0,4%%date:~5,2%%date:~8,2%_access.log move %logdir%\error.log %logbakdir%\%date:~0,4%%date:~5,2%%date:~8,2%_error.log rem 重新打開日志文件,如果不做這一步,nginx會繼續往已被重命名的日志文件中寫入日志 %workspace%\nginx.exe -s reopen -p %workspace% rem 刪除七天前的日志(根據文件修改日期判斷,且*.log即log格式的文件 就會刪除) set DaysAgo=7 forfiles /p %logbakdir% /m *.log /d -%DaysAgo% /c "cmd /c del /f /q @path"
效果如下:
另如要生成 年月日文件夾的格式。配置如下( eg:logs/bak/2019/08/16/access.log)

#定義時間(年月日) for /f "tokens=1 delims=/ " %%j in ("%date%") do set d1=%%j for /f "tokens=2 delims=/ " %%j in ("%date%") do set d2=%%j for /f "tokens=3 delims=/ " %%j in ("%date%") do set d3=%%j #創建目錄便於查看(eg:C:\nginx-1.16.0\logs\bak\2019\08\16) set backup=C:\nginx-1.16.0\logs\bak\%d1%\%d2%\%d3% mkdir %backupdir% #移動原有日志,相當於重命名 move C:\nginx-1.16.0\logs\access.log %backupdir% move C:\nginx-1.16.0\logs\error.log %backupdir% #重開日志,生成新的日志文件 C:\nginx-1.16.0\nginx.exe -s reopen
(如何要切割日志,那么一定要把nginx解壓安裝到沒有空格的文件路徑里)
注意1:move命令如路徑或文件名有空格則會報語法錯誤,解決方法是在加上雙引號。Eg:
move D:\"Program Files"\nginx-1.16.0\"2 2.txt" D:\"Program Files"\nginx-1.16.0\"3 3.txt"
但下面的重新加載日志任務和刪除歷史記錄任務執行不了。后來我把nginx安裝位置換了個沒有空格的文件路徑后才ok
故:要切割日志,那么一定要把nginx解壓安裝到沒有空格的文件路徑里
注意2: 在測試時,windows自動任務執行結果是(0x1),費了我很長時間找不到原因,后來發現是執行bat時,沒有可刪除的文件,執行結果報(0x1)。當有文件可刪時,執行結果就“操作成功完成。(0x0)”
3.2.配置windows任務計划程序
然后用windows自帶任務計划定期執行logcut.bat這個可執行文件(windows2008R2創建任務)
四、學習參數
https://www.cnblogs.com/aguncn/p/11189159.html
https://www.iteye.com/blog/825635381-2197501
五、學習網址-啟蒙
tomcat+nginx+redis實現均衡負載、session共享(一):
https://www.cnblogs.com/zhrxidian/p/5432886.html
tomcat+nginx+redis實現均衡負載、session共享(二):
https://www.cnblogs.com/zhrxidian/p/5491285.html#4145879
使用Nginx實現Tomcat集群負載均衡:
https://www.cnblogs.com/machanghai/p/5957086.html
Nginx反向代理,負載均衡,redis session共享,keepalived高可用:
https://www.cnblogs.com/mrlinfeng/p/6146866.html
4種負載均衡方式:
https://uule.iteye.com/blog/2236475
下面是優化參數相關:
nginx.conf配置文件中timeout超時時間設置 :
https://blog.csdn.net/qq_29663071/article/details/80759098
nginx優化——keepalive等:
https://blog.csdn.net/dream_flying_bj/article/details/54709549
Nginx+Tomcat負載均衡詳述與實戰-include:
https://blog.csdn.net/qq_29663071/article/details/80759098
查看nginx運行狀態:
https://blog.csdn.net/qq_40884473/article/details/118687650
http://www.voidcn.com/article/p-mdtfwngb-nw.html