來了,來了,你們要的Nginx教程來了
一 Nginx簡介
1.1 什么是Nginx
Nginx是一個(gè)高性能的http和反向代理服務(wù)器,其特點(diǎn)是占用內(nèi)存小,并發(fā)能力強(qiáng)。Nginx專為性能優(yōu)化而開發(fā),性能是其最重要的考量,能經(jīng)受高負(fù)載的考驗(yàn),有報(bào)告表明能支持高達(dá)50000個(gè)并發(fā)連接數(shù)。
1.2 反向代理
正向代理:在瀏覽器中配置代理服務(wù)器,通過代理服務(wù)器進(jìn)行互聯(lián)網(wǎng)訪問。
反向代理:將請(qǐng)求發(fā)送到反向代理服務(wù)器,由反向代理服務(wù)器去選擇目標(biāo)服務(wù)器獲取數(shù)據(jù)后,再返回給客戶端,此時(shí)反向代理服務(wù)器和目標(biāo)服務(wù)器對(duì)外就是一個(gè)服務(wù)器,暴漏的是代理服務(wù)器地址。
1.3 負(fù)載均衡
如果請(qǐng)求數(shù)過大,單個(gè)服務(wù)器解決不了,我們?cè)黾臃?wù)器的數(shù)量,然后將請(qǐng)求分發(fā)到各個(gè)服務(wù)器上,將原先請(qǐng)求集中到單個(gè)服務(wù)器的情況改為請(qǐng)求分發(fā)到多個(gè)服務(wù)器上,就是負(fù)載均衡。
1.4 動(dòng)靜分離
為了加快服務(wù)器的解析速度,可以把動(dòng)態(tài)頁面和靜態(tài)頁面交給不同的服務(wù)器來解析,加快解析速度,降低原來單個(gè)服務(wù)器的壓力。
二 Nginx的安裝
Nginx需要幾個(gè)依賴包,分別是pcre,openssl,zlib,在安裝nginx之前需要先安裝這幾個(gè)依賴。
2.1 安裝pcre依賴
使用命令下載
pcre壓縮包
1wget?http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
解壓壓縮文件
1tar?-xvf??pcre-8.37.tar.gz
進(jìn)入解壓后的名錄,執(zhí)行以下命令
1./configure
使用以下命令進(jìn)行編譯安裝
1make?&&?make?install
查看安裝的
pcre版本號(hào)
1pcre-config?--version
2.2 安裝openssl,zlib等依賴
1yum?-y?install?make?zlib?zlib-devel?gcc-c++?libtool?openssl?openssl-devel
2.3 安裝nginx
nginx官網(wǎng)下載nginx,官網(wǎng)地址:https://nginx.org/download/;將壓縮包拖到服務(wù)器上;
使用命令
tar -xvf nginx-1.12.2.tar.gz解壓壓縮包;使用命令
./configure檢查;使用命令
make && make isntall編譯安裝;
安裝成功后,在usr會(huì)多出來一個(gè)文件夾,local/nginx,在nginx的sbin文件夾下有啟動(dòng)腳本。
2.4 啟動(dòng)nginx
在/usr/local/nginx/sbin文件夾下,使用以下命令啟動(dòng)
1./nginx
然后瀏覽器訪問服務(wù)器ip,nginx默認(rèn)端口是80,出現(xiàn)以下頁面則證明nginx安裝成功;

