帶你輕松入門Nginx
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

Java技術(shù)迷?|?出品
何為Nginx
Nginx是一款輕量級(jí)的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,在BSD-like 協(xié)議下發(fā)行。其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上Nginx的并發(fā)能力在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好。以上內(nèi)容來自百度百科,由百度百科給出的介紹我們不難發(fā)現(xiàn),Nginx其實(shí)是一個(gè)反向代理服務(wù)器,作用其實(shí)有很多,最突出的是其負(fù)載均衡能力,Nginx的并發(fā)能力在同類型的網(wǎng)頁服務(wù)器中是較為出色的。
安裝Nginx
首先到官網(wǎng) http://nginx.org/en/download.html 下載Nginx的解壓包:

下載完成后將其上傳至Linux,并進(jìn)行解壓:
tar?-zxvf?nginx-1.21.6.tar.gz解壓完成后進(jìn)入解壓后的目錄:
[root@localhost?opt]#?cd?nginx-1.21.6/
[root@localhost?nginx-1.21.6]#?ls
auto??CHANGES??CHANGES.ru??conf??configure??contrib??html??LICENSE??man??README??src在該目錄下有一個(gè)名為configure的腳本,通過執(zhí)行該腳本即可安裝Nginx:
./configure正常情況下終端會(huì)提示缺少一些環(huán)境:
[root@localhost?nginx-1.21.6]#?./configure
checking?for?OS
?+?Linux?3.10.0-1127.el7.x86_64?x86_64
checking?for?C?compiler?...?not?found
./configure:?error:?C?compiler?cc?is?not?found它提示缺少什么,我們就安裝什么就行。這里的提示信息說的是找不到C語言編譯器,所以來安裝一下C語言的編譯器:
yum?install?-y?gcc安裝完成后,重新執(zhí)行configure腳本,該腳本還可以攜帶參數(shù),比如指定Nginx的安裝路徑:
./configure?--prefix=/usr/local/nginx通過指定prefix參數(shù)即可將Nginx安裝在指定的目錄下。不出意外,此時(shí)終端會(huì)再一次提醒你缺少相應(yīng)的依賴:
./configure:?error:?the?HTTP?rewrite?module?requires?the?PCRE?library.同樣的,安裝上就好了:
yum?install?-y?pcre?pcre-devel安裝完成后再次執(zhí)行configure腳本,終端還是提示缺少相應(yīng)的依賴:
./configure:?error:?the?HTTP?gzip?module?requires?the?zlib?library.把它也安裝上:
yum?install?-y?zlib?zlib-devel再一次來執(zhí)行configure腳本,這應(yīng)該是我們第四次執(zhí)行該腳本了,此時(shí)應(yīng)該是能夠安裝成功了。
接下來執(zhí)行make指令:
make該指令是Linux提供的一個(gè)編譯指令,通過make指令即可對(duì)安裝后的Nginx進(jìn)行編譯操作,編譯完成后進(jìn)行安裝操作:
make?install此時(shí)我們可以來到/usr/local目錄下查看nginx是否安裝成功:
[root@localhost?nginx-1.21.6]#?cd?/usr/local/
[root@localhost?local]#?ls
bin??etc??games??include??lib??lib64??libexec??nginx??sbin??share??src可以看到在該目錄下多出了一個(gè)nginx的目錄,這就是安裝好的nginx了,我們進(jìn)入到nginx的sbin目錄下,通過執(zhí)行nginx腳本即可啟動(dòng)nginx:
cd?nginx
cd?sbin
./nginx此時(shí)在瀏覽器上訪問 http://192.168.33.10/ :

