nginx是一個(gè)開源的混槐,支持高性能编兄,高并發(fā)的www服務(wù)和代理服務(wù)軟件。它是一個(gè)俄羅斯人lgor sysoev開發(fā)的声登,作者將源代碼開源出來供全球使用狠鸳。
nginx比它大哥apache性能改進(jìn)許多揣苏,nginx占用的系統(tǒng)資源更少,支持更高的并發(fā)連接件舵,有更高的訪問效率卸察。
nginx不但是一個(gè)優(yōu)秀的web服務(wù)軟件,還可以作為反向代理铅祸,負(fù)載均衡坑质,以及緩存服務(wù)使用。
安裝更為簡單临梗,方便涡扼,靈活。
nginx概述
nginx是一款自由的盟庞、開源的吃沪、高性能的HTTP服務(wù)器和反向代理服務(wù)器;同時(shí)也是一個(gè)IMAP什猖、POP3票彪、SMTP代理服務(wù)器;nginx可以作為一個(gè)HTTP服務(wù)器進(jìn)行網(wǎng)站的發(fā)布處理不狮,另外nginx可以作為反向代理進(jìn)行負(fù)載均衡的實(shí)現(xiàn)降铸。
這里主要通過三個(gè)方面簡單介紹nginx
- 反向代理
- 負(fù)載均衡
- nginx特點(diǎn)
1. 反向代理
關(guān)于代理
說到代理,首先我們要明確一個(gè)概念摇零,所謂代理就是一個(gè)代表垮耳、一個(gè)渠道;
此時(shí)就設(shè)計(jì)到兩個(gè)角色遂黍,一個(gè)是被代理角色终佛,一個(gè)是目標(biāo)角色,被代理角色通過這個(gè)代理訪問目標(biāo)角色完成一些任務(wù)的過程稱為代理操作過程雾家;如同生活中的專賣店~客人到adidas專賣店買了一雙鞋铃彰,這個(gè)專賣店就是代理,被代理角色就是adidas廠家芯咧,目標(biāo)角色就是用戶
正向代理
說反向代理之前牙捉,我們先看看正向代理,正向代理也是大家最常接觸的到的代理模式敬飒,我們會(huì)從兩個(gè)方面來說關(guān)于正向代理的處理模式邪铲,分別從軟件方面和生活方面來解釋一下什么叫正向代理
在如今的網(wǎng)絡(luò)環(huán)境下,我們?nèi)绻捎诩夹g(shù)需要要去訪問國外的某些網(wǎng)站无拗,此時(shí)你會(huì)發(fā)現(xiàn)位于國外的某網(wǎng)站我們通過瀏覽器是沒有辦法訪問的带到,此時(shí)大家可能都會(huì)用一個(gè)操作FQ進(jìn)行訪問,F(xiàn)Q的方式主要是找到一個(gè)可以訪問國外網(wǎng)站的代理服務(wù)器英染,我們將請(qǐng)求發(fā)送給代理服務(wù)器揽惹,代理服務(wù)器去訪問國外的網(wǎng)站被饿,然后將訪問到的數(shù)據(jù)傳遞給我們!
上述這樣的代理模式稱為正向代理搪搏,正向代理最大的特點(diǎn)是客戶端非常明確要訪問的服務(wù)器地址狭握;服務(wù)器只清楚請(qǐng)求來自哪個(gè)代理服務(wù)器,而不清楚來自哪個(gè)具體的客戶端疯溺;正向代理模式屏蔽或者隱藏了真實(shí)客戶端信息论颅。
反向代理
明白了什么是正向代理,我們繼續(xù)看關(guān)于反向代理的處理方式囱嫩,舉例如我大天朝的某寶網(wǎng)站恃疯,每天同時(shí)連接到網(wǎng)站的訪問人數(shù)已經(jīng)爆表,單個(gè)服務(wù)器遠(yuǎn)遠(yuǎn)不能滿足人民日益增長的購買欲望了挠说,此時(shí)就出現(xiàn)了一個(gè)大家耳熟能詳?shù)拿~:分布式部署澡谭;也就是通過部署多臺(tái)服務(wù)器來解決訪問人數(shù)限制的問題愿题;淘寶網(wǎng)站中大部分功能也是直接使用nginx進(jìn)行反向代理實(shí)現(xiàn)的损俭,并且通過封裝nginx和其他的組件之后起了個(gè)高大上的名字:Tengine,有興趣的童鞋可以訪問Tengine的官網(wǎng)查看具體的信息:http://tengine.taobao.org/
那么反向代理具體是通過什么樣的方式實(shí)現(xiàn)的分布式的集群操作呢潘酗,我們先看一個(gè)示意圖:
通過上述的圖解大家就可以看清楚了杆兵,多個(gè)客戶端給服務(wù)器發(fā)送的請(qǐng)求,nginx服務(wù)器接收到之后仔夺,按照一定的規(guī)則分發(fā)給了后端的業(yè)務(wù)處理服務(wù)器進(jìn)行處理了琐脏。此時(shí)~請(qǐng)求的來源也就是客戶端是明確的,但是請(qǐng)求具體由哪臺(tái)服務(wù)器處理的并不明確了缸兔,nginx扮演的就是一個(gè)反向代理角色
反向代理日裙,主要用于服務(wù)器集群分布式部署的情況下,反向代理隱藏了服務(wù)器的信息惰蜜!
項(xiàng)目場(chǎng)景
通常情況下昂拂,我們?cè)趯?shí)際項(xiàng)目操作時(shí),正向代理和反向代理很有可能會(huì)存在在一個(gè)應(yīng)用場(chǎng)景中抛猖,正向代理代理客戶端的請(qǐng)求去訪問目標(biāo)服務(wù)器,目標(biāo)服務(wù)器是一個(gè)反向單利服務(wù)器,反向代理了多臺(tái)真實(shí)的業(yè)務(wù)處理服務(wù)器引颈。具體的拓?fù)鋱D如下:
2. 負(fù)載均衡
我們已經(jīng)明確了所謂代理服務(wù)器的概念沦童,那么接下來,nginx扮演了反向代理服務(wù)器的角色撑教,它是以依據(jù)什么樣的規(guī)則進(jìn)行請(qǐng)求分發(fā)的呢朝墩?不用的項(xiàng)目應(yīng)用場(chǎng)景,分發(fā)的規(guī)則是否可以控制呢伟姐?
這里提到的客戶端發(fā)送的鱼辙、nginx反向代理服務(wù)器接收到的請(qǐng)求數(shù)量廉嚼,就是我們說的負(fù)載量
請(qǐng)求數(shù)量按照一定的規(guī)則進(jìn)行分發(fā)到不同的服務(wù)器處理的規(guī)則,就是一種均衡規(guī)則
所以~將服務(wù)器接收到的請(qǐng)求按照規(guī)則分發(fā)的過程倒戏,稱為負(fù)載均衡怠噪。
負(fù)載均衡在實(shí)際項(xiàng)目操作過程中,有硬件負(fù)載均衡和軟件負(fù)載均衡兩種杜跷,硬件負(fù)載均衡也稱為硬負(fù)載傍念,如F5負(fù)載均衡,相對(duì)造價(jià)昂貴成本較高葛闷,但是數(shù)據(jù)的穩(wěn)定性安全性等等有非常好的保障憋槐,如中國移動(dòng)中國聯(lián)通這樣的公司才會(huì)選擇硬負(fù)載進(jìn)行操作;更多的公司考慮到成本原因淑趾,會(huì)選擇使用軟件負(fù)載均衡阳仔,軟件負(fù)載均衡是利用現(xiàn)有的技術(shù)結(jié)合主機(jī)硬件實(shí)現(xiàn)的一種消息隊(duì)列分發(fā)機(jī)制
nginx支持的負(fù)載均衡調(diào)度算法方式如下:
weight輪詢(默認(rèn)):接收到的請(qǐng)求按照順序逐一分配到不同的后端服務(wù)器,即使在使用過程中扣泊,某一臺(tái)后端服務(wù)器宕機(jī)近范,nginx會(huì)自動(dòng)將該服務(wù)器剔除出隊(duì)列,請(qǐng)求受理情況不會(huì)受到任何影響延蟹。 這種方式下评矩,可以給不同的后端服務(wù)器設(shè)置一個(gè)權(quán)重值(weight),用于調(diào)整不同的服務(wù)器上請(qǐng)求的分配率阱飘;權(quán)重?cái)?shù)據(jù)越大斥杜,被分配到請(qǐng)求的幾率越大;該權(quán)重值沥匈,主要是針對(duì)實(shí)際工作環(huán)境中不同的后端服務(wù)器硬件配置進(jìn)行調(diào)整的蔗喂。
ip_hash:每個(gè)請(qǐng)求按照發(fā)起客戶端的ip的hash結(jié)果進(jìn)行匹配,這樣的算法下一個(gè)固定ip地址的客戶端總會(huì)訪問到同一個(gè)后端服務(wù)器高帖,這也在一定程度上解決了集群部署環(huán)境下session共享的問題缰儿。
fair:智能調(diào)整調(diào)度算法,動(dòng)態(tài)的根據(jù)后端服務(wù)器的請(qǐng)求處理到響應(yīng)的時(shí)間進(jìn)行均衡分配棋恼,響應(yīng)時(shí)間短處理效率高的服務(wù)器分配到請(qǐng)求的概率高返弹,響應(yīng)時(shí)間長處理效率低的服務(wù)器分配到的請(qǐng)求少;結(jié)合了前兩者的優(yōu)點(diǎn)的一種調(diào)度算法爪飘。但是需要注意的是nginx默認(rèn)不支持fair算法义起,如果要使用這種調(diào)度算法,請(qǐng)安裝upstream_fair模塊
url_hash:按照訪問的url的hash結(jié)果分配請(qǐng)求师崎,每個(gè)請(qǐng)求的url會(huì)指向后端固定的某個(gè)服務(wù)器默终,可以在nginx作為靜態(tài)服務(wù)器的情況下提高緩存效率。同樣要注意nginx默認(rèn)不支持這種調(diào)度算法,要使用的話需要安裝nginx的hash軟件包
依賴環(huán)境準(zhǔn)備
一. gcc 安裝
安裝 nginx 需要先將官網(wǎng)下載的源碼進(jìn)行編譯齐蔽,編譯依賴 gcc 環(huán)境两疚,如果沒有 gcc 環(huán)境,則需要安裝:
yum -y install gcc gcc-c++ popt-devel openssl-devel
二. PCRE pcre-devel 安裝
PCRE(Perl Compatible Regular Expressions) 是一個(gè)Perl庫含滴,包括 perl 兼容的正則表達(dá)式庫诱渤。nginx 的 http 模塊使用 pcre 來解析正則表達(dá)式,所以需要在 linux 上安裝 pcre 庫谈况,pcre-devel 是使用 pcre 開發(fā)的一個(gè)二次開發(fā)庫勺美。nginx也需要此庫。命令:
yum install -y pcre pcre-devel
三. zlib 安裝
zlib 庫提供了很多種壓縮和解壓縮的方式碑韵, nginx 使用 zlib 對(duì) http 包的內(nèi)容進(jìn)行 gzip 赡茸,所以需要在 Centos 上安裝 zlib 庫。
yum install -y zlib zlib-devel
四. OpenSSL 安裝
OpenSSL 是一個(gè)強(qiáng)大的安全套接字層密碼庫祝闻,囊括主要的密碼算法占卧、常用的密鑰和證書封裝管理功能及 SSL 協(xié)議,并提供豐富的應(yīng)用程序供測(cè)試或其它目的使用联喘。
nginx 不僅支持 http 協(xié)議华蜒,還支持 https(即在ssl協(xié)議上傳輸http),所以需要在 Centos 安裝 OpenSSL 庫耸袜。
yum install -y openssl*
五:ncurses-devel安裝
yum -y install ncurses-devel
以上基本環(huán)境安裝完畢之后友多,下面開始安裝Nginx
Nginx安裝
1.windows安裝
官方網(wǎng)站下載地址:
https://nginx.org/en/download.html
如下圖所示牲平,下載對(duì)應(yīng)的版本的nginx壓縮包堤框,解壓到自己電腦上存放軟件的文件夾中即可
解壓完成后,文件目錄結(jié)構(gòu)如下:
啟動(dòng)nginx
1) 直接雙擊該目錄下的nginx.exe纵柿,即可啟動(dòng)nginx服務(wù)器
2) 命令行計(jì)入該文件夾蜈抓,執(zhí)行nginx命令,也會(huì)直接啟動(dòng)nginx服務(wù)器
D:/resp_application/nginx-1.13.5> nginx
訪問nginx
打開瀏覽器昂儒,輸入地址:http://localhost沟使,訪問頁面,出現(xiàn)如下頁面表示訪問成功
停止nginx
命令行進(jìn)入nginx根目錄渊跋,執(zhí)行如下命令腊嗡,停止服務(wù)器:
強(qiáng)制停止nginx服務(wù)器,如果有未處理的數(shù)據(jù)拾酝,丟棄
D:/resp_application/nginx-1.13.5> nginx -s stop
優(yōu)雅的停止nginx服務(wù)器燕少,如果有未處理的數(shù)據(jù),等待處理完成之后停止
D:/resp_application/nginx-1.13.5> nginx -s quit
2. centos7.2安裝
首先進(jìn)入nginx官網(wǎng)下載tar.gz壓縮包蒿囤,之后上傳到指定位置進(jìn)行解壓客们,配置編譯即可。也可以使用wget http://nginx.org/download/nginx-1.16.0.tar.gz
在線下載,我這里的nginx是放在/usr/local/nginx
目錄之下底挫。
解壓完成后恒傻,進(jìn)入nginx目錄:
可以看到有configure文件,現(xiàn)在我們就開始進(jìn)行配置nginx安裝信息建邓。在配置前盈厘,我們?cè)?code>/usr/local/nginx/下載創(chuàng)建一個(gè)nginx目錄,用來把nginx相關(guān)信息安裝到此目錄官边,目錄名稱自定義即可扑庞,不一定需要跟我這里一樣,畢竟我這里我看著也別扭拒逮。
然后進(jìn)入創(chuàng)建的nginx目錄罐氨,pwd記住路徑/usr/local/nginx/nginx
,復(fù)制路徑備用
之后再次進(jìn)入解壓過后的nginx-1.16.0目錄之下:
然后在當(dāng)前目錄下輸入命令./configure --prefix=/usr/local/nginx/nginx
顯示以上信息即安裝成功滩援。下面我們?cè)俅尾榭茨夸洶l(fā)現(xiàn)多了一個(gè)Makefile文件.
緊接著開始編譯安裝栅隐,命令:make && make install
注意:如果報(bào)如下錯(cuò)誤,可能是缺少依賴環(huán)境,安裝ncurses-devel依賴包玩徊,把已經(jīng)解壓的nginx包刪除租悄,重新解壓,重新上面步驟在來一遍即可恩袱。參考
make: *** No rule to make target
build', needed by
default'. Stop.
下面是所需要的所有依賴包:
yum -y install gcc gcc-c++ popt-devel openssl-devel
yum install -y openssl*
yum -y install ncurses-devel
yum install pcre pcre-devel
yum install zlib zlib-devel
接著說泣棋,make && make install命令執(zhí)行完成之后,看到如下頁面說明安裝編譯成功
之后再進(jìn)入安裝目錄nginx下查看畔塔,發(fā)現(xiàn)多了四個(gè)目錄
說明:
- conf:配置文件
- html:靜態(tài)html文件
- logs:日志文件
-
sbin:啟動(dòng)命令
之后進(jìn)入sbin潭辈,輸入./nginx命令啟動(dòng),在瀏覽器訪問你的ip即可看到nginx歡迎頁面澈吨。
歡迎頁
啟動(dòng)成功之后把敢,nginx安裝目錄也發(fā)生變化,新增了幾個(gè)文件夾
image.png
nginx常用命令:
nginx 啟動(dòng)
nginx -s quit 停止
nginx -s reload 重新載入配置文件(當(dāng)配置文件發(fā)生變化時(shí))
nginx -v 查看版本
nginx -t 查看nginx的配置是否成功
nginx -h 查看幫助信息
config配置文件詳解
進(jìn)入安裝目錄nginx下的conf文件夾下谅辣,打開nginx.conf
主模塊
daemon
語法:daemon on/off
默認(rèn)值:on
是否已守候線程方式啟動(dòng)修赞,也就是是否后臺(tái)運(yùn)行,默認(rèn)開啟的桑阶,所有這里配置文件中沒有顯示柏副。
master_process
默認(rèn)值:on
是否以master/worker方式進(jìn)行工作,在實(shí)際環(huán)境中蚣录,nginx是以一個(gè)master進(jìn)程管理多個(gè)worker進(jìn)程的方式運(yùn)行的割择,關(guān)閉后nginx就不會(huì)fork出worker子進(jìn)程來處理請(qǐng)求,而是用master進(jìn)程自身來處理請(qǐng)求worker-process number包归;默認(rèn)1锨推,在master/worker運(yùn)行方式下铅歼,worker進(jìn)程的樹木,一般情況下用戶要配置與cup內(nèi)核數(shù)相等的worker進(jìn)程换可。也就是是否多線程啟動(dòng)椎椰。
error_log
語法:error_log file [debug | info | notice | warn | error |crit](從左到右:debug最詳細(xì) crit最少)
錯(cuò)誤日志文件,默認(rèn)是以什么級(jí)別的方式存入file文件目錄中
user
默認(rèn)nobody
如果主進(jìn)程以root運(yùn)行沾鳄,nginx將會(huì)調(diào)用setuid()/setgid()來設(shè)置用戶/組慨飘,如果沒有指定組,那么將使用與用戶名相同的組译荞,默認(rèn)情況下使用nobody用戶與nobody組瓤的。
worker_processes
啟動(dòng)進(jìn)程數(shù),通常設(shè)置成和cpu的數(shù)量相等
worker_connections 1024
工作模式及連接數(shù)設(shè)置
關(guān)于配置大家可以參考如下吞歼,具體詳解可以參考
#執(zhí)行Nginx worker進(jìn)程的用戶
user nobody;
#啟動(dòng)進(jìn)程,通常設(shè)置成和cpu的數(shù)量相等
worker_processes 1;
#全局錯(cuò)誤日志及pid文件
#nginx的error_log類型如下(從左到右:debug最詳細(xì) crit最少):
#[ debug | info | notice | warn | error | crit ]
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#工作模式及連接數(shù)設(shè)置
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#設(shè)置日志格式,名稱為main,格式為ip-user-時(shí)間-請(qǐng)求地址圈膏。。篙骡。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#a日志保存路徑稽坤,以main格式樣式保存
#access_log logs/access.log main;
#sendfile 指令指定 nginx 是否調(diào)用 sendfile 函數(shù)(zero copy 方式)來輸出文件,
#對(duì)于普通應(yīng)用糯俗,必須設(shè)為 on,
#如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用尿褪,可設(shè)置為 off,
#以平衡磁盤與網(wǎng)絡(luò)I/O處理速度得湘,降低系統(tǒng)的uptime.
sendfile on;
#tcp_nopush on;
#連接超時(shí)時(shí)間
keepalive_timeout 65;
#是否開啟gzip壓縮
#gzip on;
server {
#端口
listen 80;
#服務(wù)器地址杖玲,網(wǎng)址
server_name localhost;
#字符集
charset utf-8;
#設(shè)定本機(jī)的日志路徑,以main日志格式記錄
access_log logs/host.access.log main;
#默認(rèn)請(qǐng)求淘正,定義首頁索引文件的名稱
location / {
root html;
index index.html index.htm;
}
location / {
alias html;
#打開目錄瀏覽功能摆马,輸入/html。會(huì)顯示html目錄下的所有內(nèi)容
autoindex on;
#對(duì)同一ip訪問進(jìn)行限流
set $limit_rate 1M;
index index.html index.htm;
}
#定義錯(cuò)誤提示頁面
#error_page 404 /404.html;
# 將服務(wù)器錯(cuò)誤頁面跳轉(zhuǎn)到靜態(tài)頁面
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}