一 nginx簡述html
Nginx是一款輕量級的網頁服務器、反向代理服務器。相較於Apache、lighttpd具備佔有內存少,穩定性高等優點。**它最常的用途是提供反向代理服務。**
- 負載均衡 -
二 安裝nginx步驟(建議下述安裝過程全程root)nginx
0 概數c++
在Centos下,yum源不提供nginx的安裝,能夠經過切換yum源的方法獲取安裝。也能夠經過直接下載安裝包的方法,**如下命令均需root權限執行**:
首先安裝必要的庫(nginx 中gzip模塊須要 zlib 庫,rewrite模塊須要 pcre 庫,ssl 功能須要openssl庫)。選定**/usr/local**爲安裝目錄,如下具體版本號根據實際改變。
1 安裝gcc gcc-c++web
# 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 對不一樣域名實現負載均衡
待補充