說明nginx啟動(dòng)成功!如果你訪問不到,可以先看看防火墻是不是關(guān)閉狀態(tài),如果不是,那就把防火墻關(guān)閉再訪問試試:
#?查看防火墻狀態(tài)
systemctl?status?firewalld?
#?關(guān)閉防火墻
systemctl?stop?firewalld?若是想停止nginx,則執(zhí)行nginx -s stop指令,事實(shí)上,nginx提供了兩種方式來停止,分別如下:
1.?nginx -s stop
2.?nginx -s quit
這兩種方式的結(jié)果都是一樣的,都會(huì)停止nginx,但過程不同,nginx -s stop是直接停止nginx,而nginx -s quit與之相比要柔和一些,它會(huì)等待已經(jīng)接收的連接請(qǐng)求處理完畢后再結(jié)束。
一般情況下,我們都會(huì)制作一個(gè)nginx腳本服務(wù),然后使用腳本來啟動(dòng)它,這樣的好處是不用來到nginx的sbin目錄執(zhí)行nginx腳本了,當(dāng)我們需要啟動(dòng)nginx時(shí),在任何位置都可以啟動(dòng)。首先創(chuàng)建腳本服務(wù):
touch?/usr/lib/systemd/system/nginx.service在該文件中填入如下內(nèi)容(需要注意的是如果你的nginx不是安裝在/usr/local/nginx下,則需要相應(yīng)地修改下面的路徑):
[Unit]
Description=nginx?-?web?server
After=network.target?remote-fs.target?nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx?-t?-c?/usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx?-c?/usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx?-s?reload
ExecStop=/usr/local/nginx/sbin/nginx?-s?stop
ExecQuit=/usr/local/nginx/sbin/nginx?-s?quit
PrivateTmp=true
[Install]
wantedBy=multi-user.target將其寫入文件后,需要重新加載一下系統(tǒng)服務(wù):
systemctl?daemon-reload現(xiàn)在嘗試使用系統(tǒng)服務(wù)啟動(dòng)nginx:
systemctl?start?nginx.service
#?也可以簡寫成
systemctl?start?nginx查看服務(wù)是否啟動(dòng):
systemctl?status?nginx也可以通過查看進(jìn)程的方式驗(yàn)證:
ps?-ef?|?grep?nginx目錄結(jié)構(gòu)
nginx的目錄結(jié)構(gòu)比較簡單,分別如下:
1.?conf
2.?html
3.?logs
4.?sbin
其中conf為配置文件目錄,里面存放的都是nginx的配置信息:
-rw-r--r--.?1?root?root?1077?Apr?22?07:34?fastcgi.conf
-rw-r--r--.?1?root?root?1077?Apr?22?07:34?fastcgi.conf.default
-rw-r--r--.?1?root?root?1007?Apr?22?07:34?fastcgi_params
-rw-r--r--.?1?root?root?1007?Apr?22?07:34?fastcgi_params.default
-rw-r--r--.?1?root?root?2837?Apr?22?07:34?koi-utf
-rw-r--r--.?1?root?root?2223?Apr?22?07:34?koi-win
-rw-r--r--.?1?root?root?5349?Apr?22?07:34?mime.types
-rw-r--r--.?1?root?root?5349?Apr?22?07:34?mime.types.default
-rw-r--r--.?1?root?root?2656?Apr?22?07:34?nginx.conf
-rw-r--r--.?1?root?root?2656?Apr?22?07:34?nginx.conf.default
-rw-r--r--.?1?root?root??636?Apr?22?07:34?scgi_params
-rw-r--r--.?1?root?root??636?Apr?22?07:34?scgi_params.default
-rw-r--r--.?1?root?root??664?Apr?22?07:34?uwsgi_params
-rw-r--r--.?1?root?root??664?Apr?22?07:34?uwsgi_params.default
-rw-r--r--.?1?root?root?3610?Apr?22?07:34?win-utfnginx.conf為nginx的主要配置文件,其它配置文件都是被該文件引用的。而html目錄存放的是靜態(tài)文件:
-rw-r--r--.?1?root?root?497?Apr?22?07:34?50x.html
-rw-r--r--.?1?root?root?615?Apr?22?07:34?index.html比如訪問nginx時(shí)出現(xiàn)的Welcome to nginx!頁面就是該目錄下的index.html文件。logs目錄存放的是日志文件:
-rw-r--r--.?1?root?root?415?Apr?22?07:49?access.log
-rw-r--r--.?1?root?root?441?Apr?22?09:39?error.logaccess.log是訪問日志,當(dāng)通過nginx訪問某個(gè)資源時(shí)就會(huì)在該文件中被記錄;error.log是錯(cuò)誤日志,當(dāng)然就是用來記錄一些錯(cuò)誤操作了,比如404。最后是sbin目錄,該目錄下只有一個(gè)nginx主進(jìn)程文件,用來啟動(dòng)nginx。
Nginx基礎(chǔ)配置
在nginx中,最為關(guān)鍵的就屬conf目錄下的nginx.conf配置文件了,nginx的所有功能都需要在該配置文件中進(jìn)行配置,nginx.conf文件中的內(nèi)容較多,其中大部門配置都被注釋了,我們將這些被注釋的內(nèi)容先刪掉,看看nginx究竟配置了些什么:
worker_processes??1;
events?{
????worker_connections??1024;
}
http?{
????include???????mime.types;
????default_type??application/octet-stream;
????sendfile????????on;
????keepalive_timeout??65;
????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;
????????}
????}
}其中位于第一行的配置worker_processes 1表示開始一個(gè)業(yè)務(wù)進(jìn)程,在nginx中的工作模式是這樣的,nginx會(huì)開啟一個(gè)master進(jìn)程和多個(gè)worker進(jìn)程,這里的worker進(jìn)程就是業(yè)務(wù)進(jìn)程,master進(jìn)程并不處理業(yè)務(wù),而是負(fù)責(zé)調(diào)度worker進(jìn)程,業(yè)務(wù)由worker進(jìn)程負(fù)責(zé)處理。所以這里配置的就是worker進(jìn)程數(shù)了,通過ps -ef命令可以查看到nginx的詳細(xì)進(jìn)程:
[root@localhost?sbin]#?ps?-ef?|?grep?nginx
root??????1074?????1??0?09:49??????????00:00:00?nginx:?master?process?./nginx
nobody????1075??1074??0?09:49??????????00:00:00?nginx:?worker?process
root??????1077???932??0?09:49?pts/0????00:00:00?grep?--color=auto?nginx第二個(gè)配置worker_connections 1024表示每個(gè)worker進(jìn)程可以創(chuàng)建的連接數(shù)。
include mime.types表示引入了一個(gè)名為mime.types的外部配置文件。這里又需要介紹一下mime.types的作用了,來看看這個(gè)文件里都是些什么內(nèi)容:
types?{
????text/html????????????????????????????????????????html?htm?shtml;
????text/css?????????????????????????????????????????css;
????text/xml?????????????????????????????????????????xml;
????image/gif????????????????????????????????????????gif;
????image/jpeg???????????????????????????????????????jpeg?jpg;
????application/javascript???????????????????????????js;
????application/atom+xml?????????????????????????????atom;
????application/rss+xml??????????????????????????????rss;
????......
}這里截取了一部分,但能夠看出這似乎是一個(gè)映射表,其實(shí)它是用來告訴瀏覽器返回的資源類型的,不知道大家有沒有注意過,當(dāng)你在瀏覽器上訪問一張圖片時(shí),瀏覽器會(huì)直接顯示圖片,而當(dāng)你訪問的是一個(gè).exe可執(zhí)行文件時(shí),瀏覽器又會(huì)進(jìn)行下載。那么瀏覽器是如何知道什么資源需要顯示,而什么資源又需要下載呢?其實(shí),瀏覽器靠的是請(qǐng)求頭中的資源類型來辨別的,我們來訪問一張百度的logo圖片:

