一 nginx簡述
Nginx是一款輕量級的網頁服務器、反向代理服務器。相較於Apache、lighttpd具有占有內存少,穩定性高等優勢。**它最常的用途是提供反向代理服務。**
- 負載均衡 -
二 安裝nginx步驟(建議下述安裝過程全程root)
0 概數
在Centos下,yum源不提供nginx的安裝,可以通過切換yum源的方法獲取安裝。也可以通過直接下載安裝包的方法,**以下命令均需root權限執行**:
首先安裝必要的庫(nginx 中gzip模塊需要 zlib 庫,rewrite模塊需要 pcre 庫,ssl 功能需要openssl庫)。選定**/usr/local**為安裝目錄,以下具體版本號根據實際改變。
1 安裝gcc gcc-c++
# yum install -y gcc gcc-c++
2 安裝PCRE庫
# cd /usr/local/ # wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz # tar -zxvf pcre-8.33.tar.gz # cd pcre-8.33 # ./configure # make && make install
3 安裝SSL庫
# cd /usr/local/ # wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1j.tar.gz # tar -zxvf openssl-1.0.1j.tar.gz # cd openssl-1.0.1j # ./config # make && make install
4 安裝zlib庫
# cd /usr/local/ # 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
5 安裝nginx(本安裝為1.8.0版本)
# 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 --user=nobody --group=nobody --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-http_sub_module --with-http_ssl_module --with-pcre=/usr/local/pcre-8.33 --with-zlib=/usr/local/zlib-1.2.11 (注: --with-http_ssl_module:這個不加后面在nginx.conf配置ssl:on后,啟動會報nginx: [emerg] unknown directive "ssl" in /opt/nginx/conf/nginx.conf 異常) # make && make install
三 nginx操作命令
1 啟動nginx服務
# /usr/local/nginx/sbin/nginx
2 重啟nginx服務
# /usr/local/nginx/sbin/nginx –s reload
3 停止nginx服務
# /usr/local/nginx/sbin/nginx –s stop
4 強制關閉nginx服務
# pkill nginx
四 nginx正反向代理基本配置

#nginx配置 #user nobody; worker_processes 1; #服務器並發處理服務關鍵配置 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; #最大連接數為 1024. } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; include mime.types; default_type application/octet-stream; sendfile on; tcp_nopush on; keepalive_timeout 65; #gzip on; #http頭壓縮 #正向代理配置 server { listen 8080; # 代理監聽端口 resolver 223.5.5.5; #代理DNS配置 #charset koi8-r; access_log /home/lich/logs/fproxy.access.log; #accesslog輸出路徑 error_log /home/lich/logs/fproxy.error.log; #errorlog輸出路徑 location / { proxy_pass $scheme://$host$request_uri; # 配置正向代理參數 proxy_set_header Host $http_host; # 解決如果URL中帶"."后Nginx 503錯誤 proxy_buffers 256 4k; # 配置緩存大小 proxy_max_temp_file_size 0; # 關閉磁盤緩存讀寫減少I/O proxy_connect_timeout 30; # 代理連接超時時間 # 配置代理服務器HTTP狀態緩存時間 proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m; } } #反向代理配置 server { listen 80; server_name test.fw.com; #代理轉發域名配置 access_log /home/lich/logs/rproxy.access.log; error_log /home/lich/logs/rproxy.error.log; location / { proxy_pass http://10.60.221.22:8001; #代理到后段實際應用服務器地址 index index.html index.htm index.jsp; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
五 nginx配置參數介紹
1 listen
1.1 配置監聽的ip地址
listen address[:port] [default_server][setfib=number][backlog=number][rcvbuf=size][sndbuf=size][deferred][accept_filter=filter][bind][ssl];
1.2 配置監聽端口
listen port[default_server] [setfib=number][backlog=number][rcvbuf=size][sndbuf=size][accept_filter=filter][deferred][bind][ipv6only=on|off][ssl];
1.3 配置Unix Domain Socket
listen unix:path [default_server][backlog=number][rcvbuf=size][sndbuf=size][accept_filter=filter][deferred][bind][ssl];
1.4 監聽配置用法
listen *:80 | *:8080 #監聽所有80端口和8080端口 listen IP_address:port #監聽指定的地址和端口號 listen IP_address #監聽指定ip地址所有端口 listen port #監聽該端口的所有IP連接
1.5 參數解釋

