一把王者的时间,我就学会了Nginx
作者 |?步爾斯特
來源 |?CSDN博客
Nginx 簡(jiǎn)介
Nginx("engine x")是一個(gè)高性能的 HTTP 和反向代理服務(wù)器,特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上 nginx 的并發(fā)能力確實(shí)在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好,中國大陸使用 nginx 網(wǎng)站用戶有:百度、京東、新浪、網(wǎng)易、騰訊、 淘寶等。
1.1 WEB 服務(wù)器
Nginx 可以作為靜態(tài)頁面的 web 服務(wù)器,同時(shí)還支持 CGI 協(xié)議的動(dòng)態(tài)語言,比如 perl、php等。但是不支持 java。Java 程序只能通過與 tomcat 配合完成。Nginx 專為性能優(yōu)化而開發(fā),性能是其最重要的考量,實(shí)現(xiàn)上非常注重效率 ,能經(jīng)受高負(fù)載的考驗(yàn),有報(bào)告表明能支持高達(dá) 50000個(gè)并發(fā)連接數(shù)。
1.2 反向代理
正向代理,代理客戶端,客戶端需要配置代理
反向代理,代理服務(wù)端,客戶端無感知
1.3 負(fù)載均衡
Nginx 的異步框架可以處理很大的并發(fā)請(qǐng)求,把這些并發(fā)請(qǐng)求 hold 住之后就可以分發(fā)給后臺(tái)服務(wù)端(backend servers,也叫做服務(wù)池, 后面簡(jiǎn)稱 backend)來做復(fù)雜的計(jì)算、處理和響應(yīng),這種模式的好處是相當(dāng)多的:隱藏業(yè)務(wù)主機(jī)更安全,節(jié)約了公網(wǎng) IP 地址,并且在業(yè)務(wù)量增加的時(shí)候可以方便地?cái)U(kuò)容后臺(tái)服務(wù)器。
這時(shí)候集群的概念產(chǎn)生了,我們?cè)黾臃?wù)器的數(shù)量,然后將請(qǐng)求分發(fā)到各個(gè)服務(wù)器上,將原先請(qǐng)求集中到單個(gè)服務(wù)器上的情況改為將請(qǐng)求分發(fā)到多個(gè)服務(wù)器上,將負(fù)載分發(fā)到不同的服器,也就是我們所說的負(fù)載均衡。
1.4 動(dòng)靜分離
為了加快網(wǎng)站的解析速度,可以把動(dòng)態(tài)頁面和靜態(tài)頁面由不同的服務(wù)器來解析,加快解析速度。降低原來單個(gè)服務(wù)器的壓力。
Nginx部署靜態(tài)資源,tomcat部署動(dòng)態(tài)資源
安裝啟動(dòng)
2.1 相關(guān)安裝包
? pcre-8.37.tar.gz ? openssl-1.0.1t.tar.gz ? zlib-1.2.8.tar.gz ? nginx-1.11.1.tar.gz
2.2 安裝流程
1.安裝 pcre 解壓縮 pcre-xx.tar.gz 包
進(jìn)入解壓縮目錄,執(zhí)行./configure
如果提示,需要提前安裝 gcc++,進(jìn)入安裝光盤目錄的軟件包(/media/CentOSXX/Package)執(zhí)行
rpm -ivh libstdc+±devel-4.4.7-17.el6.x86_64.rpm
rpm -ivh gcc-c+±4.4.7-17.el6.x86_64.rpm
./configure 完成后,回到 pcre 目錄下執(zhí)行 make,再執(zhí)行 make install
2.安裝 openssl
解壓縮 openssl-xx.tar.gz 包。
進(jìn)入解壓縮目錄,執(zhí)行./config
make && make install
3.安裝 zlib 解壓縮 zlib-xx.tar.gz 包。
進(jìn)入解壓縮目錄,執(zhí)行./configure。
make && make install
4.安裝 nginx
解壓縮 nginx-xx.tar.gz 包。
進(jìn)入解壓縮目錄,執(zhí)行./configure。
make && make install
查看開放的端口號(hào)
firewall-cmd --list-all
設(shè)置開放的端口號(hào)
firewall-cmd --add-service=http –permanent
sudo firewall-cmd --add-port=80/tcp --permanent
重啟防火墻
firewall-cmd –reload
2.3 Nginx 啟動(dòng)
命令
啟動(dòng)命令:在/usr/local/nginx/sbin 目錄下執(zhí)行 ./nginx
關(guān)閉命令: 在/usr/local/nginx/sbin 目錄下執(zhí)行 ./nginx -s stop
重新加載命令: 在/usr/local/nginx/sbin 目錄下執(zhí)行 ./nginx -s reload·
設(shè)置 nginx 為自啟動(dòng)服務(wù)
修改 linux 啟動(dòng)腳本/etc/rc.d/rc
加入 :/usr/local/nginx/sbin/nginx
Nginx核心配置文件
nginx 安裝目錄下,其默認(rèn)的配置文件都放在conf 目錄下,而主配置文件nginx.conf 也在其中,后續(xù)對(duì) nginx 的使用基本上都是對(duì)此配置文件進(jìn)行相應(yīng)的修改。
worker_processes 1; events {worker_connections 1024; } http {include mime.types;default_type application/octet-stream;keepalive_timeout 65;server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}} }根據(jù)上述文件,我們可以很明顯的將 nginx.conf 配置文件分為三部分
第一部分:全局塊
從配置文件開始到 events 塊之間的內(nèi)容,主要會(huì)設(shè)置一些影響 nginx 服務(wù)器整體運(yùn)行的配置指令,主要包括配置運(yùn)行 Nginx 服務(wù)器的用戶(組)、允許生成的 worker process 數(shù),進(jìn)程 PID 存放路徑、日志存放路徑和類型以及配置文件的引入等。
比如上面第一行配置的:worker_processes 1;
這是 Nginx 服務(wù)器并發(fā)處理服務(wù)的關(guān)鍵配置,worker_processes 值越大,可以支持的并發(fā)處理量也越多,但是會(huì)受到硬件、軟件等設(shè)備的制約。
第二部分:events 塊
events {worker_connections 1024; }events 塊涉及的指令主要影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接,常用的設(shè)置包括是否開啟對(duì)多 work process 下的網(wǎng)絡(luò)連接進(jìn)行序列化,是否允許同時(shí)接收多個(gè)網(wǎng)絡(luò)連接,選取哪種事件驅(qū)動(dòng)模型來處理連接請(qǐng)求,每個(gè) word process 可以同時(shí)支持的最大連接數(shù)等。
上述例子就表示每個(gè) work process 支持的最大連接數(shù)為 1024.
這部分的配置對(duì) Nginx 的性能影響較大,在實(shí)際中應(yīng)該靈活配置。
第三部分:http 塊
http {include mime.types;default_type application/octet-stream;keepalive_timeout 65;server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}} }這算是 Nginx 服務(wù)器配置中最頻繁的部分,代理、緩存和日志定義等絕大多數(shù)功能和第三方模塊的配置都在這里。
需要注意的是:http 塊也可以包括 http 全局塊、server 塊。
http 全局塊
http 全局塊配置的指令包括文件引入、MIME-TYPE 定義、日志自定義、連接超時(shí)時(shí)間、單鏈接請(qǐng)求數(shù)上限等。
server 塊
這塊和虛擬主機(jī)有密切關(guān)系,虛擬主機(jī)從用戶角度看,和一臺(tái)獨(dú)立的硬件主機(jī)是完全一樣的,該技術(shù)的產(chǎn)生是為了節(jié)省互聯(lián)網(wǎng)服務(wù)器硬件成本。
每個(gè) http 塊可以包括多個(gè) server 塊,而每個(gè) server 塊就相當(dāng)于一個(gè)虛擬主機(jī)。
而每個(gè) server 塊也分為全局 server 塊,以及可以同時(shí)包含多個(gè) locaton 塊。
全局 server 塊
最常見的配置是本虛擬機(jī)主機(jī)的監(jiān)聽配置和本虛擬主機(jī)的名稱或 IP 配置。
location 塊
一個(gè) server 塊可以配置多個(gè) location 塊。
這塊的主要作用是基于 Nginx 服務(wù)器接收到的請(qǐng)求字符串(例如 server_name/uri-string),對(duì)虛擬主機(jī)名稱(也可以是 IP 別名)之外的字符串(例如 前面的 /uri-string)進(jìn)行匹配,對(duì)特定的請(qǐng)求進(jìn)行處理。地址定向、數(shù)據(jù)緩存和應(yīng)答控制等功能,還有許多第三方模塊的配置也在這里進(jìn)行。
Nginx配置實(shí)戰(zhàn)-反向代理
案例配置如下:
server {listen 80;server_name localhost;location / {proxy_pass http://localhost:8001;}location ~ /demo1 {proxy_pass http://localhost:8001;}location ~ /demo2 {proxy_pass http://localhost:8002;}}location 指令說明
該指令用于匹配 URL,語法如下:
location [= | ~ | ~*| ^~] url{}= :用于不含正則表達(dá)式的 uri 前,要求請(qǐng)求字符串與 uri 嚴(yán)格匹配,如果匹配成功,就停止繼續(xù)向下搜索并立即處理該請(qǐng)求。
~:用于表示 uri 包含正則表達(dá)式,并且區(qū)分大小寫。
~*:用于表示 uri 包含正則表達(dá)式,并且不區(qū)分大小寫。
^~:用于不含正則表達(dá)式的 uri 前,要求 Nginx 服務(wù)器找到標(biāo)識(shí) uri 和請(qǐng)求字符串匹配度最高的 location 后,立即使用此 location 處理請(qǐng)求,而不再使用 location 塊中的正則 uri 和請(qǐng)求字符串做匹配。
注意:如果 uri 包含正則表達(dá)式,則必須要有 ~ 或者 ~* 標(biāo)識(shí)。
Nginx配置實(shí)戰(zhàn)-負(fù)載均衡
案例配置如下:
http{upstream myserver{ip_hash;server localhost:8080 weight=1;server localhost:8081 weight=1;}server {listen 80;server_name localhost;location / {proxy_pass http://myserverproxy_connect_timeout 10;}} }在 linux 下有 Nginx、LVS、Haproxy 等等服務(wù)可以提供負(fù)載均衡服務(wù),而且 Nginx 提供了幾種分配方式(策略):
輪詢(默認(rèn))
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器 down 掉,能自動(dòng)剔除。
weight
weight 代表權(quán)重,默認(rèn)為 1,權(quán)重越高被分配的客戶端越多指定輪詢幾率,weight 和訪問比率成正比,用于后端服務(wù)器性能不均的情況。
ip_hash
每個(gè)請(qǐng)求按訪問 ip 的 hash 結(jié)果分配,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器,可以解決 session 的問題。
fair(第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。
Nginx 配置實(shí)戰(zhàn)-動(dòng)靜分離
動(dòng)靜分離從目前實(shí)現(xiàn)角度來講大致分為兩種:
一種是純粹把靜態(tài)文件獨(dú)立成單獨(dú)的域名,放在獨(dú)立的服務(wù)器上,也是目前主流推崇的方案;
另外一種方法就是動(dòng)態(tài)跟靜態(tài)文件混合在一起發(fā)布,通過 nginx 來分開。
通過 location 指定不同的后綴名實(shí)現(xiàn)不同的請(qǐng)求轉(zhuǎn)發(fā)。通過 expires 參數(shù)設(shè)置,可以使瀏覽器緩存過期時(shí)間,減少與服務(wù)器之前的請(qǐng)求和流量。具體 Expires 定義:是給一個(gè)資源設(shè)定一個(gè)過期時(shí)間,也就是說無需去服務(wù)端驗(yàn)證,直接通過瀏覽器自身確認(rèn)是否過期即可,所以不會(huì)產(chǎn)生額外的流量。此種方法非常適合不經(jīng)常變動(dòng)的資源。(如果經(jīng)常更新的文件,不建議使用 Expires 來緩存),我這里設(shè)置 3d,表示在這 3 天之內(nèi)訪問這個(gè) URL,發(fā)送一個(gè)請(qǐng)求,比對(duì)服務(wù)器該文件最后更新時(shí)間沒有變化,則不會(huì)從服務(wù)器抓取,返回狀態(tài)碼304,如果有修改,則直接從服務(wù)器重新下載,返回狀態(tài)碼 200。
Nginx 原理與優(yōu)化參數(shù)配置
master-workers 的機(jī)制的好處
首先,對(duì)于每個(gè) worker 進(jìn)程來說,獨(dú)立的進(jìn)程,不需要加鎖,所以省掉了鎖帶來的開銷,同時(shí)在編程以及問題查找時(shí),也會(huì)方便很多。其次,采用獨(dú)立的進(jìn)程,可以讓互相之間不會(huì)影響,一個(gè)進(jìn)程退出后,其它進(jìn)程還在工作,服務(wù)不會(huì)中斷,master 進(jìn)程則很快啟動(dòng)新的 worker 進(jìn)程。當(dāng)然,worker 進(jìn)程的異常退出,肯定是程序有 bug 了,異常退出,會(huì)導(dǎo)致當(dāng)前 worker 上的所有請(qǐng)求失敗,不過不會(huì)影響到所有請(qǐng)求,所以降低了風(fēng)險(xiǎn)。
需要設(shè)置多少個(gè) worker
Nginx 同 redis 類似都采用了 io 多路復(fù)用機(jī)制,每個(gè) worker 都是一個(gè)獨(dú)立的進(jìn)程,但每個(gè)進(jìn)程里只有一個(gè)主線程,通過異步非阻塞的方式來處理請(qǐng)求, 即使是千上萬個(gè)請(qǐng)求也不在話下。每個(gè) worker 的線程可以把一個(gè) cpu 的性能發(fā)揮到極致。所以 worker 數(shù)和服務(wù)器的 cpu 數(shù)相等是最為適宜的。設(shè)少了會(huì)浪費(fèi) cpu,設(shè)多了會(huì)造成 cpu 頻繁切換上下文帶來的損耗。
#設(shè)置 worker 數(shù)量。 worker_processes 4 #work 綁定 cpu(4 work 綁定 4cpu)。 worker_cpu_affinity 0001 0010 0100 1000 #work 綁定 cpu (4 work 綁定 8cpu 中的 4 個(gè)) 。 worker_cpu_affinity?0000001?00000010?00000100?00001000連接數(shù) worker_connection
這個(gè)值是表示每個(gè) worker 進(jìn)程所能建立連接的最大值,所以,一個(gè) nginx 能建立的最大連接數(shù),應(yīng)該是 worker_connections * worker_processes。當(dāng)然,這里說的是最大連接數(shù),對(duì)于HTTP 請(qǐng) 求 本 地 資 源 來 說 , 能 夠 支 持 的 最 大 并 發(fā) 數(shù) 量 是 worker_connections * worker_processes,如果是支持 http1.1 的瀏覽器每次訪問要占兩個(gè)連接,所以普通的靜態(tài)訪問最大并發(fā)數(shù)是:worker_connections * worker_processes /2,而如果是 HTTP 作 為反向代理來說,最大并發(fā)數(shù)量應(yīng)該是 worker_connections *
worker_processes/4。因?yàn)樽鳛榉聪虼矸?wù)器,每個(gè)并發(fā)會(huì)建立與客戶端的連接和與后端服務(wù)的連接,會(huì)占用兩個(gè)連接。
nginx 搭建高可用集群
8.1 Keepalived+Nginx 高可用集群(主從模式)
8.2 Keepalived+Nginx 高可用集群(雙主模式)
往期推薦
如果讓你來設(shè)計(jì)網(wǎng)絡(luò)
寫時(shí)復(fù)制就這么幾行代碼,還是不會(huì)?
小小的 likely 背后卻大有玄機(jī)!
明明還有大量內(nèi)存,為啥報(bào)錯(cuò)“無法分配內(nèi)存”?
點(diǎn)分享
點(diǎn)收藏
點(diǎn)點(diǎn)贊
點(diǎn)在看
總結(jié)
以上是生活随笔為你收集整理的一把王者的时间,我就学会了Nginx的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云发布首款全球智能互联的网络产品——
- 下一篇: 看完这篇还不了解Nginx,那我就哭了!