再來訪問一個(gè)可執(zhí)行文件:

發(fā)現(xiàn)區(qū)別了嗎,它們的Content-Type值是不同的,瀏覽器正是通過這些值才能夠?qū)Σ煌馁Y源做出不同的處理。回到nginx中的mime.types文件,它是用來對(duì)資源做一個(gè)對(duì)應(yīng)的,舉個(gè)例子,如果文件是html、htm、shtml,那么nginx會(huì)統(tǒng)一返回Content-Type:text/html給瀏覽器;而如果文件是jpeg、jpg,那么nginx會(huì)統(tǒng)一返回Content-Type:image/jpeg給瀏覽器,這個(gè)告知資源類型的過程是由該文件完成的。事實(shí)上,互聯(lián)網(wǎng)中的文件類型非常多,這個(gè)文件不可能全部都能例舉到,如果有沒映射的類型,你當(dāng)然可以手動(dòng)將映射添加到mime.types中,比如:
type{
??......
??video/mp4????mp4?mp7?mp8;
??......
}通過這段配置,如果文件類型為mp4、mp7、mp8,nginx將統(tǒng)一返回給瀏覽器video/mp4類型。
default_type application/octet-stream表示的是如果在mime.types文件中沒有找到對(duì)應(yīng)的映射,則統(tǒng)一返回給瀏覽器application/octet-stream類型,這是一個(gè)兜底的方案。
sendfile on指的是數(shù)據(jù)零拷貝,當(dāng)你通過nginx下載一個(gè)資源時(shí),因?yàn)閚ginx始終還是個(gè)運(yùn)行在操作系統(tǒng)中的軟件,所以網(wǎng)絡(luò)請(qǐng)求一定是先由操作系統(tǒng)接收,操作系統(tǒng)再將請(qǐng)求交給nginx,nginx再從磁盤上獲取到用戶請(qǐng)求的資源,先將其讀取到nginx的緩存中,再將其復(fù)制到操作系統(tǒng)的緩存,最后由操作系統(tǒng)交給客戶端。以上是不開啟數(shù)據(jù)零拷貝的情況,如果開啟了數(shù)據(jù)零拷貝,則nginx將資源賦值給操作系統(tǒng)的這一步驟會(huì)被省略,操作系統(tǒng)將直接從磁盤上讀取資源并交給客戶端,這就是該項(xiàng)配置的作用。
keepalive_timeout 65指的是保持連接的超時(shí)時(shí)間。
接下來是整個(gè)配置文件中較為重要的一段配置:
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中的一個(gè)主機(jī),在nginx中可以配置多個(gè)主機(jī),每個(gè)主機(jī)相當(dāng)于是一個(gè)獨(dú)立的站點(diǎn),主機(jī)之間相互并不影響。其中listen 80表示監(jiān)聽80端口,server_name localhost表示當(dāng)前主機(jī)的主機(jī)名,而location /{}表示匹配請(qǐng)求的URI資源,當(dāng)匹配上了資源后,就會(huì)進(jìn)入location配置塊,在該配置塊中,root html指的是資源目錄,此時(shí)的資源將從nginx中的html目錄中尋找。?error_page 500 502 503 504 /50x.html表示當(dāng)產(chǎn)生這幾個(gè)狀態(tài)碼的錯(cuò)誤時(shí),將訪問/50x.html資源,而下面的location = /50x.html{}剛好配置的是這個(gè)資源,它將從nginx的html目錄下尋找這個(gè)資源。
server_name
在前面我們就介紹到了server_name,它表示的是當(dāng)前主機(jī)的主機(jī)名,也就是說,只有當(dāng)請(qǐng)求匹配到了該主機(jī)名,對(duì)應(yīng)的主機(jī)配置才會(huì)生效,舉一個(gè)例子,在nginx.conf中配置兩個(gè)主機(jī):
http?{
????include???????mime.types;
????default_type??application/octet-stream;
????sendfile????????on;
????keepalive_timeout??65;
????server?{
????????listen???????80;
????????server_name??www.test1.com;
????????location?/?{
????????????root???/mysite/test1;
????????????index??index.html?index.htm;
????????}
????????error_page???500?502?503?504??/50x.html;
????????location?=?/50x.html?{
????????????root???html;
????????}
????}
????server?{
????????listen???????80;
????????server_name??www.test2.com;
????????location?/?{
????????????root???/mysite/test2;
????????????index??index.html?index.htm;
????????}
????????error_page???500?502?503?504??/50x.html;
????????location?=?/50x.html?{
????????????root???html;
????????}
????}
}在這段配置中一共配置了兩個(gè)主機(jī),這兩個(gè)主機(jī)分別指向/mysite目錄下的兩個(gè)資源,所以先來創(chuàng)建這兩個(gè)資源,在Linux根目錄/下創(chuàng)建mysite目錄,并在mysite目錄下分別創(chuàng)建test1和test2目錄,這兩個(gè)目錄下分別有一個(gè)index.html文件。
[root@localhost?mysite]#?pwd
/mysite
[root@localhost?mysite]#?ll
total?0
drwxr-xr-x.?2?root?root?24?May??3?11:51?test1
drwxr-xr-x.?2?root?root?24?May??3?11:51?test2接著在Windows的hosts文件中配置一下域名映射:
192.168.33.10?www.test1.com
192.168.33.10?www.test2.com現(xiàn)在試著訪問一下這兩個(gè)站點(diǎn),首先是www.test1.com:

