Nginx 是一個高性能的http 和反向代理服務器,用於把客戶端請求分發給後臺的web 容器。下載安裝的話,可以到官網去下載 安裝。
一、配置文件
#工作進程,一般設置爲CPU的核數
woker_processes 2
#在高併發情況下,通過設置cpu粘性來降低由於多CPU核切換造成的寄存器等現場重建帶來的性能損耗。
worker_cpu_affinity 0001 0010 0100 1000; #(四核)。
#寫在main部分。默認是沒有設置,可以限制爲操作系統最大的限制65535 > 2^16 -1
worker_rlimit_nofile 10240
events {
#nginx默認使用epoll事件模型,nginx在Linux操作系統下效率相當高
use epoll;# epoll [事件模型] > kqueue [類似於epoll的高效事件模型] > select [不支持高效事件模型]
#每一個worker進程能併發處理(發起)的最大連接數(包含與客戶端或後端被代理服務器間等所有連接數)
worker_connections 2048;
#最大連接數 = worker_processes * worker_connections/4,所以這裏客戶端最大連接數是1024,這個可以增到到8192都沒關係
}
upstream tomcatserver {
server 192.168.72.49:8081;
server 192.168.72.49:8082;
server 192.168.72.49:8080 weight=2;# 分擔2/5的請求
server 192.168.72.49:6060;
server 192.168.72.49:9090 down;# 暫時不參與負載
server 192.168.72.49:7070 backup;# 其他主機都宕機時,此服務器啓用
}
server {
#監聽端口,此處監聽爲訪問Nginx的端口,與tomcat端口無關
listen 80;
#監聽地址,此處應該在hosts文件中做映射(或者是既定域名),否則無法解析
server_name 8081.max.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# 請求轉向tomcatserver 定義的服務器列表
proxy_pass http://tomcatserver;
index index.html index.htm;
}
# 動靜分離 , 可作靜態資源服務器
location /Downloads {
root /Users/xuqinxiang/;
#index index.html index.htm;
#以下配置爲 允許定義的兩個IP訪問,其他的都不允許【無特殊要求 不配置】
allow 192.168.10.100;
allow 172.29.73.0/24;
deny all;
}
# 瀏覽器訪問: http://localhost:8080/Downloads/111.jpg 即可訪問/Users/###/Downloads/下的 111.jpg 【Mac中測試通過】
}
二、流程
- 瀏覽器訪問8081.max.com,通過本地的 host文件 或者 域名解析,找到 192.168.72.49服務器(這個就是安裝並配置Nginx的那臺服務器)
- nginx反向代理接受客戶機請求,找到server_name爲8081.max.com的server節點,根據proxy_pass對應的http路徑,將請求轉發到 upstream tomcatserver 上,即端口號爲8081的tomcat服務器。
- 總體就是 請求8081.max.com , tomcat1 接收返回首頁(tomcat首頁)
三、負載均衡策略
upstream tomcatserver{
ip_hash; # 負載策略爲 ip_hash
server 127.0.0.1:9090 down; (down 表示當前的server暫時不參與負載)
server 127.0.0.1:8080 weight=2; (weight 默認爲1.weight越大,負載的權重就越大)
}
- 輪詢 :默認
- ip_hash :同一IP每次請求路由到同一臺服務器
- weight :權重,按比例分配請求,數字越大,所佔請求比例越大
- fair : 第三方負載算法,響應時間短的優先分配
- url_hash :第三方負載算法,相同請求路由到同一臺服務器
四、信號量控制
一般我們在使用Nginx時,常用的命令爲:
-
啓動:start nginx 或 nginx
-
停止: nginx -s stop 或 nginx -s quit
-
重啓:nginx -s reload
我們也可以使用nginx提供的信號量進行控制,使用信號量控制,首先要知道(獲取)nginx的進程號[ 包括主進程和工作進程,信號量控制基於主進程 ]。
- 獲取進程號的命令如下:
ps aux|grep nginx
假設獲取的進程號爲26633,(logs/nginx.pid 文件中爲進程號,後面會說明如何基於此文件進行信號量的控制)
- 立即退出nginx(兩種方式)
kill -INT 26633
kill -TERM 26633
- 優雅的退出(進程空閒時退出)
kill -QUIT 26633
- 軟重啓,並加載最新的配置文件
kill -HUB 26633
- 先重命名原來的日誌,並新建日誌名(未改之前的名字),使用此命令可以將日誌寫入新建的日誌文件中
kill -USER1 26633
- USER2 與 WINCH 用於平滑升級的時候使用(這裏不做解釋)
- 如果不想每次都要先查看進程號,可以使用如下命令,以退出爲例
kill -QUIT 'cat logs/nginx.pid'
五、日誌按日期分割
有時候我們的日誌記錄的數據比較多,一天的日誌可能就非常大,如果不進行日誌分割的話,排查問題會很困難。我們可以使用以下方式,自動進行日誌的切割。
- 編寫shell腳本 -runlog.sh
#日誌路徑
LOGPATH=/usr/local/nginx/logs/logName.log
#備份日誌路徑
BASEPATH=/usr/local/nginx/data
bak=BASEPATH/$(date -d yesterday +%Y%m%d).logName.log #20190730
#echo $bak
mv $LOGPATH $bak
touch $LOGPATH
kill -USER1 cat /usr/local/nginx/logs/nginx.pid
- 定時器設定
crontab -e
*/1 * * * * sh /usr/local/nginx/runlog.sh #cron定時+ 腳本文件
- 執行shell腳本,即可每分鐘執行一次。根據日誌情況,我們可以設置每天、每週、每月 進行分割
六、location 定位
語法規則:location = [ =|~|~*|^~ ] /uri/{...}
- =開頭表示精準匹配
- ^~開頭表示uri以某個常規字符串開頭,理解爲匹配的URL路徑即可。nginx不對URL做編碼,因此請求爲/static/20%/aa,可以被規則 ^~/static/ /aa匹配到(注意,/ /中間是空格)
- ~開頭表示區分大小寫的正則匹配
- ~*開頭表示不區分大小寫的正則匹配
- !~ 和 !~* 分別爲 區分大小寫不匹配 及 不區分大小寫不匹配 的正則
- / 通用匹配,任何請求都會被匹配到