- address:IP地址,如果是 IPV6地址,需要使用中括號[] 括起來,比如[fe80::1]等。 - port:端口號,如果只定義了IP地址,沒有定義端口號,那么就使用80端口。 - path:socket文件路徑,如 var/run/nginx.sock等。 - default_server:標識符,將此虛擬主機設置為 address:port 的默認主機。(在 nginx-0.8.21之前使用的是default指令) - setfib=number:Nginx-0.8.44 中使用這個變量監聽 socket 關聯路由表,目前只對 FreeBSD 起作用,不常用。 - backlog=number:設置監聽函數listen()最多允許多少網絡連接同時處於掛起狀態,在 FreeBSD 中默認為 -1,其他平台默認為511. - rcvbuf=size:設置監聽socket接收緩存區大小。 - sndbuf=size:設置監聽socket發送緩存區大小。 - deferred:標識符,將accept()設置為Deferred模式。 - accept_filter=filter:設置監聽端口對所有請求進行過濾,被過濾的內容不能被接收和處理,本指令只在 FreeBSD 和 NetBSD 5.0+ 平台下有效。filter 可以設置為 dataready 或 httpready 。 - bind:標識符,使用獨立的bind() 處理此address:port,一般情況下,對於端口相同而IP地址不同的多個連接,Nginx 服務器將只使用一個監聽指令,並使用 bind() 處理端口相同的所有連接。 - ssl:標識符,設置會話連接使用 SSL模式進行,此標識符和Nginx服務器提供的 HTTPS 服務有關。
2 server_name
該指令用於虛擬主機的配置。通常分為以下兩種
2.1 基於名稱的虛擬主機配置

- 語法格式如下: # server_name name ...; - 對於name 來說,可以只有一個名稱,也可以有多個名稱,中間用空格隔開。而每個名字由兩段或者三段組成,每段之間用“.”隔開。 # server_name 123.com www.123.com - 可以使用通配符“*”,但通配符只能用在由三段字符組成的首段或者尾端,或者由兩端字符組成的尾端。 # server_name *.123.com www.123.* - 還可以使用正則表達式,用“~”作為正則表達式字符串的開始標記。 # server_name ~^www\d+\.123\.com$; #該表達式“~”表示匹配正則表達式,以www開頭(“^”表示開頭),緊跟着一個0~9之間的數字,在緊跟“.123.co”,最后跟着“m”($表示結尾)以上匹配的順序優先級如下: ①、准確匹配 server_name ②、通配符在開始時匹配 server_name 成功 ③、通配符在結尾時匹配 server_name 成功 ④、正則表達式匹配 server_name 成功
2.2 基於IP地址的虛擬主機配置
#語法結構和基於域名匹配一樣,而且不需要考慮通配符和正則表達式的問題。 server_name 192.168.1.1
3 location
# 該指令用於匹配 URL
location [ = | ~ | ~* | ^~] uri { } = :用於不含正則表達式的 uri 前,要求請求字符串與 uri 嚴格匹配,如果匹配成功,就停止繼續向下搜索並立即處理該請求。 ~ :用於表示 uri 包含正則表達式,並且區分大小寫。 ~* :用於表示 uri 包含正則表達式,並且不區分大小寫。 ^~ :用於不含正則表達式的 uri 前,要求 Nginx 服務器找到標識 uri 和請求字符串匹配度最高的 location 后,立即使用此 location 處理請求,而不再使用 location 塊中的正則 uri 和請求字符串做匹配。 注意:如果 uri 包含正則表達式,則必須要有 ~ 或者 ~* 標識。
4 proxy_pass
# 該指令用於設置被代理服務器的地址。可以是主機名稱、IP地址加端口號的形式
proxy_pass URL; # URL 為被代理服務器的地址,可以包含傳輸協議、主機名稱或IP地址加端口號,URI等。 proxy_pass http://www.123.com/uri;
5 index
# 該指令用於設置網站的默認首頁。
index filename ...; # 后面的文件名稱可以有多個,中間用空格隔開。 index index.html index.jsp; ps:通常該指令有兩個作用:第一個是用戶在請求訪問網站時,請求地址可以不寫首頁名稱;第二個是可以對一個請求,根據請求內容而設置不同的首頁。
六 ngxin負載均衡
1 輪詢算法負載均衡

