一、Nginx基本概念
1、什麼是nginx
- Nginx 是一個高性能的Web伺服器和反向代理伺服器,也可作為郵件代理伺服器;
- Nginx由俄羅斯人Igor Sysoev 採用C語言開發編寫,第一個版本公布於2004年10月4日;
- Nginx特點佔有內存少,並發能力強,以高性能,低消耗聞名,Nginx官方測試為5萬並發請求;
2、什麼是反向代理
2.1什麼是正向代理
正向代理,是在用戶端的。比如需要訪問某些國外網站,我們可能需要購買vpn。
並且vpn是在我們的用戶瀏覽器端設置的,瀏覽器先訪問vpn地址,vpn地址轉發請求,並最後將請求結果原路返回來。
2.2什麼是反向代理
反向代理,其實客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理伺服器,由反向代理伺服器去選擇目標伺服器獲取數據後,在返回給客戶端,此時反向代理伺服器和目標伺服器對外就是一個伺服器,暴露的是代理伺服器地址,隱藏了真實伺服器 IP 地址。
3、什麼是負載均衡
負載均衡(Load Balance),意思是將負載(工作任務,訪問請求)進行平衡、分攤到多個操作單元(伺服器,組件)上進行執行。是解決高性能,單點故障(高可用),擴展性(水平伸縮)的終極解決方案。
4、什麼是動靜分離
在Web開發中,通常來說,動態資源其實就是指那些後臺資源,而靜態資源就是指HTML,JavaScript,CSS,img等文件。
一般來說,都需要將動態資源和靜態資源分開,將靜態資源部署在Nginx上,當一個請求來的時候,如果是靜態資源的請求,就直接到nginx配置的靜態資源目錄下面獲取資源,如果是動態資源的請求,nginx利用反向代理的原理,把請求轉發給後臺應用去處理,從而實現動靜分離。
在使用前後端分離之後,可以很大程度的提升靜態資源的訪問速度,同時在開過程中也可以讓前後端開發並行可以有效的提高開發時間,也可以有些的減少聯調時間。
二、Nginx基本使用
1、nginx安裝
1.1安裝nginx依賴包
[root@server ~] yum -y install make zlibzlib-devel gcc-c++ libtool openssl openssl-devel pcre gcc編譯器 gccopenssl庫 openssl,openssl-develpcre庫 pcre,pcre-develzlib庫 zlib,zlb-devel1.2安裝nginx
[root@server ~] cd /usr/local/[root@server local] lsbin games lib libexec sbin srcetc include lib64 nginx-1.16.1.tar.gz share[root@server local] tar -zxvfnginx-1.16.1.tar.gz[root@server local] cd nginx-1.16.1[root@server nginx-1.16.1] ./configure--prefix=/usr/local/nginx[root@server nginx-1.16.1] make &&make install1、解壓nginx*.tar.gz
2、切換到nginx主目錄
3、執行配置命令 ./configure--prefix=/usr/local/nginx (--prefix是指定安裝路徑)
4、執行命令進行編譯
5、執行命令進行安裝
1.3啟動nginx
[root@server nginx-1.16.1] cd/usr/local/nginx/sbin/[root@server sbin] ./nginx
1、普通啟動
切換到nginx安裝目錄的sbin目錄,執行./nginx
2、通過配置文件啟動
./nginx -c /usr/local/nginx/conf/nginx.conf
1.4檢查
[root@server sbin] ps -ef | grep nginxroot 17806 1 0 00:24 ? 00:00:00 nginx: master process ./nginxnobody 17807 17806 0 00:24 ? 00:00:00 nginx: worker processroot 17809 9820 0 00:25 pts/0 00:00:00 grep --color=auto nginx[root@server sbin] netstat -ntulp | grep 80tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 17806/nginx: master[root@server sbin] ./nginx -c/usr/local/nginx/conf/nginx.conf -tnginx: the configuration file/usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file/usr/local/nginx/conf/nginx.conf test is successful
1、通過進程檢查
master進程用於讀取配置文件,並且維護管理worker進程
worker進程對請求進行處理
2、通過查看埠
3、檢查配置文件
./nginx -c /usr/local/nginx/conf/nginx.conf-t
2、nginx常用命令
殺死進程kill -QUIT 主pid kill -TERM 主pid命令關閉./nginx -s stop重啟./nginx -s reload幫助 -?,-h : this help -v : showversion and exit -V : show versionand configure options then exit -t : testconfiguration and exit -T : testconfiguration, dump it and exit -q : suppressnon-error messages during configuration testing -ssignal : send signal to a masterprocess: stop, quit, reopen, reload -pprefix : set prefix path (default:/usr/local/nginx/) -cfilename : set configuration file(default: conf/nginx.conf) -gdirectives : set global directives outof configuration file
3、nginx配置文件
配置文件路徑: [nginx安裝路徑]/conf/nginx.conf
比如這次環境的路徑在/usr/local/nginx/conf/nginx.conf
配置文件內容為
worker_processes 1; events { worker_connections 1024;} http { include mime.types; default_type application/octet-stream; sendfile on; 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; } }}
3.1worker配置
從配置文件開始到 events 塊之間的內容,主要會設置一些影響 nginx 伺服器整體運行的配置指令,主要包括配置運行 Nginx 伺服器的用戶(組)、允許生成的 worker process 數,進程PID 存放路徑、日誌存放路徑和類型以及配置文件的引入等。
worker_processes 設置nginx可以並發處理進程的大小
3.2events配置
events 塊涉及的指令主要影響 Nginx 伺服器與用戶的網絡連接,常用的設置包括是否開啟對多 work process下的網絡連接進行序列化,是否允許同時接收多個網絡連接,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等。
events { worker_connections 1024;}
worker_connections 設置nginxworker(進程)支持的最大連接數
3.3httpd配置
http { include mime.types; default_type application/octet-stream; sendfile on; 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; } }}
這算是 Nginx 伺服器配置中最頻繁的部分,代理、緩存和日誌定義等絕大多數功能和第三方模塊的配置都在這裡。
需要注意的是: http 塊也可以包括http 全局塊、server 塊。
http全局塊
http 全局塊配置的指令包括文件引入、MIME-TYPE 定義、日誌自定義、連接超時時間、單連結請求數上限等。
server 塊
這塊和虛擬主機有密切關係,虛擬主機從用戶角度看,和一臺獨立的硬體主機是完全一樣的,該技術的產生是為了節省網際網路伺服器硬體成本。
每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當於一個虛擬主機。
而每個 server 塊也分為全局 server 塊,以及可以同時包含多個 locaton 塊。
1、全局 server 塊
最常見的配置是本虛擬機主機的監聽配置和本虛擬主機的名稱或 IP 配置。
2、 location 塊
一個 server 塊可以配置多個location 塊
這塊的主要作用是基於Nginx 伺服器接收到的請求字符串(例如 server_name/uri-string),對虛擬主機名稱(也可以是 IP 別名)之外的字符串(例如 前面的/uri-string)進行匹配,對特定的請求進行處理。地址定向、數據緩存和應答控制等功能,還有許多第三方模塊的配置也在這裡進行。
location 指令說明
該指令用於匹配 URL。語法如下:
= :用於不含正則表達式的 uri 前,要求請求字符串與uri 嚴格匹配,如果匹配成功,就停止繼續向下搜索並立即處理該請求。
~:用於表示 uri 包含正則表達式,並且區分大小寫。
~*:用於表示 uri 包含正則表達式,並且不區分大小寫。
^~:用於不含正則表達式的 uri 前,要求 Nginx 伺服器找到標識 uri 和請求字符串匹配度最高的location 後,立即使用此 location 處理請求,而不再使用 location塊中的正則 uri 和請求字符串做匹配
注意:如果 uri 包含正則表達式,則必須要有~ 或者 ~* 標識。
三、Nginx反向代理配置
1、反向代理配置實例1
實驗環境 192.168.1.41
啟動一個tomcat 埠為8080
nginx使用默認埠80
訪問 http://192.168.1.41反向代理到 http://192.168.1.41:8080
1啟動一個tomcat埠8080
[root@server ~] yum -y install java[root@server local] ls/usr/local/apache-tomcat-7.0.96.tar.gz/usr/local/apache-tomcat-7.0.96.tar.gz[root@server local] tar -zxvfapache-tomcat-7.0.96.tar.gz[root@server local] cd apache-tomcat-7.0.96[root@server apache-tomcat-7.0.96]./bin/startup.sh[root@server apache-tomcat-7.0.96] netstat-ntulp | grep 8080tcp6 0 0 :::8080 :::* LISTEN 9851/java
2配置nginx.conf
[root@server nginx] vim conf/nginx.conf server { listen 80; server_name 192.168.1.41; location / { proxy_pass http://192.168.1.41:8080; index index.html index.htm; } }[root@server nginx] ./sbin/nginx
3驗證
2、反向代理配置實例2
實驗環境 192.168.1.41
啟動兩個tomcat 埠為8081,8082
nginx使用埠32880
訪問 http://192.168.1.41:32880/test1/ 反向代理到http://192.168.1.41:8081/test1
訪問 http://192.168.1.41:32880/test2 反向代理到http://192.168.1.41:8082/test2
1啟動兩個tomcat 埠為8081,8082
[root@server local] cd /usr/local/[root@server local] cp -rvf apache-tomcat-7.0.96tomcat1[root@server local] cp -rvfapache-tomcat-7.0.96 tomcat2[root@server local] cd tomcat1[root@server tomcat1] vim conf/server.xml<Server port="8006"shutdown="SHUTDOWN" <Connector port="8081"protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /[root@server tomcat1] mkdir webapps/test1[root@server tomcat1] echo test1 webapps/test1/index.html[root@server tomcat1] ./bin/startup.shTomcat started.[root@server tomcat1] cd ../tomcat2[root@server tomcat2] vim conf/server.xml<Server port="8007"shutdown="SHUTDOWN" <Connector port="8082"protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /[root@server tomcat2] mkdir webapps/test2[root@server tomcat2] echo test2 webapps/test2/index.html[root@server tomcat2] ./bin/startup.shTomcat started.[root@server tomcat2] netstat -ntulp | grep808tcp6 0 0 :::8081 :::* LISTEN 10072/java tcp6 0 0 :::8082 :::* LISTEN 10136/java
2配置nginx.conf
[root@server tomcat2] vim/usr/local/nginx/conf/nginx.conf server { listen 32880; server_name 192.168.1.41; location /test1 { proxy_pass http://192.168.1.41:8081; } location /test2 { proxy_pass http://192.168.1.41:8082; } }[root@server tomcat2] /usr/local/nginx/sbin/nginx-s reload
3驗證
3、反向代理配置實例3
實驗環境192.168.1.41 192.168.1.42
在192.168.1.42啟動一個httpd 埠為80
nginx使用埠32881
訪問http://192.168.1.41:32881反向代理到http://192.168.1.42:80
1在192.168.1.42啟動一個httpd 埠為80
[root@localhost ~] yum -y install httpd[root@localhost ~] systemctl start httpd
2配置nginx.conf
[root@server ~] vim/usr/local/nginx/conf/nginx.conf server { listen 32881; server_name 192.168.1.41; location / { proxy_pass http://192.168.1.42:80; index index.html index.htm; } }[root@server ~] /usr/local/nginx/sbin/nginx-s reload
3驗證
四、Nginx負載均衡配置
1、負載均衡配置實例1
實驗環境 192.168.1.41
啟動兩個tomcat 埠為8083 8085
nginx埠使用32882
訪問http://192.168.1.41:32882負載均衡到http://192.168.1.41:8083和http://192.168.1.41:8085
1啟動一個tomcat埠8080
[root@server local] cd /usr/local/[root@server local] cp -rvfapache-tomcat-7.0.96 tomcat3[root@server local] cp -rvfapache-tomcat-7.0.96 tomcat5[root@server local] cd tomcat3[root@server tomcat13 vim conf/server.xml<Server port="8008"shutdown="SHUTDOWN" <Connector port="8083"protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /[root@server tomcat3] ./bin/startup.shTomcat started.[root@server tomcat5] cd ../tomcat4[root@server tomcat5] vim conf/server.xml<Server port="8010"shutdown="SHUTDOWN" <Connector port="8085"protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /[root@server tomcat5] ./bin/startup.shTomcat started.[root@server tomcat5] netstat -ntulp | grep808tcp6 0 0 :::8083 :::* LISTEN 10072/java tcp6 0 0 :::8085 :::* LISTEN 10136/java
2配置nginx.conf
[root@server ~] vim/usr/local/nginx/conf/nginx.conf upstream myserver1{ ip_hash; server 192.168.1.41:8083 weight=1; server 192.168.1.41:8085 weight=1; } server{ listen 32882; server_name 192.168.1.41; location / { proxy_pass http://myserver1; } }[root@server ~] /usr/local/nginx/sbin/nginx-s reload
3驗證
這樣看不出效果,因為兩個tomcat都長得一樣,如果想要有更直觀得效果,可以給兩個tomcat編寫不同得代碼。
2、負載均衡配置實例2
實驗環境 192.168.1.41 192.168.1.42 192.168.1.43
在192.168.1.42啟動一個httpd,在192.168.1.43啟動一個httpd
nginx埠使用32883
訪問http://192.168.1.41:32883負載均衡到http://192.168.1.42和http://192.168.1.43
1在192.168.1.42啟動一個httpd,在192.168.1.43啟動一個httpd
[root@client1 ~] yum -y install httpd[root@client1 ~] systemctl start httpd[root@client2 ~] yum -y install httpd[root@client2 ~] systemctl start httpd
2配置nginx.conf
upstream myserver2{ server 192.168.1.42:80 weight=1; server 192.168.1.43:80 weight=1; } server{ listen 32883; server_name 192.168.1.41; location / { proxy_pass http://myserver2; } }[root@server ~] /usr/local/nginx/sbin/nginx-s reload
3驗證
這樣看不出效果,因為兩個http都長得一樣,如果想要有更直觀得效果,可以給兩個http編寫不同得代碼。
3、負載均衡策略
1、輪詢(默認)
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器 down 掉,能自動剔除。
2、weight
weight 代表權,重默認為 1,權重越高被分配的客戶端越多
指定輪詢機率,weight 和訪問比率成正比,用於後端伺服器性能不均的情況。
3、ip_hash
每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session 的問題。例如:
4、fair(第三方)
按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
五、Nginx動靜分離配置
實驗環境 192.168.1.41 192.168.1.42
在192.168.1.42啟動一個tomcat,默認埠8080,模擬動態資源
在192.168.1.42啟動一個httpd,默認埠80,放置一些圖片模擬靜態資源
nginx埠使用32884
訪問http://192.168.1.41:32884直接跳轉192.168.1.42:8080訪問動態資源
訪問http://192.168.1.41:32884/image直接跳轉192.168.1.42/image訪問靜態資源
1在192.168.1.42啟動一個tomcat,默認埠8080,模擬動態資源
在192.168.1.42啟動一個httpd,默認埠80,放置一些圖片模擬靜態資源
[root@client1 local] ls/usr/local/apache-tomcat-7.0.96.tar.gz/usr/local/apache-tomcat-7.0.96.tar.gz[root@client1 local] tar -zxvfapache-tomcat-7.0.96.tar.gz[root@client1 local] cdapache-tomcat-7.0.96[root@client1 apache-tomcat-7.0.96]./bin/startup.shTomcat started.[root@client1 apache-tomcat-7.0.96] netstat-ntulp | grep 8080tcp6 0 0 :::8080 :::* LISTEN 43444/java [root@client1 apache-tomcat-7.0.96] cd/var/www/html/[root@client1 html] mkdir image[root@client1 html] ls image/60ce3e23bbebfdf3a58c54705030e6f9cbcca934.jpgAutumn_in_Kanas_by_Wang_Jinyu.jpgBalloon_by_Matt_Benson.jpgBeach_by_Samuel_Scrimshaw.jpgbeijing.jpgdesktop.jpgf0df38ae0d5d668e448d12640810ee2065a6df64.jpg
2配置nginx.conf
server { listen 32884; server_name 192.168.1.41; location / { proxy_pass http://192.168.1.42:8080; index index.html index.htm; } location /image { proxy_pass http://192.168.1.42:80; index index.html index.htm; }[root@server ~] /usr/local/nginx/sbin/nginx-s reload
3驗證
六、Nginx高可用配置
實驗環境192.168.1.41 192.168.1.42
1在兩個節點運行nginx和keepalived,nginx參照 安裝nginx和運行nginx
[root@server ~] yum -y install keepalived[root@client1 ~] yum -y install keepalived
2配置master節點
[root@master ~] cp/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak[root@server ~] vim /etc/keepalived/keepalived.confvrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh" interval 2 weight 2}vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port } virtual_ipaddress { 192.168.1.5 }[root@client1 ~] vim/usr/local/src/nginx_check.shA=`ps -C nginx --no-header |wc -l`if [ $A -eq 0 ];then systemctl start nginx if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fifi[root@client1 ~] systemctl start keepalived
3配置backup節點
[root@client1 ~] cp/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak[root@client1 ~] vim/etc/keepalived/keepalived.confvrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh" interval 2 weight 2}vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port } virtual_ipaddress { 192.168.1.5 }[root@client1 ~] vim/usr/local/src/nginx_check.shA=`ps -C nginx --no-header |wc -l`if [ $A -eq 0 ];then systemctl start nginx if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fifi[root@client1 ~] systemctl start keepalived
4驗證
七、Nginx原理
master-workers 的機制的好處
首先,對於每個 worker 進程來說,獨立的進程,不需要加鎖,所以省掉了鎖帶來的開銷,同時在編程以及問題查找時,也會方便很多。其次,採用獨立的進程,可以讓互相之間不會影響,一個進程退出後,其它進程還在工作,服務不會中斷, master 進程則很快啟動新的worker 進程。當然, worker 進程的異常退出,肯定是程序有 bug 了,異常退出,會導致當前 worker 上的所有請求失敗,不過不會影響到所有請求,所以降低了風險
需要設置多少個 worker
Nginx 同 redis 類似都採用了 io 多路復用機制,每個worker 都是一個獨立的進程,但每個進程裡只有一個主線程,通過異步非阻塞的方式來處理請求,即使是千上萬個請求也不在話下。每個 worker 的線程可以把一個 cpu 的性能發揮到極致。所以 worker 數和伺服器的 cpu數相等是最為適宜的。設少了會浪費 cpu,設多了會造成 cpu 頻繁切換上下文帶來的損耗。
設置 worker 數量
worker_processes 4
work 綁定 cpu(4 work 綁定 4cpu)。
worker_cpu_affinity 0001 0010 0100 1000
work 綁定 cpu (4 work 綁定 8cpu 中的 4 個) 。
worker_cpu_affinity 0000001 0000001000000100 00001000
連接數 worker_connection
這個值是表示每個 worker 進程所能建立連接的最大值,所以,一個 nginx 能建立的最大連接數,應該是 worker_connections * worker_processes。當然,這裡說的是最大連接數,對於HTTP請 求 本 地 資 源 來 說 , 能 夠 支 持 的 最 大 並 發 數 量 是 worker_connections* worker_processes,如果是支持 http1.1 的瀏覽器每次訪問要佔兩個連接,所以普通的靜態訪問最大並發數是: worker_connections * worker_processes /2,而如果是 HTTP 作 為反向代理來說,最大並發數量應該是worker_connections * worker_processes/4。因為作為反向代理伺服器,每個並發會建立與客戶端的連接和與後端服務的連接,會佔用兩個連接。