一、nginx的安裝javascript
二、Nginx配置虛擬機php
三、Nginx實現反向代理css
四、Nginx實現負載均衡 html
Nginx是一款高性能的http 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。由俄羅斯的程序設計師Igor Sysoev所開發,官方測試nginx可以支支撐5萬併發連接,而且cpu、內存等資源消耗卻很是低,運行很是穩定。java
一、http服務器。Nginx是一個http服務能夠獨立提供http服務。能夠作網頁靜態服務器。【root】node
二、虛擬主機。能夠實如今一臺服務器虛擬出多個網站。例如我的網站使用的虛擬主機。【一個server節點就是一個虛擬主機】linux
三、反向代理,負載均衡。當網站的訪問量達到必定程度後,單臺服務器不能知足用戶的請求時,須要用多臺服務器集羣可使用nginx作反向代理。而且多臺服務器能夠平均分擔負載,不會由於某臺服務器負載高宕機而某臺服務器閒置的狀況。【upstream proxy_pass】nginx
下載nginx:c++
官方網站:web
使用的版本是1.8.0版本。
Nginx提供的源碼。
一、須要安裝gcc的環境。yum install gcc-c++
二、第三方的開發包。
PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 兼容的正則表達式庫。nginx的http模塊使用pcre來解析正則表達式,因此須要在linux上安裝pcre庫。
yum install -y pcre pcre-devel
注:pcre-devel是使用pcre開發的一個二次開發庫。nginx也須要此庫。
zlib庫提供了不少種壓縮和解壓縮的方式,nginx使用zlib對http包的內容進行gzip,因此須要在linux上安裝zlib庫。
yum install -y zlib zlib-devel
OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、經常使用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。
nginx不只支持http協議,還支持https(即在ssl協議上傳輸http),因此須要在linux安裝openssl庫。
yum install -y openssl openssl-devel
第一步:把nginx的源碼包上傳到linux系統
第二步:解壓縮
[root@localhost ~]# tar zxf nginx-1.8.0.tar.gz
第三步:使用configure命令建立一makeFile文件。
./configure \ --prefix=/usr/local/nginx \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/temp/nginx/client \ --http-proxy-temp-path=/var/temp/nginx/proxy \ --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \ --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \ --http-scgi-temp-path=/var/temp/nginx/scgi
注意:啓動nginx以前,上邊將臨時文件目錄指定爲/var/temp/nginx,須要在/var下建立temp及nginx目錄
[root@localhost sbin]# mkdir /var/temp/nginx/client -p
第四步:make
第五步:make install
進入sbin目錄,nginx的啓動能夠直接執行nginx的bin文件, 當nginx啓動後,能夠經過-s 參數來控制nginx
[root@localhost sbin]# ./nginx
nginx -s reload #從新加載配置文件 nginx -s reopen #從新打開log文件 nginx -s stop #快速關閉nginx服務 nginx -s quit #優雅的關閉nginx服務,等待工做進程處理完全部的請求
[root@localhost sbin]# ./nginx -s stop
推薦使用:
[root@localhost sbin]# ./nginx -s quit
kill 進程號【正常關閉】
kill -9 進程號【暴力關閉】
一、先關閉後啓動。
二、修改了Nginx的配置文件後,在不用重啓Nginx的時候,能夠用以下命令刷新配置文件:
[root@localhost sbin]# ./nginx -s reload
Nginx從新加載配置文件的過程:主進程接受到加載信號後:
在第二步,舊的工做進程收到終止信號後,會中止接收新的鏈接請求,知道全部現有的請求處理完,而後退出。
默認是80端口。
注意:是否關閉防火牆。
Nginx進程模型:1個主進程,n個工做進程,主進程負責配置和工做進程的管理,實際的請求由工做進程進行處理。Nginx是基於事件驅動和多路複用的工做模型。
nginx conf文件結構介紹以及相關配置:
https://blog.csdn.net/anonymalias/article/details/50950910
nginx的配置由特定的標識符(指令符)分爲多個不一樣的模塊。
指令符分爲簡單指令和塊指令。
conf文件中,全部不屬於塊指令的簡單指令都屬於main上下文的,http塊指令屬於main上下文,server塊指令http上下文。
... #全局塊 events { #events塊 ... } http #http塊 { ... #http全局塊 server #server塊 { ... #server全局塊 location [PATTERN] #location塊 { ... } location [PATTERN] { ... } } server { ... } ... #http全局塊 }
一、全局塊:配置影響nginx全局的指令。通常有運行nginx服務器的用戶組,nginx進程pid存放路徑,日誌存放路徑,配置文件引入,容許生成worker process數等。
二、events塊:配置影響nginx服務器或與用戶的網絡鏈接。有每一個進程的最大鏈接數,選取哪一種事件驅動模型處理鏈接請求,是否容許同時接受多個網路鏈接,開啓多個網絡鏈接序列化等。
三、http塊:能夠嵌套多個server,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日誌自定義,是否使用sendfile傳輸文件,鏈接超時時間,單鏈接請求數等。
四、server塊:配置虛擬主機的相關參數,一個http中能夠有多個server。
五、location塊:配置請求的路由,以及各類頁面的處理狀況。
一個例子:
########### 每一個指令必須有分號結束。################# #user administrator administrators; #配置用戶或者組,默認爲nobody nobody。 #worker_processes 2; #容許生成的進程數,默認爲1 #pid /nginx/pid/nginx.pid; #指定nginx進程運行文件存放地址 error_log log/error.log debug; #制定日誌路徑,級別。這個設置能夠放入全局塊,http塊,server塊,級別以此爲:debug|info|notice|warn|error|crit|alert|emerg events { accept_mutex on; #設置網路鏈接序列化,防止驚羣現象發生,默認爲on multi_accept on; #設置一個進程是否同時接受多個網絡鏈接,默認爲off #use epoll; #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport worker_connections 1024; #最大鏈接數,默認爲512 } http { include mime.types; #文件擴展名與文件類型映射表 default_type application/octet-stream; #默認文件類型,默認爲text/plain #access_log off; #取消服務日誌 log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式 access_log log/access.log myFormat; #combined爲日誌格式的默認值 sendfile on; #容許sendfile方式傳輸文件,默認爲off,能夠在http塊,server塊,location塊。 sendfile_max_chunk 100k; #每一個進程每次調用傳輸數量不能大於設定的值,默認爲0,即不設上限。 keepalive_timeout 65; #鏈接超時時間,默認爲75s,能夠在http,server,location塊。 upstream mysvr { server 127.0.0.1:7878; server 192.168.10.121:3333 backup; #熱備 } error_page 404 https://www.baidu.com; #錯誤頁 server { keepalive_requests 120; #單鏈接請求上限次數。 listen 4545; #監聽端口 server_name 127.0.0.1; #監聽地址 location ~*^.+$ { #請求的url過濾,正則匹配,~爲區分大小寫,~*爲不區分大小寫。 #root path; #根目錄 #index vv.txt; #設置默認頁 proxy_pass http://mysvr; #請求轉向mysvr 定義的服務器列表 deny 127.0.0.1; #拒絕的ip allow 172.18.5.54; #容許的ip } } }
Nginx配置詳解 http://www.javashuo.com/article/p-xkijqyyb-hr.html
完整的基本配置文件以下:
#運行用戶 user www-data; #啓動進程,一般設置成和cpu的數量相等 worker_processes 1; #全局錯誤日誌及PID文件 error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; #工做模式及鏈接數上限 events { use epoll; #epoll是多路複用IO(I/O Multiplexing)中的一種方式,可是僅用於linux2.6以上內核,能夠大大提升nginx的性能 worker_connections 1024;#單個後臺worker process進程的最大併發連接數 # multi_accept on; } #設定http服務器,利用它的反向代理功能提供負載均衡支持 http { #設定mime類型,類型由mime.type文件定義 include /etc/nginx/mime.types; default_type application/octet-stream; #設定日誌格式 access_log /var/log/nginx/access.log; #sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用, #必須設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲 off,以平衡磁盤與網絡I/O處理速度,下降系統的uptime. sendfile on; #tcp_nopush on; #鏈接超時時間 #keepalive_timeout 0; keepalive_timeout 65; tcp_nodelay on; #開啓gzip壓縮 gzip on; gzip_disable "MSIE [1-6]\.(?!.*SV1)"; #設定請求緩衝 client_header_buffer_size 1k; large_client_header_buffers 4 4k; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; #設定負載均衡的服務器列表 upstream mysvr { #weigth參數表示權值,權值越高被分配到的概率越大 #本機上的Squid開啓3128端口 server 192.168.8.1:3128 weight=5; server 192.168.8.2:80 weight=1; server 192.168.8.3:80 weight=6; } server { #偵聽80端口 listen 80; #定義使用www.xx.com訪問 server_name www.xx.com; #設定本虛擬主機的訪問日誌 access_log logs/www.xx.com.access.log main; #默認請求 location / { root /root; #定義服務器的默認網站根目錄位置 index index.php index.html index.htm; #定義首頁索引文件的名稱 fastcgi_pass www.xx.com; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; include /etc/nginx/fastcgi_params; } # 定義錯誤提示頁面 error_page 500 502 503 504 /50x.html; location = /50x.html { root /root; } #靜態文件,nginx本身處理 location ~ ^/(images|javascript|js|css|flash|media|static)/ { root /var/www/virtual/htdocs; #過時30天,靜態文件不怎麼更新,過時能夠設大一點,若是頻繁更新,則能夠設置得小一點。 expires 30d; } #PHP 腳本請求所有轉發到 FastCGI處理. 使用FastCGI默認配置. location ~ \.php$ { root /root; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name; include fastcgi_params; } #設定查看Nginx狀態的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file conf/htpasswd; } #禁止訪問 .htxxx 文件 location ~ /\.ht { deny all; } } }
以上是一些基本的配置,使用Nginx最大的好處就是負載均衡
若是要使用負載均衡的話,能夠修改配置http節點以下:
#設定http服務器,利用它的反向代理功能提供負載均衡支持 http { #設定mime類型,類型由mime.type文件定義 include /etc/nginx/mime.types; default_type application/octet-stream; #設定日誌格式 access_log /var/log/nginx/access.log; #省略上文有的一些配置節點 #。。。。。。。。。。 #設定負載均衡的服務器列表 upstream mysvr { #weigth參數表示權值,權值越高被分配到的概率越大 server 192.168.8.1x:3128 weight=5;#本機上的Squid開啓3128端口 server 192.168.8.2x:80 weight=1; server 192.168.8.3x:80 weight=6; } upstream mysvr2 { #weigth參數表示權值,權值越高被分配到的概率越大 server 192.168.8.x:80 weight=1; server 192.168.8.x:80 weight=6; } #第一個虛擬服務器 server { #偵聽192.168.8.x的80端口 listen 80; server_name 192.168.8.x; #對aspx後綴的進行負載均衡請求 location ~ .*\.aspx$ { root /root; #定義服務器的默認網站根目錄位置 index index.php index.html index.htm; #定義首頁索引文件的名稱 proxy_pass http://mysvr ;#請求轉向mysvr 定義的服務器列表 #如下是一些反向代理的配置可刪除. proxy_redirect off; #後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; #容許客戶端請求的最大單文件字節數 client_body_buffer_size 128k; #緩衝區代理緩衝用戶端請求的最大字節數, proxy_connect_timeout 90; #nginx跟後端服務器鏈接超時時間(代理鏈接超時) proxy_send_timeout 90; #後端服務器數據回傳時間(代理髮送超時) proxy_read_timeout 90; #鏈接成功後,後端服務器響應時間(代理接收超時) proxy_buffer_size 4k; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小 proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k如下的話,這樣設置 proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #設定緩存文件夾大小,大於這個值,將從upstream服務器傳 } } }
一般狀況下,conf文件存在多個server塊,一個server就是一個虛擬主機,經過listen的端口(默認是80端口)和server_name進行區分, 對不一樣的請求提供不一樣的服務,以下:
server { listen 80; server_name a.example.org; ... }
listen指令的參數:能夠是ip, hostname, ip/hostname:port, port, UNIX-domain socket.例如:
listen 127.0.0.1:8000;listen 127.0.0.1;listen 8000;listen *:8000;listen localhost:8000; listen unix:/var/run/nginx.sock;
server塊內部的listen和server_name不能和其餘server塊的徹底相同,不然啓動加載配置的時候會出錯:
當nginx決定了哪個server處理客戶端請求後,nginx會解析request header中URI(這裏以及後面提到的大部分都是指相對URI),而後匹配server塊中的location指令的參數,匹配規則下一節會介紹。例以下例:
server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } }
location塊指令會用其參數與客戶端請求的URI進行匹配,匹配的URI請求會被定向到root指令定義的特殊本地文件系統目錄中,重定向規則爲:將URI添加到root參數後面,生成一個本地文件路徑,即:root參數 + URI請求。這裏示例參數」/」會匹配全部的請求,通常都會默認存在。示例定位後的目錄爲html/,默認是定位到安裝目錄的路徑下的html/(相對路徑)。這裏location塊指令內部的兩個簡單指令的含義是:
默認的在nginx安裝目錄下都會存在一個html目標,在我電腦中爲:/usr/local/nginx-1.8.0/html, 而後裏面存在默認的nignx的歡迎界面,例如我安裝nginx後直接啓動nginx bin文件,而後訪問對應的域名就獲得了以下的頁面:
若是有多個location指令塊匹配到,nginx的選擇策略是the longest prefix最長前綴匹配原則。
例如,當上述的server中再增長一個location塊,匹配參數爲」/htdocs/」,重定向的資源路徑爲以下配置,
server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } location /htdocs { root /home/anonymalias; index index.html; } }
當訪問http://anonymalias.oicp.net:8008/htdocs/,就會匹配到/home/anonymalias/htdocs/index.html
nginx的location指令是配置的核心,用於匹配client請求uri的path部分,而後對不一樣的請求提供不一樣的靜態內容,或者經過反向代理重定向到內部的server。
對於client的request, nginx會進行預處理,nginx首先對採用 ’%XX’(uri採用%+十六進制格式用於在瀏覽器和插件中顯示非標準的字母和字符) 格式文本編碼的uri進行解碼。而後處理path中的相對路徑符號’.’和‘..’,而後對於含有兩個及以上的’/’壓縮成一個’/’。 這樣處理完後會獲得一個乾淨的path,而後會用這個path會在server的location指令的參數進行匹配。
location 語法: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... }
location指令的參數:
location ~* \.(gif|jpg|jpeg)$ { [ configuration A ] } location ~ \.(gif|jpg|jpeg)$ { [ configuration B ] }
若請求URI爲/images/a.JPG,只能匹配A。
location匹配的過程:
1. 首先nginx會把request的uri在location正常字符串參數中匹配出符合的最長字符串,並保存這個結果;
2. 若是最長前綴匹配結果前面有 」^~」修飾符,那麼中止繼續搜索;
3. 若是最長匹配結果前有」=」修飾符,也會中止繼續搜索;
4. 接下來,去匹配參數爲正則表達式的全部location,根據location的配置順序,在匹配到第一個正則表達式時,即中止搜索其餘的正則表達式;
因此如官網上的下例:
location = / { [ configuration A ] } location / { [ configuration B ] } location /documents/ { [ configuration C ] } location ^~ /images/ { [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { [ configuration E ] }
關鍵配置:root
Web server很重要一部分工做就是提供靜態頁面的訪問(作http服務器,提供服務),例如images, html page。nginx能夠經過不一樣的配置,根據request請求,從本地的目錄(有root指定,當配置了proxy_pass代理時候,nginx將再也不直接提供服務,而只作請求轉發)提供不一樣的文件返回給客戶端。
打開安裝目錄下的nginx.conf文件,默認配置文件已經在http指令塊中建立了一個空的server塊,在nginx-1.8.0中的http塊中已經建立了一個默認的server塊。內容以下:
server {
listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
就是在一臺服務器啓動多個網站。一個server就是一個虛擬主機。
如何區分不一樣的網站:
一、域名不一樣
二、端口不一樣
Nginx的配置文件:
/usr/local/nginx/conf/nginx.conf
#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; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; #一個server節點就是一個虛擬主機 server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { #Html是nginx安裝目錄下的html目錄(靜態頁面存放的位置,也可使用絕對路徑) root html; index index.html index.htm; } } }
能夠配置多個server,配置了多個虛擬主機。
添加虛擬主機:
#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; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost;(域名) #charset koi8-r; #access_log logs/host.access.log main; Location / { root html; index index.html index.htm; } } server { listen 81; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-81; index index.html index.htm; } } }
從新加載配置文件
[root@localhost nginx]# sbin/nginx -s reload
域名就是網站。
Tcp/ip
Dns服務器:把域名解析爲ip地址。保存的就是域名和ip的映射關係。
一級域名:
Baidu.com
Taobao.com
Jd.com
二級域名:
Image.baidu.com
Item.baidu.com
三級域名:
1.Image.baidu.com
Aaa.image.baidu.com
一個域名對應一個ip地址,一個ip地址能夠被多個域名綁定。
本地測試能夠修改hosts文件。
修改window的hosts文件:(C:\Windows\System32\drivers\etc)
能夠配置域名和ip的映射關係,若是hosts文件中配置了域名和ip的對應關係,不須要走dns服務器。
#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; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } } server { listen 81; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-81; index index.html index.htm; } } server { listen 80; server_name www.taobao.com; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-taobao; index index.html index.htm; } } server { listen 80; server_name www.baidu.com; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-baidu; index index.html index.htm; } } }
域名的配置:
192.168.25.148 www.taobao.com
192.168.25.148 www.baidu.com
Nginx代理功能與負載均衡詳解:
http://www.javashuo.com/article/p-xkijqyyb-hr.html
http://www.cnblogs.com/knowledgesea/p/5199046.html
正向代理
(代理客戶端)接收到客戶端,替代客戶端去完成上網,將得到的結果返回給客戶端。
反向代理:(代理服務端)
反向代理服務器決定哪臺服務器提供服務。
返回代理服務器不提供服務器。只是請求的轉發。
Nginx在作反向代理時,提供性能穩定,而且可以提供配置靈活的轉發功能。Nginx能夠根據不一樣的正則匹配,採起不一樣的轉發策略,好比圖片文件結尾的走文件服務器,動態頁面走web服務器,只要你正則寫的沒問題,又有相對應的服務器解決方案,你就能夠爲所欲爲的玩。而且Nginx對返回結果進行錯誤頁跳轉,異常判斷等。若是被分發的服務器存在異常,他能夠將請求從新轉發給另一臺服務器,而後自動去除異常服務器。
下面是nginx官方最簡單的一個proxy server的配置示例:
server { location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
配置的含義:全部URI中以.gif, .jpg, .png結尾的請求都會被映射到/data/images本地磁盤目錄,把全部其餘的URI請求都傳給配置的被代理的server: http://localhost:8080/。
該指令是反向代理的基本指令,用於設置代理服務器的協議和地址;對於一個client的請求,proxy_pass指令經過如下方式進行uri的轉發:
語法:proxy_pass_header field
field參數是http全部的header名字,具體能夠參考: [HTTP/1.1協議][1] P100 chapter14關於HTTP協議全部header field的定義。
語法:proxy_set_header field value;
該指令用於將client傳遞給proxy server的request header從新定義或者添加字段。Value能夠是文本,變量和二者結合。
若是set 的header field的值爲空,那麼這個header是不會傳遞給proxy server的
兩個域名指向同一臺nginx服務器,用戶訪問不一樣的域名顯示不一樣的網頁內容。
兩個域名是www.sian.com.cn和www.sohu.com
nginx服務器使用虛擬機192.168.25.148
第一步:安裝兩個tomcat,分別運行在8080和8081端口。
第二步:啓動兩個tomcat。
第三步:反向代理服務器的配置
複製一個server節點,將root改爲proxy_pass,配置了proxy_pass以後服務器不提供服務器,只是請求的轉發。
配置upstream
upstream tomcat1 { server 192.168.25.148:8080; } server { listen 80; server_name www.sina.com.cn;
#charset koi8-r;
#access_log logs/host.access.log main;
location / { proxy_pass http://tomcat1; index index.html index.htm; } } upstream tomcat2 { server 192.168.25.148:8081; } server { listen 80; server_name www.sohu.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / { proxy_pass http://tomcat2; index index.html index.htm; } } |
第四步:nginx從新加載配置文件
第五步:配置域名
在hosts文件中添加域名和ip的映射關係
192.168.25.148 www.sina.com.cn
192.168.25.148 www.sohu.com
若是一個服務由多臺服務器提供,須要把負載分配到不一樣的服務器處理,須要負載均衡。
Nginx提供的負載均衡策略有2種:內置策略和擴展策略。內置策略爲輪詢,加權輪詢,Ip hash。擴展策略,就天馬行空,只有你想不到的沒有他作不到的。
upstream tomcat2 {
server 192.168.25.148:8081;
server 192.168.25.148:8082;
}
能夠根據服務器的實際狀況調整服務器權重weight。權重越高分配的請求越多,權重越低,請求越少。默認是都是1,是輪詢機制。
upstream tomcat2 { server 192.168.25.148:8081; server 192.168.25.148:8082 weight=2; } |
要實現nginx的高可用,須要實現備份機。
nginx做爲負載均衡器,全部請求都到了nginx(對外服務的惟一入口,惟一公網IP),可見nginx處於很是重點的位置,若是nginx服務器宕機後端web服務將沒法提供服務,影響嚴重。
爲了屏蔽負載均衡服務器的宕機,須要創建一個備份機。主服務器和備份機上都運行高可用(High Availability)監控程序,經過傳送諸如「I am alive」這樣的信息來監控對方的運行情況。當備份機不能在必定的時間內收到這樣的信息時,它就接管主服務器的服務IP並繼續提供負載均衡服務;當備份管理器又從主管理器收到「I am alive」這樣的信息時,它就釋放服務IP地址,這樣的主服務器就開始再次提供負載均衡服務。
一般說的雙機熱備是指兩臺機器都在運行,但並非兩臺機器都同時在提供服務。
當提供服務的一臺出現故障的時候,另一臺會立刻自動接管而且提供服務,並且切換的時間很是短。
keepalived是集羣管理中保證集羣高可用的一個服務軟件,用來防止單點故障。
Keepalived的做用是檢測web服務器的狀態(健康監測),若是有一臺web服務器死機,或工做出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工做正常後Keepalived自動將web服務器加入到服務器羣中,這些工做所有自動完成,不須要人工干涉,須要人工作的只是修復故障的web服務器。
keepalived是以VRRP協議爲實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。
虛擬路由冗餘協議,能夠認爲是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的vip(VIP = Virtual IP Address,虛擬IP地址,該路由器所在局域網內其餘機器的默認路由爲該vip),master會發組播,當backup收不到VRRP包時就認爲master宕掉了,這時就須要根據VRRP的優先級來選舉一個backup當master。這樣的話就能夠保證路由器的高可用了。
keepalived主要有三個模塊,分別是core、check和VRRP。core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各類檢查方式。VRRP模塊是來實現VRRP協議的。
詳細參考:Keepalived權威指南中文.pdf
nginx和keepalived實現nginx高可用:
https://blog.csdn.net/u012453843/article/details/69668663
初始時候,nginx主服務器正常,將vip綁定到自身,對外提供服務,從服務器始終與主服務器保持通訊,監測主服務器的健康狀態。
當nginx主服務器宕機或發生異常,總之以任何理由形成服務器上的健康監測程序發生異常,沒法和從服務器上的健康監測程序通訊,此時從服務器上的健康監測機制就會認爲主服務器掛了,從而將vip綁定到自身,成功上位,充當主服務器的角色。
在keepalive機制中,主服務器終究是主服務器,一旦主服務器恢復,邊重新綁定vip,繼續充當主服務器,而從服務器又成爲了熱備。
兩臺nginx,一主一備:192.168.101.3和192.168.101.4
兩臺tomcat服務器:192.168.101.五、192.168.101.6
一、分別在主備nginx上安裝keepalived,參考「安裝筆記」進行安裝:
二、Keepalived安裝與配置:
https://blog.csdn.net/xyang81/article/details/52554398
修改主和備nginx服務器上的keepalived 配置文件 /etc/keepalived/keepalived.conf 文件
修改主nginx下/etc/keepalived/keepalived.conf文件
! Configuration File for keepalived #全局配置 global_defs { notification_email { #指定keepalived在發生切換時須要發送email到的對象,一行一個 XXX@XXX.com } notification_email_from XXX@XXX.com #指定發件人 #smtp_server XXX.smtp.com #指定smtp服務器地址 #smtp_connect_timeout 30 #指定smtp鏈接超時時間 router_id LVS_DEVEL #運行keepalived機器的一個標識 } vrrp_instance VI_1 { state MASTER #標示狀態爲MASTER 備份機爲BACKUP interface eth0 #設置實例綁定的網卡 virtual_router_id 51 #同一實例下virtual_router_id必須相同 priority 100 #MASTER權重要高於BACKUP 好比BACKUP爲99 advert_int 1 #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒 authentication { #設置認證 auth_type PASS #主從服務器驗證方式 auth_pass 8888 } virtual_ipaddress { #設置vip 192.168.101.100 #能夠多個虛擬IP,換行便可 } }
修改備nginx下/etc/keepalived/keepalived.conf文件
配置備nginx時須要注意:須要修改state爲BACKUP , priority比MASTER低,virtual_router_id和master的值一致
! Configuration File for keepalived #全局配置 global_defs { notification_email { #指定keepalived在發生切換時須要發送email到的對象,一行一個 XXX@XXX.com } notification_email_from XXX@XXX.com #指定發件人 #smtp_server XXX.smtp.com #指定smtp服務器地址 #smtp_connect_timeout 30 #指定smtp鏈接超時時間 router_id LVS_DEVEL #運行keepalived機器的一個標識 } vrrp_instance VI_1 { state BACKUP #標示狀態爲MASTER 備份機爲BACKUP interface eth0 #設置實例綁定的網卡 virtual_router_id 51 #同一實例下virtual_router_id必須相同 priority 99 #MASTER權重要高於BACKUP 好比BACKUP爲99 advert_int 1 #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒 authentication { #設置認證 auth_type PASS #主從服務器驗證方式 auth_pass 8888 } virtual_ipaddress { #設置vip 192.168.101.100 #能夠多個虛擬IP,換行便可 } }
主備nginx都啓動keepalived及nginx。
service keepalived start
./nginx
查看主nginx的eth0設置:
vip綁定在主nginx的eth0上。
查看備nginx的eth0設置:
vip沒有綁定在備nginx的eth0上。
訪問ccc.test.com,能夠訪問。
將主nginx的keepalived中止或將主nginx關機(至關於模擬宕機),查看主nginx的eth0:
eth0沒有綁定vip
注意這裏模擬的是中止 keepalived進程沒有模擬宕機,因此還要將nginx進程也中止表示主nginx服務沒法提供。
查看備nginx的eth0:
vip已經漂移到備nginx。
訪問ccc.test.com,能夠訪問。
將主nginx的keepalived和nginx都啓動。
查看主nginx的eth0:
查看備nginx的eth0:
vip漂移到主nginx。
查看備nginx的eth0:
eth0沒有綁定vip
訪問:ccc.test.com,正常訪問。
注意:主nginx恢復時必定要將nginx也啓動(一般nginx啓動要加在開機啓動中),不然即便vip漂移到主nginx也沒法訪問。
keepalived是經過檢測keepalived進程是否存在判斷服務器是否宕機,若是keepalived進程在可是nginx進程不在了那麼keepalived是不會作主備切換,因此咱們須要寫個腳原本監控nginx進程是否存在,若是nginx不存在就將keepalived進程殺掉。
在主nginx上須要編寫nginx進程檢測腳本(check_nginx.sh),判斷nginx進程是否存在,若是nginx不存在就將keepalived進程殺掉,check_nginx.sh內容以下:
#!/bin/bash # 若是進程中沒有nginx則將keepalived進程kill掉 A=`ps -C nginx --no-header |wc -l` ## 查看是否有 nginx進程 把值賦給變量A if [ $A -eq 0 ];then ## 若是沒有進程值得爲 零 service keepalived stop ## 則結束 keepalived 進程 fi
將check_nginx.sh拷貝至/etc/keepalived下,
腳本測試:
將nginx中止,將keepalived啓動,執行腳本:sh /etc/keepalived/check_nginx.sh
從執行能夠看出自動將keepalived進程kill掉了。
修改主nginx的keepalived.conf,添加腳本定義檢測:
注意下邊紅色標識地方:
#全局配置 global_defs { notification_email { #指定keepalived在發生切換時須要發送email到的對象,一行一個 XXX@XXX.com } notification_email_from miaoruntu@itcast.cn #指定發件人 #smtp_server XXX.smtp.com #指定smtp服務器地址 #smtp_connect_timeout 30 #指定smtp鏈接超時時間 router_id LVS_DEVEL #運行keepalived機器的一個標識 } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" ##監控腳本 interval 2 ##時間間隔,2秒 weight 2 ##權重 } vrrp_instance VI_1 { state MASTER #標示狀態爲MASTER 備份機爲BACKUP interface eth0 #設置實例綁定的網卡 virtual_router_id 51 #同一實例下virtual_router_id必須相同 priority 100 #MASTER權重要高於BACKUP 好比BACKUP爲99 advert_int 1 #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒 authentication { #設置認證 auth_type PASS #主從服務器驗證方式 auth_pass 8888 } track_script { check_nginx #監控腳本 } virtual_ipaddress { #設置vip 192.168.101.100 #能夠多個虛擬IP,換行便可 } }
修改後重啓keepalived
回到負載均衡高可用的初始狀態,保證主、備上的keepalived、nginx所有啓動。
中止主nginx服務
觀察keepalived日誌:
tail -f /var/log/keepalived.log
查看keepalived進程已經不存在。
查看eth0已經沒有綁定vip。