為什么使用Nginx
截至2020年,差不多世界上每3個網(wǎng)站中就有1個使用Nginx讲仰。
Nginx以事件驅(qū)動的方式編寫,所以有非常好的性能痪蝇,同時也是一個非常高效的反向代理鄙陡、負載平衡服務(wù)器。在性能上躏啰,Nginx占用很少的系統(tǒng)資源趁矾,能支持更多的并發(fā)連接,達到更高的訪問效率丙唧;在功能上愈魏,Nginx是優(yōu)秀的代理服務(wù)器和負載均衡服務(wù)器觅玻;在安裝配置上想际,Nginx安裝簡單、配置靈活溪厘。
Nginx支持熱部署胡本,啟動速度特別快,還可以在不間斷服務(wù)的情況下對軟件版本或配置進行升級畸悬,即使運行數(shù)月也無需重新啟動侧甫。
在微服務(wù)的體系之下,Nginx正在被越來越多的項目采用作為網(wǎng)關(guān)來使用蹋宦,配合Lua做限流披粟、熔斷等控制
nginx特性
l 輕量級(對硬件資源消耗),高性能http服務(wù)器
l 高性能反向代理服務(wù)器
l 基于模塊化設(shè)計
l 基于EPOLL事件驅(qū)動模型
l 帶緩存的日志寫操作
l URL重寫(rewrite)模塊
l 支持驗證HTTP referer,實現(xiàn)反倒鏈機制
l 支持緩存功能
l 在線升級
nginx服務(wù)架構(gòu)
Nginx啟動時會啟動一個主進程master及多個子進程worker冷冗;配置緩存時還會啟動cache load和cache manager進程守屉。所有進程以"共享內(nèi)存"機制完成進程間通信;master進程以特權(quán)用戶運行蒿辙,其他進程以非特權(quán)用戶運行拇泛。
? Master主進程主要完成如下工作
① 讀取并驗證配置文件
② 創(chuàng)建滨巴、綁定、及關(guān)閉套接字socket(IP:port)
③ 啟動俺叭、終止及維護worker進程的個數(shù)
④ 無須中止服務(wù)而重新配置工作特性
⑤ 控制非中斷式程序升級恭取,啟用新的二進制程序并在需要時回滾至老版本
⑥ 重新打開日志文件
⑦ 編譯嵌入式perl腳本
? Worker進程主要完成如下工作
① 接收、傳入并處理客戶端的連接
② 提供反向代理及過濾功能
③ IO調(diào)用熄守,獲取響應(yīng)數(shù)據(jù)
④ 與后端服務(wù)器通信蜈垮,接收后端服務(wù)器處理結(jié)果
⑤ 數(shù)據(jù)緩存、訪問緩存索引裕照、查詢和調(diào)用緩存數(shù)據(jù)
⑥ 發(fā)送請求結(jié)果窃款,響應(yīng)客戶端請求
⑦ 接收主程序指令,比如重啟牍氛、退出晨继、升級等
nginx部署
nginx安裝分為yum安裝、編譯安裝搬俊。yum安裝要配置yum倉庫紊扬。一般使用epel源來這安裝。yum安裝比較簡單唉擂,下面為編譯安裝案例餐屎。
nginx編譯部署
上傳所需要的nginx包,這里使用的是nginx1.16.1
下載編譯安裝nginx玩祟,keepalived所需要的基礎(chǔ)命令以及依賴
yum install -y vim unzip openssh-clients gcc openssl-devel make kernel-devel gcc-c++ zlib-devel pcre-devel gcc
為了路徑一致性和整潔性在/app下創(chuàng)建nginx文件夾
mkdir -p /app/nginx
編譯安裝nginx
將上傳的nginx包解壓到/app/nginx目錄下
tar -xvf /media/nginx-1.16.1.tar.gz -C /app/nginx/
切換到nginx1.16.1版本 解壓目錄下
cd /app/nginx/nginx-1.16.1/ ./configure --prefix=/app/nginx/
configure命令是用來檢測你的安裝平臺的目標(biāo)特征的腹缩。它定義了系統(tǒng)的各個方面,包括nginx的被允許使用的連接處理的方法空扎,比如它會檢測你是不是有CC或GCC藏鹊,并不是需要CC或GCC,它是個shell腳本转锈,執(zhí)行結(jié)束時盘寡,它會創(chuàng)建一個Makefile文件。
開始編譯安裝nginx
make && make install
編譯安裝支持以下參數(shù)
nginx的configure命令支持以下參數(shù):
--prefix=path
定義nginx的安裝目錄
--sbin-path=path
設(shè)置nginx的可執(zhí)行文件的路徑
--conf-path=path
nginx允許使用不同的配置文件啟動撮慨,通過命令行中的-c選項
--pid-path=path
設(shè)置nginx.pid文件竿痰,將存儲的主進程的進程號
--error-log-path=path
設(shè)置主錯誤,警告砌溺,和診斷文件的名稱
--http-log-path=path
設(shè)置主請求的HTTP服務(wù)器的日志文件的名稱
--user=name
nginx工作進程的用戶影涉。可以在nginx.conf配置文件中 使用的 user指令
--group=name
設(shè)置nginx工作進程的用戶組规伐⌒非悖可以在nginx.conf配置文件中 使用的 user指令
--with-select_module --without-select_module
啟用或禁用構(gòu)建一個模塊來允許服務(wù)器使用select()方法。該模塊將自動建立楷力,如果平臺不支持的kqueue喊式,epoll孵户,rtsig或/dev/poll。
--with-poll_module --without-poll_module
啟用或禁用構(gòu)建一個模塊來允許服務(wù)器使用poll()方法岔留。該模塊將自動建立夏哭,如果平臺不支持的kqueue,epoll献联,rtsig或/dev/poll竖配。
--without-http_gzip_module
不編譯壓縮的HTTP服務(wù)器的響應(yīng)模塊。編譯并運行此模塊需要zlib庫里逆。
--without-http_rewrite_module
不編譯重寫模塊进胯。編譯并運行此模塊需要PCRE庫支持。
--without-http_proxy_module
不編譯http_proxy模塊原押。
--with-http_ssl_module
使用https協(xié)議模塊胁镐。默認(rèn)沒有被構(gòu)建。建立并運行此模塊的OpenSSL庫是必需的诸衔。
--with-pcre=path
設(shè)置PCRE庫的源碼路徑 盯漂。
--with-pcre-jit
編譯PCRE包含“just-in-time compilation”(1.1.12中, pcre_jit指令)笨农。
--with-zlib=path
設(shè)置的zlib庫的源碼路徑
--with-cc-opt=parameters
設(shè)置額外的參數(shù)將被添加到CFLAGS變量
--with-ld-opt=parameters —設(shè)置附加的參數(shù)
常見編譯nginx安裝出錯
錯誤1: ./configure: error: the HTTP rewrite module requires the PCRE library. 解決方案: yum install -y pcre-devel 錯誤2: ./configure: error: SSL modules require the OpenSSL library. 解決方案: yum install -y openssl-devel make && make install 或者指定 OpenSSL
執(zhí)行啟動文件查看狀態(tài)
編譯安裝成功就缆。
安裝依賴模塊
如果需要的話,可以在編譯./configure的時候?qū)⑿枰囊蕾嚹K包安裝上
一般需要先裝pcre 為了重寫rewrite
① 選定源碼目錄
可以是任何目錄谒亦,本文選定的是/usr/local/src
cd /usr/local/src
② 下載安裝PCRE庫
cd /usr/local/src wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
③ 安裝PCRE庫
tar -zxvf pcre-8.44.tar.gz cd pcre-8.44 ./configure make make install
安裝zlib庫為了gzip壓縮
④ 選定源碼目錄
可以是任何目錄竭宰,本文選定的是/usr/local/src
cd /usr/local/src
⑤ 下載安裝 zlib 庫
cd /usr/local/src wget http://zlib.net/zlib-1.2.11.tar.gz
⑥ 安裝zlib庫
tar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./configure make make install
安裝ssl(有些vps默認(rèn)沒裝ssl或者版本過低)
⑦ 下載安裝 openssl 庫
cd /usr/local/src wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
⑧ 安裝 openssl庫
tar -zxvf openssl-1.1.1g.tar.gz cd openssl-1.1.1g ./configure make make install
全局配置
事件驅(qū)動類型
修改liunx默認(rèn)最大文件數(shù)命令如下
cat <<EOF > /etc/security/limits.d/99-nofile.conf root soft nofile 102400 root hard nofile 102400 EOF
事件驅(qū)動模型對比
select,poll和epoll
select poll
select每次收集事件時份招,比如有100萬連接的套接字切揭,會把他們?nèi)慷紓鹘o系統(tǒng),交給操作系統(tǒng)來尋找這些連接上有沒有未處理的事件脾还,會占用巨大的資源來處理伴箩,往往在select收集事件的連接時,這100萬的連接中的大部分都是沒有事件發(fā)生的鄙漏。
epoll如何處理
它在Linux內(nèi)核中申請了一個簡易的文件系統(tǒng),把原先的一個select或者poll調(diào)用分成了3個部分:
- 調(diào)用 epoll_create建立1個epoll對象(在epoll文件系統(tǒng)中給這個句柄分配資源)
- 調(diào)用 epoll_ctl向epoll對象中添加這100萬個連接的套接字
- 調(diào)用 epoll_wait 收集發(fā)生事件的連接棺蛛。
這樣怔蚌,只需要在進程啟動時建立1個epoll對象,并在需要的時候向它添加或刪除連接就可以了旁赊,因此桦踊,在實際收集事件時,epoll_wait的效率就會非常高终畅,因為調(diào)用epoll_wait時并沒有向它傳遞這100萬個連接籍胯,內(nèi)核也不需要去遍歷全部的連接竟闪。
網(wǎng)站服務(wù)配置
整體規(guī)劃:
http {
server {
location { }
location { }
location { }
}
}
server{ } 一對server就是nginx的一個虛擬主機
location{ } 定義客戶端的URI地址,根據(jù)URI地址不同杖狼,給客戶端不同的響應(yīng),需要使用正則表達式
具體配置:
$remote_addr: 客戶端地址
$remote_user: 客戶端用戶
$time_local: 訪問時間
$request: HTTP請求(方法炼蛤、HTTP版本、URI地址)
$status HTTP狀態(tài)碼
$body_bytes_sent HTTP請求報文大小
$http_referer 超鏈接地址
$http_user_agent 客戶端瀏覽器類型
$http_x_forwarded_for 客戶端地址
location配置示例
客戶端所訪問的URI的地址其實是location里面的root后面的目錄名+location后面的URI的組合
示例1:希望客戶端訪問ip就可以看到下面的首頁
mkdir -p /web/htdocs echo "Nginx test page" > /web/htdocs/index.html
修改默認(rèn)的location
vim /app/nginx/conf/nginx.conf
location / { root /web/htdocs; index index.html index.htm; }
檢查nginx語法
/app/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
重新加載配置文件
/app/nginx/sbin/nginx -s reload
測試
links --dump 192.168.122.153
Nginx test page
示例2:客戶端訪問http://192.168.122.153/bbs , 可看到/web/bbs目錄下的頁面
mkdir /web/bbs echo "Nginx bbs test page" > /web/bbs/index.html
修改默認(rèn)的location
vim /app/nginx/conf/nginx.conf
location /bbs { root /web; index index.html index.htm; }
client在訪問時蝶涩,http://192.168.122.153/ 理朋,這個左斜杠代表的就是配置文件中root后面的目錄,
這個目錄后面在加上客戶端寫的URI的地址就是尋找網(wǎng)站首頁的地方绿聘。URI的地址就是網(wǎng)站主目錄下面的低一級目錄嗽上。
檢查語法
/app/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
重新加載文件
/app/nginx/sbin/nginx -s reload
測試
links --dump 192.168.122.153/bbs
Nginx bbs test page