2.5 Nginx常用的命令
使用這些命令時(shí)需要進(jìn)入/usr/local/nginx/sbin文件夾
查看
nginx的版本號(hào)
1./nginx?-v
啟動(dòng)
nginx
1./nginx
關(guān)閉
nginx
1./nginx?-s?stop
重新加載
nginx
1./nginx?-s?reload
2.6 Nginx的配置文件
nginx的配置文件在/usr/local/nginx/conf中的nginx.conf。我們將nginx.conf中注釋的內(nèi)容刪除一下。
1#user??nobody;
2worker_processes??1;
3
4#pid????????logs/nginx.pid;
5
6events?{
7????worker_connections??1024;
8}
9
10http?{
11????include???????mime.types;
12????default_type??application/octet-stream;
13
14????sendfile????????on;
15????#tcp_nopush?????on;
16
17????#keepalive_timeout??0;
18????keepalive_timeout??65;
19
20????#gzip??on;
21
22????server?{
23????????listen???????80;
24????????server_name??localhost;
25
26????????location?/?{
27????????????root???html;
28????????????index??index.html?index.htm;
29????????}
30????}
31}
nginx的配置文件包含三部門。
1.全局塊
從配置文件開始到events塊之間的內(nèi)容,主要會(huì)設(shè)置一些nginx服務(wù)器整體運(yùn)行的配置指令。
1worker_processes??1;
這個(gè)代表nginx處理并發(fā)的關(guān)鍵配置,值越大,處理并發(fā)能力越強(qiáng)。但是會(huì)受到硬件、軟件等約束。
2.events塊
events塊涉及的指令主要影響nginx服務(wù)器與用戶網(wǎng)絡(luò)的連接。
1worker_connections??1024;
這個(gè)代表nginx支持的最大連接數(shù)。
3.http全局塊
nginx服務(wù)器配置最頻繁的部分。http全局塊包含http塊和server塊。
三 Nginx配置反向代理
3.1 ngix代理流程

本地瀏覽器訪問nginx服務(wù)器,nginx服務(wù)器反向代理tomcat服務(wù)器,當(dāng)我們請(qǐng)求nginx的時(shí)候直接訪問到tomcat。tomcat的安裝這里就不在講了,我將tomcat和nginx安裝在了同一臺(tái)服務(wù)器上。
3.2 配置ip和域名的綁定關(guān)系
由于我們的nginx沒有域名,為了演示,因此我們?cè)诒镜?code style="font-size:inherit;color:rgb(248,35,117);">host文件中配置nginx服務(wù)器ip和域名進(jìn)行綁定。這個(gè)host文件的具體位置在C:\Windows\System32\drivers\etc。在host文件中增加一句配置:
147.104.xxx.xxx?www.javatrip.com
前面的ip是服務(wù)器的ip地址,后面的域名是我隨便起的用于綁定這個(gè)ip的一個(gè)域名。配置好之后,我們使用域名訪問一下tomcat,如果能請(qǐng)求到tomcat默認(rèn)頁面,則配置成功。

3.3 在nginx配置請(qǐng)求轉(zhuǎn)發(fā)
1??server?{
2????????listen???????80;
3????????server_name??localhost;
4
5????????location?/?{
6????????????root???html;
7????????????index??index.html?index.htm;
8????????}
9??}
我們將以上默認(rèn)的配置文件做個(gè)修改:
1server?{
2????listen???????80;
3????server_name??47.104.xxx.xxx;
4
5????location?/?{
6????????root???html;
7????????proxy_pass?http://127.0.0.1:8080;
8????????index??index.html?index.htm;
9????}
10}
以上這段配置的意思就是請(qǐng)求是47.104.xxx.xxx:80,都會(huì)轉(zhuǎn)發(fā)至47.104.xxx.xxx:8080。
現(xiàn)在瀏覽器訪問www.javatrip.com,發(fā)現(xiàn)直接轉(zhuǎn)發(fā)到了tomcat上了,這樣簡單的反向代理就完成了。
3.4 根據(jù)請(qǐng)求后綴分發(fā)
我們?cè)俳鈮阂粋€(gè)tomcat,端口號(hào)設(shè)置為8081,分別在兩個(gè)tomcat下webapps目錄下面新建dev和prod目錄,然后在該目錄下寫一個(gè)文件。
將請(qǐng)求www.javatrip.com:7001/dev轉(zhuǎn)發(fā)到tomcat8080,將請(qǐng)求www.javatrip.com:7001/prod轉(zhuǎn)發(fā)到tomcat8081。現(xiàn)在我們的nginx監(jiān)聽的端口號(hào)是7001。打開nginx的配置文件,新建一個(gè)server如下:
1server?{
2????listen???????7001;
3????server_name??47.104.xxx.xxx;
4
5????location?~?/dev/?{
6????????proxy_pass?http://127.0.0.1:8080;
7????}
8
9????location?~?/prod/?{
10????????proxy_pass?http://127.0.0.1:8081;
11????}
12}
然后試試效果,分別訪問www.javatrip.com:7001/dev/a.html和www.javatrip.com:7001/prod/a.html,效果如下:


其中,配置轉(zhuǎn)發(fā)的時(shí)候用到了~,其含義內(nèi)容如下:
= 嚴(yán)格匹配。如果這個(gè)查詢匹配,那么將停止搜索并立即處理此請(qǐng)求。
~ 為區(qū)分大小寫匹配(可用正則表達(dá)式)
!~為區(qū)分大小寫不匹配
~* 為不區(qū)分大小寫匹配(可用正則表達(dá)式)
!~*為不區(qū)分大小寫不匹配
^~ 如果把這個(gè)前綴用于一個(gè)常規(guī)字符串,那么告訴
nginx如果路徑匹配那么不測試正則表達(dá)式。
四 Nginx配置負(fù)載均衡
4.1 什么是負(fù)載均衡
負(fù)載均衡(Load Balance),意思是將負(fù)載(工作任務(wù),訪問請(qǐng)求)進(jìn)行平衡、分?jǐn)偟蕉鄠€(gè)操作單元(服務(wù)器,組件)上進(jìn)行執(zhí)行。是解決高性能,單點(diǎn)故障(高可用),擴(kuò)展性(水平伸縮)的終極解決方案。
現(xiàn)在我們想實(shí)現(xiàn)的效果是通過訪問www.javatrip.com:7001/prod/a.html,將請(qǐng)求分別分發(fā)到兩個(gè)tomcat上面去,首先我們?cè)?code style="font-size:inherit;color:rgb(248,35,117);">tomcat8080上新建一個(gè)prod的文件夾,里面放一個(gè)a.html的文件。這樣tomcat8081和tomcat8080兩個(gè)上就都有了一個(gè)prod的文件加且里面有一個(gè)a.html的文件。
4.2 配置nginx.conf
首先,在http塊中配置兩個(gè)tomcat的服務(wù)列表
1upstream?myserver{
2????server?127.0.0.1:8080;
3????server?127.0.0.1:8081;
4}
其次,在server塊中配置規(guī)則:
1server?{
2????listen???????80;
3????server_name??47.104.xxx.xxx;
4
5????location?/?{
6????????root???html;
7????????proxy_pass?http://myserver;
8????????index??index.html?index.htm;
9????}
10}
4.3 測試效果
訪問地址:www.javatrip.com:7001/prod/a.html,多刷新幾次。發(fā)現(xiàn)有的請(qǐng)求到tomcat8080上,有的請(qǐng)求到tomcat8081上。


4.4 nginx支持的幾種負(fù)載策略
輪詢(默認(rèn)):每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的服務(wù)器,如果服務(wù)器down了,會(huì)自動(dòng)剔除。
1upstream?myserver{
2????server?127.0.0.1:8080;
3????server?127.0.0.1:8081;
4}
weight(權(quán)重):默認(rèn)為1,權(quán)重越高,分配的請(qǐng)求越多。
1upstream?myserver{
2????server?127.0.0.1:8080?weight=1;
3????server?127.0.0.1:8081?weight=2;
4}
ip hash:每個(gè)請(qǐng)求按訪問ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問一個(gè)后臺(tái)服務(wù)器,可以解決
session的問題。
1upstream?myserver{
2????ip_hash;
3????server?127.0.0.1:8080;
4????server?127.0.0.1:8081;
5}
fair(第三方):按后端響應(yīng)時(shí)間進(jìn)行分配,響應(yīng)時(shí)間越短分配的請(qǐng)求越多。
1upstream?myserver{
2????server?127.0.0.1:8080;
3????server?127.0.0.1:8081;
4????fair;
5}
由于動(dòng)靜分離在實(shí)際開發(fā)中也不常用,就不再寫了。本篇文章做為一個(gè)nginx入門,到這里就基本完結(jié)了。最后留給大家一個(gè)問題思考一下:如何保證nginx的高可用?
< END >往期精選??服務(wù)之間調(diào)用還需要鑒權(quán)???Java8——方法引用??Java8——Stream流??Spring Boot讀取配置文件的幾種方式??API接口設(shè)計(jì)規(guī)范??重復(fù)提交,你是如何處理的?
