Nginx 反向代理

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匹配到(注意,/ /中間是空格)
  • ~開頭表示區分大小寫的正則匹配
  • ~*開頭表示不區分大小寫的正則匹配
  • !~ 和 !~* 分別爲 區分大小寫不匹配 及 不區分大小寫不匹配 的正則
  • / 通用匹配,任何請求都會被匹配到

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章