Nginx-使用nginx實現反向代理及負載均衡

環境說明

  • OS: Centos6
  • Nginx:nginx-1.14.2

安裝Nginx

安裝必須的依賴庫 3個

  1. gzip 模塊需要 zlib 庫 http://www.zlib.net/上不去了。。。可以從別的地方下載 ,比如 https://fossies.org/linux/misc/zlib-1.2.11.tar.gz/
  2. rewrite 模塊需要 pcre http://www.pcre.org/
  3. ssl 功能需要 openssl http://www.openssl.org/

先約定統一安裝到/usr/local

Centos上安裝依賴無非就是兩種形式

  • 源碼安裝
  • rpm包安裝 (可單獨rpm安裝,自行管理依賴,或者使用yum安裝)

下面分別來說下

爲了方便使用,我上傳到了CSDN上,https://download.csdn.net/download/yangshangwei/11015243 (積分真不是我設置的。。。自動生成的。。。這個有點尷尬)


源碼安裝

以下操作均爲root用戶

pcre

$ cd /usr/local/
$ wget http://nchc.dl.sourceforge.net/project/pcre/pcre/8.36/pcre-8.36.tar.gz
$ tar -zxvf pcre-8.36.tar.gz
$ cd pcre-8.36
$ ./configure 
$ make
$ make install
$ make test

zlib

$ cd /usr/local/ 
# 網站無法訪問了,請下載後上傳到/usr/local再解壓 
# 可以從 https://fossies.org/linux/misc/zlib-1.2.11.tar.gz/  下載
$ --wget http://zlib.net/zlib-1.2.11.tar.gz 
$ tar -zxvf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure
$ make
$ make install
$ make test

openssl

$ cd /usr/local/
$ wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz
$ tar -zxvf openssl-1.0.1j.tar.gz
$ cd openssl-1.0.1j
$ ./config
$ make
$ make install
$ make test


yum安裝

$yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-deve

同樣是可行的,我用這種方式在 192.168.31.56 安裝的nginx ,OK。

在這裏插入圖片描述


安裝nginx

$ cd /usr/local/
$ wget http://nginx.org/download/nginx-1.8.0.tar.gz
$ tar -zxvf nginx-1.8.0.tar.gz
$ cd nginx-1.8.0  
$ ./configure --prefix=/usr/local/nginx 
$ make
$ make install

啓動Nginx

驗證下啓動文件是否正常

