nginx的編譯安裝、添加模塊、yum安裝哎榴、簡單配置托慨、默認目錄作用和靜態(tài)頁面配置坞琴。
0柬泽、編譯安裝nginx
0.1 準備工作
這里我們使用nginx的mainline版本的1.17.9來進行編譯安裝窥翩,nginx各版本的官網(wǎng)下載地址:http://nginx.org/en/download.html
首先我們下載并解壓nginx源碼
wget http://nginx.org/download/nginx-1.17.9.tar.gz
tar -zxvf nginx-1.17.9.tar.gz
在編譯安裝之前我們還需要先安裝幾個別的軟件:
GCC/G++編譯器:GCC(GNU Compiler Collection)可用來編譯C語言程序范咨,如果你還需要使用C++來編寫Nginx HTTP模塊熊楼,這時還需要用到G++編譯器了峦睡。
PCRE庫:PCRE(Perl Compatible Regular Expressions辣往,Perl兼容正則表達式)是由Philip Hazel開發(fā)的函數(shù)庫驼侠,目前為很多軟件所使用姿鸿,該庫支持正則表達式。實際上在nginx的很多高級配置中都會用到正則表達式倒源,因此我們在編譯Nginx時盡量先把PCRE庫編譯進Nginx苛预。
zlib庫:zlib庫用于對HTTP包的內(nèi)容做gzip格式的壓縮,我們可以在nginx.conf里配置了gzip on笋熬,并指定對于某些類型(content-type)的HTTP響應(yīng)使用gzip來進行壓縮以減少網(wǎng)絡(luò)傳輸量热某。
-
OpenSSL開發(fā)庫:HTTPS必備,這個就不用解釋了
上面提到的庫我們都可以使用yum來進行安裝:
yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
# pcre-devel是使用PCRE做二次開發(fā)時所需要的開發(fā)庫胳螟,包括頭文件等昔馋,這也是編譯Nginx所必須使用的。
# 同理糖耸,zlib是直接使用的庫秘遏,zlib-devel是二次開發(fā)所需要的庫。
Nginx是高度自由化的Web服務(wù)器蔬捷,它的功能是由許多模塊來支持的垄提。而這些模塊可根據(jù)我們的使用需求來定制,如果某些模塊不需要使用則完全不必理會它周拐。同樣铡俐,如果使用了某個模塊,而這個模塊使用了一些類似zlib或OpenSSL等的第三方庫妥粟,那么就必須先安裝這些軟件审丘。
0.2 編譯安裝
我們進入nginx的目錄,輸入下面的指令可以查看各類的編譯參數(shù)勾给,或者在官網(wǎng)也可以看到:
./configure --help
我們這里使用的參數(shù)是:
./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module
這里我們可以看到滩报,我們在參數(shù)里面并沒有指定上面提到的幾個庫的目錄锅知,configure文件會默認系統(tǒng)已經(jīng)安裝的庫版本和目錄,當(dāng)然我們也可以手動指定某個庫的目錄來指定版本脓钾。
接下來進行make安裝:
make
make install
如無意外此時應(yīng)該已經(jīng)正常安裝好了售睹,我們到前面指定的安裝目錄看一下
注意這個時候我們?nèi)绻枰褂胣ginx需要指定這個安裝目錄,想要全局使用我們可以創(chuàng)建一個軟鏈接:
ln -s /usr/local/nginx/nginx /usr/sbin/nginx
0.3 添加模塊
同時可训,如果之后有需要用到的模塊而在編譯安裝的時候忘了安裝也沒關(guān)系昌妹,我們可以繼續(xù)編譯添加新模塊
首先我們需要查看已經(jīng)編譯的參數(shù):
[root@localhost ~]# nginx -V
nginx version: nginx/1.17.9
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-23) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module
需要注意上面的V是大寫的V
在configure arguments:
這一欄里面我們就可以看到之前編譯的時候的參數(shù),對比上面的記錄我們可以看到是一模一樣的握截,然后我們會到之前下載的源碼目錄飞崖,注意是源碼的目錄不是安裝的目錄,然后添加上之前的編譯參數(shù)谨胞,再添加新的模塊固歪,
./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-http_v2_module --with-mail --with-mail_ssl_module
比如這里我們添加了http_v2
、mail
胯努、mail_ssl
三個模塊
如果想要添加第三方模塊的話牢裳,只需要使用--add-module=
然后加上第三方模塊的路徑即可。
--add-module=/home/echo-nginx-module-0.61
最后我們的編譯參數(shù)是:
./configure \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--add-module=/home/echo-nginx-module-0.61
接著我們使用make安裝康聂,再查看目錄會發(fā)現(xiàn)原來的文件已經(jīng)被替換成*.default
了
make
make install
最后我們再確定一下是否安裝成功:
1贰健、yum安裝nginx
1.1 yum倉庫建立和安裝配置
centos自帶的repo中就有nginx,可以直接安裝恬汁,但是版本比較舊伶椿,想要使用yum進行安裝最新的穩(wěn)定版本,我們需要自行配置yum倉庫氓侧。
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
默認情況下mainline版本是不會啟用的脊另,因此我們?nèi)绻枰惭bmainline版本的nginx則需要手動啟用這個repo。
yum install yum-utils
yum-config-manager --enable nginx-mainline
yum clean all
yum repolist
yum install nginx
安裝的時候需要注意這個列出信息中的repo應(yīng)該是我們剛剛新建的repo约巷。
安裝完成之后需要設(shè)置開機啟動和防火墻放行80端口偎痛,如果使用https還需要放行443端口。
systemctl enable nginx
systemctl start nginx
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --reload
接下來我們可以測試一下安裝和啟動是否成功独郎。
nginx -v
curl 127.0.0.1
1.2 master和worker進程
使用ps命令查看進程踩麦,我們可以看到有一個master進程和一個worker進程,默認情況下氓癌,worker的進程數(shù)量為1谓谦,實際上我們可以根據(jù)具體需要對其進行修改。
ps -ef | grep nginx
在正式提供服務(wù)的產(chǎn)品環(huán)境下贪婉,部署Nginx時都是使用一個master進程來管理多個worker進程反粥,一般情況下,worker進程的數(shù)量與服務(wù)器上的CPU核心數(shù)相等。每一個worker進程都是繁忙的才顿,它們在真正地提供互聯(lián)網(wǎng)服務(wù)莫湘,master進程則很“清閑”,只負責(zé)監(jiān)控管理worker進程郑气。worker進程之間通過共享內(nèi)存幅垮、原子操作等一些進程間通信機制來實現(xiàn)各種功能。
2竣贪、nginx基本配置
2.1 nginx默認目錄
/etc/nginx/
這個是nginx服務(wù)器的默認配置目錄
/etc/nginx/nginx.conf
這個是nginx服務(wù)器的默認配置文件军洼,我們可以在這里對nginx的所有全局配置進行修改,包括線程數(shù)端口號等等演怎,同時在默認情況下它也包括了下述的/etc/nginx/conf.d/
目錄中的所有配置文件。
/etc/nginx/conf.d/
這個目錄中包含的.conf
配置文件主要用于單獨定義某個http網(wǎng)頁避乏,從而使得整個配置目錄文件的管理變得更加簡潔而清晰爷耀。
/var/log/nginx
這個目錄是默認的log日志目錄,主要有acces.log
和error.log
兩個文件拍皮,前者負責(zé)記錄每一個被訪問的記錄歹叮,后者負責(zé)記錄訪問中出現(xiàn)的錯誤。
2.2 nginx命令
輸入nginx -h
即可查看所有指令铆帽,不需要特意去記憶咆耿,用多了就自然記住了。
3爹橱、nginx.conf文件
我們把整個全局配置文件拿出來分析一下:
user nginx;
worker_processes 16;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
3.1 user
user
指的是以哪個用戶來創(chuàng)建nginx的worker進程萨螺,master進程一般都是使用root用戶啟動,權(quán)限較大愧驱。
3.2 worker_processes
worker_processes
則是nginx的worker進程數(shù)量慰技,一般與CPU的核心數(shù)量一致,這里我們設(shè)置為16组砚。
3.3 error_log
error_log
是日志的存放位置和輸出等級吻商,等級的取值范圍是debug
、info
糟红、notice
艾帐、warn
、error
盆偿、crit
柒爸、alert
、emerg
陈肛,從左至右級別依次增大揍鸟。當(dāng)設(shè)定為一個級別時,大于或等于該級別的日志都會被輸出到記錄文件中,小于該級別的日志則不會輸出阳藻。這里默認設(shè)定的是warn級別晰奖,則warn
、error
腥泥、crit
匾南、alert
、emerg
級別的日志都會輸出蛔外。
如果設(shè)定的日志級別是
debug
蛆楞,則會輸出所有的日志,這樣數(shù)據(jù)量會很大夹厌,要確保存放日志的硬盤有足夠的空間豹爹,同時,如果需要開啟日志的debug
功能矛纹,需要在編譯安裝的時候在configure
時加入--with-debug
配置項臂聋,如果不確定是否開啟了debug
功能,可以輸入nginx -V
查看所有的configure arguments
或南。
3.4 pid
pid
是nginx
的master
進程的pid
文件孩等,理論上應(yīng)該和查找的nginx
進程中master
進程的PID
以及worker
進程的PPID
一致。
3.5 塊配置
接下來的events
和http
都是屬于模塊或者塊采够。最基本的配置項語法格式為配置項名 配置項值1 配置項值2 … ;
- 一個配置項以英文分號
;
結(jié)束肄方,中間的值使用空格隔開 - 塊配置項由一個塊配置項名和一對大括號組成。
- 塊配置項可以嵌套蹬癌,內(nèi)層塊直接繼承外層塊权她。
- 當(dāng)內(nèi)外層塊中的配置發(fā)生沖突時,究竟是以內(nèi)層塊還是外層塊的配置為準冀瓦,取決于解析這個配置項的模塊伴奥。
- 注釋部分使用井號
#
比如上面的log_format
這個配置項,變量需要在前面加上美刀符號$
翼闽,如果變量之間有空格拾徙,需要使用單引號或者雙引號避免語法錯誤,同時引號可以嵌套使用感局。同時需要注意的是尼啡,并不是所有的模塊都支持使用變量。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
3.6 單位
當(dāng)指定空間大小時询微,可以使用的單位包括:
- K或者k千字節(jié)(KiloByte崖瞭,KB)
- M或者m兆字節(jié)(MegaByte,MB)
當(dāng)指定時間時撑毛,可以使用的單位包括:
- ms(毫秒)
- s(秒)
- m(分鐘)
- h(小時)
- d(天)
- w(周书聚,7天)
- M(月,30天)
- y(年,365天)
單位之間支持混合使用雌续,如1h30m
即為90m
如果不指定后綴斩个,那么默認使用s(秒)
作為單位。
配置項后的值究竟是否可以使用這些單位驯杜,取決于解析該配置項的模塊受啥。如果這個模塊使用了Nginx框架提供的相應(yīng)解析配置項方法,那么配置項值才可以攜帶單位鸽心。
4滚局、nginx配置靜態(tài)頁面
接下來我們嘗試配置一個簡單的靜態(tài)頁面,使用vim對/etc/nginx/conf.d/default.conf
進行修改顽频,需要注意的是默認情況下/etc/nginx/conf.d/
下面的配置文件只要是.conf
即可生效藤肢,前面的名稱并沒有特殊限制,所以最好根據(jù)文件的實際用途進行命名方便記憶和管理糯景。
接下來我們在/etc/hosts
中將 www.example.com www.example.org www.example.net example.com example.org example.net
的DNS解析手動指定為本機IP地址谤草,方便后面使用域名進行配置頁面
4.1 default_server
[root@localhost conf.d]# ll
總用量 16
-rw-r--r-- 1 root root 1093 3月 4 00:20 default.conf.bak
-rw-r--r-- 1 root root 158 3月 18 00:08 example.com.conf
-rw-r--r-- 1 root root 158 3月 18 00:09 example.net.conf
-rw-r--r-- 1 root root 173 3月 18 00:11 example.org.conf
[root@localhost conf.d]# cat example.*
server {
listen 80;
server_name example.com www.example.com;
location / {
root /var/www/html;
index example.com.html;
}
}
server {
listen 80;
server_name example.net www.example.net;
location / {
root /var/www/html;
index example.net.html;
}
}
server {
listen 80 default_server;
server_name example.org www.example.org;
location / {
root /var/www/html;
index example.org.html;
}
}
這里我們可以看到上面配置了三個server塊,分別對應(yīng)三組域名莺奸,三組域名都是指向本機的IP地址,同樣都是監(jiān)聽的80端口冀宴,其中我們在第三個server塊中指定了default_server
參數(shù)灭贷,此時我們訪問本機IP,返回的頁面就是我們指定了default_server
參數(shù)的這個頁面略贮。
如果我們不指定default_server
參數(shù)甚疟,返回的則是默認的第一個頁面。
4.2 location
location塊的默認語法如下逃延,官網(wǎng)文檔點這里览妖。
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
主要作用是根據(jù)請求URI設(shè)置配置,location可以由前綴字符串或正則表達式定義揽祥。
- 正則表達式由前面的
~*
修飾符(不區(qū)分大小寫)或~
修飾符(不區(qū)分大小寫)指定讽膏。 - 優(yōu)先順序是,nginx首先檢查使用前綴字符串定義的位置(前綴位置)拄丰,其中府树,將選擇并記住具有最長匹配前綴的位置。
- 然后按照在配置文件中出現(xiàn)的順序檢查正則表達式料按。
- 正則表達式的搜索在第一個匹配項上終止奄侠,并使用相應(yīng)的配置。
- 如果未找到與正則表達式匹配的內(nèi)容载矿,則使用前面記住的前綴位置的配置垄潮。
我們來看一下實例:
server {
listen 80;
server_name example.com www.example.com;
location / {
root /var/www/html;
index example.com.html;
}
location /images {
root /var/www;
}
}
我們先來看一個server
塊,這里我們可以看到里面包含了兩個location
塊,在/var/www/html
和/var/www
這兩個目錄下均有一個images
文件夾弯洗,但是在www
目錄下的images
文件夾沒有images2.html
這個文件旅急。
接著我們嘗試訪問:
可以看到因為我們在www
目錄下的images
文件夾沒有images2.html
這個文件,所以在執(zhí)行curl example.com/images/images2.html
的時候返回了404請求涂召。
所以我們可以得到結(jié)論坠非,當(dāng)訪問域名后面的目錄(如這里的/images/
),如果在server
塊里面單獨定義了一個相關(guān)的location
塊果正,則只會在這個/images/
目錄相關(guān)location
塊定義的目錄中去查找炎码,不存在則返回404,并不會再去根目錄/
的location
塊中的目錄中查找秋泳。