其次是www.test2.com:

而事實(shí)上,對(duì)于監(jiān)聽相同端口的不同域名,如果它們獲取的資源需要是一樣的,那么它們可以配置在一個(gè)server塊中:
server?{
????????listen???????80;
????????server_name??www.test1.com;
????????server_name??www.test2.com;
????????location?/?{
????????????root???/mysite/test1;
????????????index??index.html?index.htm;
????????}
????????error_page???500?502?503?504??/50x.html;
????????location?=?/50x.html?{
????????????root???html;
????????}
}也可以將域名配置寫在一個(gè)server_name上:
server?{
????????listen???????80;
????????server_name??www.test1.com;?www.test2.com;
}此時(shí)訪問www.test1.com和www.test2.com都將顯示的是test1 page!?server_name還支持通配符配置,比如我想配置一個(gè)以任何前綴開始的域名都能訪問到test1 page!,那么就需要這樣配置:
server?{
????????listen???????80;
????????server_name??*.test1.com;
????????location?/?{
????????????root???/mysite/test1;?#?指向test1資源
????????????index??index.html?index.htm;
????????}
????????error_page???500?502?503?504??/50x.html;
????????location?=?/50x.html?{
????????????root???html;
????????}
}比如訪問abc.test1.com:

而如果將通配符寫在后面,將會(huì)匹配以任何后綴結(jié)尾的域名:
server?{
????????listen???????80;
????????server_name??www.test1.com.*;
????????location?/?{
????????????root???/mysite/test2;?#?指向test2資源
????????????index??index.html?index.htm;
????????}
????????error_page???500?502?503?504??/50x.html;
????????location?=?/50x.html?{
????????????root???html;
????????}
}此時(shí)訪問諸如www.test1.com.net、www.test1.com.org,都將訪問到test2 page!頁面:

server_name還支持正則匹配域名,這里也舉一個(gè)例子:
server?{
????????listen???????80;
????????server_name??~^[0-9]+\.test1\.com$;
????????location?/?{
????????????root???/mysite/test1;?#?指向test1資源
????????????index??index.html?index.htm;
????????}
????????error_page???500?502?503?504??/50x.html;
????????location?=?/50x.html?{
????????????root???html;
????????}
}此時(shí)所有以數(shù)字開頭,以.test1.com結(jié)尾的域名都將匹配到test1資源。
本文作者:汪偉俊?為Java技術(shù)迷專欄作者?投稿,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載
????
往 期 推 薦
1、拖動(dòng)文件就能觸發(fā)7-Zip安全漏洞,波及所有版本
3、一次 SQL 查詢優(yōu)化原理分析:900W+ 數(shù)據(jù),從 17s 到 300ms
4、Redis數(shù)據(jù)結(jié)構(gòu)為什么既省內(nèi)存又高效?
點(diǎn)分享
點(diǎn)收藏
點(diǎn)點(diǎn)贊
點(diǎn)在看