[root@artisan sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

啓動nginx

[root@artisan sbin]# /usr/local/nginx/sbin/ngin

如果啓動的時候碰到了如下錯誤

./nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

參考: https://geekflare.com/nginx-error-while-loading-shared-libraries-libpcre-so-1/

執行: export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

在這裏插入圖片描述

再次啓動nginx

[root@artisan sbin]# /usr/local/nginx/sbin/nginx 
[root@artisan sbin]# 

默認80端口,打開瀏覽器訪問ip地址:

在這裏插入圖片描述
安裝並啓動成功。


常用操作命令

重啓:
$ /usr/local/nginx/sbin/nginx -s reload

停止:
$ /usr/local/nginx/sbin/nginx -s stop

測試配置文件是否正常:
$ /usr/local/nginx/sbin/nginx -t

強制關閉:
$ pkill nginx


使用非root用戶啓動nginx

比如我新建了個nginx用戶,用戶組也是nginx,後面想用nginx用戶來啓動nginx.

那麼給nginx的安裝目錄使用chown更改下目錄的所有者及用戶組即可。

[root@artisan sbin]# chown -R  nginx:nginx  /usr/local/ngin

在這裏插入圖片描述

需要注意的是,如果使用了nginx普通用戶啓動,那麼80端口是啓動不了的,報錯如下,需要將nginx的端口調整爲1024以上的端口。

[nginx@artisan sbin]$ ./nginx 
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

修改 /usr/local/nginx/conf/nginx.conf中的listen對應的端口爲8088
在這裏插入圖片描述

訪問 http://192.168.31.66:8088/
在這裏插入圖片描述


搭建應用

在這裏插入圖片描述

Controller寫個方法,供外部訪問用作測試。

在這裏插入圖片描述

應用程序的啓動,我下面是通過啓動腳本指定端口號來進行啓動的,當然了也可以寫幾個配置文件,在啓動腳本中指定特定的配置文件也行,簡單起見就直接指定端口吧


Nginx 做反向代理 + 負載均衡

nginx.conf配置如下,可簡可繁,下面這個是比較簡單的配置

切了個環境,換了IP地址

worker_processes  1;        #啓動進程,通常設置成和cpu的數量相等

#全局錯誤日誌及PID文件
error_log  /usr/local/nginx/logs/error.log;
error_log  /usr/local/nginx/logs/error.log  notice;
error_log  /usr/local/nginx/logs/error.log  info;
pid        /usr/local/nginx/logs/nginx.pid;

# 工作模式及連接數上線
events 
{
    use epoll;            #epoll是多路複用IO(I/O Multiplexing)中的一種方式,但是僅用於linux2.6以上內核,可以大大提高nginx的性能

    worker_connections  1024;    #單個後臺worker process進程的最大併發鏈接數
}

#設定http服務器,反向代理+負載均衡
http 
{
    #添加artisanPool列表 ,對應後臺的server
    upstream artisanPool
    {
       #server tomcat地址:端口號 weight表示權值,權值越大,被分配的機率越大;                 
       server 10.72.38.235:8080 weight=10 max_fails=3 fail_timeout=30s;
       server 10.72.38.235:8081 weight=10 max_fails=3 fail_timeout=30s;
    }
	
	#監聽端口和域名
    server 
    {
        listen       80;    
		# 如果配置了這個,並且在hosts中配置了ip和域名的對應關係 
		# 就可以使用http://artisan/serverInfo訪問 (windows的hosts文件配置了 10.72.38.235    artisan)
        # 可不配
		server_name  artisan;    
    #默認請求設置
    location / {
        proxy_pass http://artisanPool;    #轉向artisanPool處理
		}
	}
}

nginx配置tomcat8及以上的版本時反向代理upstream的名字 不能包含_ ,比如artisan_Pool 就會拋出如上異常


upstream中使用的負載均衡算法

upstream按照默認輪訓(round-robin)方式進行負載,每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。
雖然這種方式簡便,但缺點也很明顯:可靠性低和負載分配不均衡,比較適合適用於圖片服務器集羣和純靜態頁面服務器集羣。

除此之外,upstream支持的分配策略

weight(權重)

指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。如下所示,8081節點的訪問比率要比8080節點的訪問比率高一倍。

upstream artisanPool{

server 10.72.38.235:8080 weight=5;

server 10.72.38.235:8081 weight=10;

}

ip_hash(訪問ip)

每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。

upstream artisanPool{

ip_hash;

server 10.72.38.235:8080;

server 10.72.38.235:8080;

}

fair(需要下載upstream_fair模塊)

按後端服務器的響應時間來分配請求,響應時間短的優先分配。與weight分配策略類似。

upstream artisanPool{

server 10.72.38.235:8080;

server 10.72.38.235:8080;

fair;

}


url_hash(需要使用Nginx的hash軟件包)

按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。

注意:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法。

upstream artisanPool{

server 10.72.38.235:7777;

server 10.72.38.235:8888;

hash $request_uri;

hash_method crc32;

}

upstream模塊中可設置的狀態值

upstream還可以爲每個設備設置狀態值,這些狀態值的含義分別如下:

  • down 表示單前的server暫時不參與負載.

  • weight 默認爲1.weight越大,負載的權重就越大。

  • max_fails :允許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤.

  • fail_timeout : max_fails次失敗後,暫停的時間。

  • backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。

舉例

#定義負載均衡設備的Ip及設備狀態
upstream artisanPool{ 

ip_hash;

server 10.72.38.235:9090 down;

server 10.72.38.235:8080 weight=2;

server 10.72.38.235:6060;

server 10.72.38.235:7070 backup;

}

驗證反向代理和負載均衡

將artisan4Nginx 使用maven打包,上傳到服務器上,使用如下命令啓動兩個進程

java -jar artisan4Nginx-0.0.1-SNAPSHOT.jar --server.port=8080 --logging.file=8080.log > /root/8080.log & tail -f /root/8080.log
java -jar artisan4Nginx-0.0.1-SNAPSHOT.jar --server.port=8081 --logging.file=8081.log > /root/8081.log & tail -f /root/8081.log

啓動nginx後,訪問 http://10.72.38.235/serverInfo

如果hosts文件配置了 10.72.38.235 artisan ,那麼也可以使用 http://artisan/serverInfo 訪問

觀察兩個進程的日誌,因爲在nginx中的策略

   server 10.72.38.235:8080 weight=10 max_fails=3 fail_timeout=30s;
   server 10.72.38.235:8081 weight=10 max_fails=3 fail_timeout=30s;

weight=10相等,所以1 3 5… 次是落在8080上,2 4 6 …次請求是落在8081上

說明反向代理+負載均衡是OK的。


使用keepalived實現Nginx的高可用

安裝keepalived

下載地址: http://www.keepalived.org/download.html

TODO

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