upstream OrdinaryPolling { server 192.168.1.100:8081; server 192.168.1.100:8082; } server { listen 80; server_name test.fw.com; access_log /home/lich/logs/rproxy_slb.access.log; error_log /home/lich/logs/rproxy_slb.error.log; location / { proxy_pass http://OrdinaryPolling; index index.html index.htm index.jsp; # deny ip # allow ip } }
2 基於比例加權輪詢負載均衡

upstream OrdinaryPolling { server 10.60.220.60:8081 weight=2; server 10.60.220.60:8082 weight=5; } server { listen 80; server_name test.fw.com; access_log /home/lich/logs/rproxy_slb.access.log; error_log /home/lich/logs/rproxy_slb.error.log; location / { proxy_pass http://OrdinaryPolling; # index index.html index.htm index.jsp; # deny ip # allow ip } }
3 基於IP路由負載均衡
場景解釋:我們知道一個請求在經過一個服務器處理時,服務器會保存相關的會話信息,比如session,但是該請求如果第一個服務器沒處理完,通過nginx輪詢到第二個服務器上,那么這個服務器是沒有會話信息的。
最典型的一個例子:用戶第一次進入一個系統是需要進行登錄身份驗證的,首先將請求跳轉到web1應用服務器進行處理,登錄信息是保存在web1應用服務器上的,這時候需要進行別的操作,那么可能會將請求輪詢到web2應用服務器上,那么由於 web2沒有保存會話信息,web2服務器會以為該用戶沒有登錄,然后繼續登錄一次,如果有多個服務器,每次第一次訪問都要進行登錄,這顯然是很影響用戶體驗的。
這里產生的一個問題也就是集群環境下的 session 共享,如何解決這個問題? 通常由兩種方法: 1、第一種方法是選擇一個中間件,將登錄信息保存在一個中間件上,這個中間件可以為 Redis 這樣的數據庫。那么第一次登錄,我們將session 信息保存在 Redis 中,跳轉到第二個服務器時,我們可以先去Redis上查詢是否有登錄信息,如果有,就能直接進行登錄之后的操作了,而不用進行重復登錄。 2、第二種方法是根據客戶端的IP地址划分,每次都將同一個 IP 地址發送的請求都分發到同一個 Tomcat 服務器,那么也不會存在 session 共享的問題。
而 nginx 的基於 IP 路由負載的機制就是上訴第二種形式。大概配置如下:

upstream OrdinaryPolling { server 10.60.220.60:8081 weight=2; server 10.60.220.60:8082 weight=5; ip_hash; } server { listen 80; server_name test.fw.com; access_log /home/lich/logs/rproxy_slb.access.log; error_log /home/lich/logs/rproxy_slb.error.log; location / { proxy_pass http://OrdinaryPolling; # index index.html index.htm index.jsp; # deny ip # allow ip } }
注意:我們在 upstream 指令塊中增加了 ip_hash 指令。該指令就是告訴 nginx 服務器,同一個 IP 地址客戶端發送的請求都將分發到同一個 Tomcat 服務器進行處理。
4 基於服務器響應時間負載均衡
根據服務器處理請求的時間來進行負載,處理請求越快,也就是響應時間越短的優先分配。

upstream OrdinaryPolling { server 10.60.220.60:8081 weight=2; server 10.60.220.60:8082 weight=5; fair; } server { listen 80; server_name test.fw.com; access_log /home/lich/logs/rproxy_slb.access.log; error_log /home/lich/logs/rproxy_slb.error.log; location / { proxy_pass http://OrdinaryPolling; # index index.html index.htm index.jsp; # deny ip # allow ip } }
5 對不同域名實現負載均衡
待補充