nginx簡介
Nginx是一個高性能的HTTP和反向代理web服務(wù)器辜伟,同時也提供了IMAP/POP3/SMTP服務(wù)。Nginx是由俄羅斯的伊戈爾·賽索耶夫開發(fā)的坚冀,第一個公開版本0.1.0于2004年10月10日济赎。
源代碼以類BSD許可證的形式發(fā)布,因其穩(wěn)定性记某、豐富的功能集司训、簡單的功能集、簡單的配置文件和低級系統(tǒng)的消耗而聞名液南。2011年6月1日壳猜,nginx1.0.4發(fā)布
Nginx是一款輕量級的web服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,在BSD-like協(xié)議下發(fā)行滑凉。其特點是內(nèi)存少统扳,并發(fā)能力強,事實上nginx的并發(fā)能力在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好畅姊,中國大陸使用nginx網(wǎng)站用戶有:百度咒钟、騰訊、淘寶若未、京東等朱嘴。
nginx的特性與優(yōu)點
nginx的特性
nginx是一個很牛的高性能Web和反向代理服務(wù)器,它具有很多非常優(yōu)越的特性:
- 在高連接并發(fā)的情況下陨瘩,nginx是Apache服務(wù)器不錯的替代品腕够,能夠支持高達50000個并發(fā)連接數(shù)的響應(yīng)
- 使用epoll and kqueue作為開發(fā)模型
- nginx作為負載均衡服務(wù)器:nginx既可在內(nèi)部直接支持和PHP程序?qū)ν膺M行服務(wù),也可支持作為HTTP代理服務(wù)器對外進行服務(wù)
- nginx采用C進行編寫舌劳,不論系統(tǒng)資源開銷還是CPU使用效率都比Perlbal要好很多
nginx的優(yōu)點
高并發(fā)連接:官方測試能夠支撐5萬并發(fā)連接帚湘,在實際生產(chǎn)環(huán)境中跑到2-3萬并發(fā)連接數(shù)
內(nèi)存消耗少:在3萬并發(fā)連接下,開啟的10個nginx進程才消耗150M內(nèi)存(15M*10=150M)
配置文件非常簡單:風(fēng)格跟程序一樣通俗易懂
成本低廉:nginx為開源軟件甚淡,可以免費使用大诸。而購買F5 BIG-IP捅厂、NetScaler等硬件負載均衡交換機則需要十多萬至幾十萬人民幣
支持Rewrite重寫規(guī)則:能夠根據(jù)域名、URL的不同资柔,將HTTP請求分到不同的后端服務(wù)器群組
內(nèi)置的健康檢查功能:如果Nginx Proxy后端的某臺Web服務(wù)器宕機了焙贷,不會影響前端訪問
節(jié)省帶寬:支持GZIP壓縮,可以添加瀏覽器本地緩存的Header頭
穩(wěn)定性高:用于反向代理贿堰,宕機的概率微乎其微
模塊化設(shè)計:模塊可以動態(tài)編譯
外圍支持好:文檔全辙芍,二次開發(fā)和模塊較多
支持熱部署:可以不停機重載配置文件
支持事件驅(qū)動、AIO(AsyncIO羹与,異步IO)故硅、mmap(Memory Map,內(nèi)存映射)等性能優(yōu)化
nginx工作原理
Nginx是由內(nèi)核和模塊組成纵搁。
Nginx本身做的工作實際很少吃衅,當(dāng)它接受到一個HTTP請求時,它僅僅時通過查找配置文件將此次次請求映射到一個location block腾誉,而此location中所配置的各個指令則會啟動不同的模塊去完成工作徘层,因此模塊可以看做Nginx真正的勞動工作者。通常一個location中的指令會涉及一個handler模塊和多個filter模塊(當(dāng)然利职,多個location可以復(fù)用同一個模塊)趣效。handler模塊負責(zé)處理請求,完成響應(yīng)內(nèi)容的生成眼耀,而filter模塊對響應(yīng)內(nèi)容進行處理英支。
Nginx的模塊從結(jié)構(gòu)上分為核心模塊、基礎(chǔ)模塊和第三方模塊
核心模塊:HTTP模塊哮伟、EVENT模塊和MAIL模塊
基礎(chǔ)模塊:HTTP Access模塊干花、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊楞黄。
第三方模塊:HTTP Upstream Request Hash模塊池凄、Notice模塊和HTTP Access Key模塊。
Nginx的模塊從功能上分為如下三類:
Handlers(處理器模塊)鬼廓。此類模塊直接處理請求肿仑,并進行輸出內(nèi)容和修改headers信息操作。handlers處理器模塊一般只能有一個碎税。
Fiters(過濾模塊)尤慰。此類模塊主要對其他處理器模塊輸出的內(nèi)容進行修改操作,最后nginx輸出雷蹂。
Proxies(代理類模塊)伟端。此類模塊是nginx的HTTP Upstream之類的模塊,這些模塊主要與后端一些服務(wù)比如FastCGI等進行交互匪煌,實現(xiàn)服務(wù)代理和負載均衡等功能责蝠。
#######nginx進程架構(gòu)
nginx的進程架構(gòu)
啟動nginx時党巾,會啟動一個master進程,這個進程不處理任何客戶端的請求霜医,主要用來產(chǎn)生worker線程齿拂,一個worker線程用來處理n個request。
而worker線程的線程數(shù)可以根據(jù)自己的需求來進行配置
[root@localhost conf]# pwd
/usr/local/nginx/conf
[root@localhost conf]# vim nginx.conf
3 worker_processes 1; //這個地方就是用來設(shè)置worker進程個數(shù)的
[root@localhost conf]# vim nginx.conf
3 worker_processes 3;
[root@localhost conf]# systemctl restart nginx.service
[root@localhost conf]# ps -ef | grep nginx
root 119118 1 0 18:29 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 119120 119118 0 18:29 ? 00:00:00 nginx: worker process
nginx 119121 119118 0 18:29 ? 00:00:00 nginx: worker process
nginx 119122 119118 0 18:29 ? 00:00:00 nginx: worker process
圖解:首先用戶通過http/https協(xié)議訪問nginx的主機肴敛,這時nginx會啟動一個master進程署海,這個進程,不處理客戶端的請求值朋,而是生成worker線程(這里是一個負載均衡集群)叹侄,通過worker線程來處理客戶端的請求巩搏,若用戶請求網(wǎng)站服務(wù)昨登,worker就會到web server這個服務(wù)集群提取對應(yīng)的資源給客戶端,同理贯底,這個Application server可以用來訪問應(yīng)用服務(wù)器丰辣,Memcached緩存服務(wù)器,backup是后端的意思禽捆。
web服務(wù)器請求資源的過程
1.客戶端發(fā)起請求笙什,然后與服務(wù)端建立tcp連接
2.服務(wù)器接收請求
3.進行反向代理,然后服務(wù)器處理請求
4.查看訪問資源的類型(可能是本地的資源胚想,也可能是通過NFS掛載的資源)
5.構(gòu)建響應(yīng)報文
6.通過網(wǎng)絡(luò)接口返回響應(yīng)報文給客戶端
7.服務(wù)端將本次的操作記錄到日志中
圖解:首先客戶端要與服務(wù)端建立連接(沒有連接就無法從服務(wù)端獲取想要的資源)我們訪問的時候都是通過域名去訪問服務(wù)端的琐凭,而域名是可以通過DNS將IP解析成域名去訪問的,所以實際上是訪問的服務(wù)器的IP浊服。
接收客戶端請求報文中記錄了對某資源的一次請求的過程统屈;服務(wù)器對請求報文進行解析,并獲取請求的資源及請求方法等相關(guān)信息牙躺,根據(jù)方法愁憔,資源,首部和可選的主體部分對請求進行處理孽拷;處理完成個之后就去對象存儲里去取相應(yīng)的資源吨掌,取到之后構(gòu)建一個響應(yīng)報文;然后將客戶請求的資源進行封裝脓恕,并通過網(wǎng)絡(luò)接口發(fā)送響應(yīng)報文膜宋,客戶端收到對應(yīng)的資源之后炼幔,web服務(wù)器會在日志文件中添加一個條目秋茫,來描述已執(zhí)行的事務(wù)。
單進程I/O模型:啟動一個進程處理用戶請求乘瓤,而且一次只處理一個萨咕,多個請求被串行響應(yīng)茫陆;
多進程I/O模型:并行啟動多個進程簿盅,每個進程響應(yīng)一個連接請求偎蘸;
復(fù)用I/O結(jié)構(gòu):啟動一個進程,同時響應(yīng)N個連接請求
復(fù)用的多進程I/O模型:啟動x個進程,每個進程響應(yīng)y個連接請求误澳,同時接收x*y個請求忆谓。
nginx的配置
nginx的編譯分為兩種:
- 靜態(tài)編譯:靜態(tài)編譯就是編譯器在編譯可執(zhí)行文件的時候倡缠,將可執(zhí)行文件需要調(diào)用的對應(yīng)動態(tài)鏈接庫(so)中的部分提取出來琢唾,鏈接到可執(zhí)行文件中去,使可執(zhí)行文件在運行的時候不依賴于動態(tài)鏈接庫衔蹲,所以其優(yōu)缺點與動態(tài)編譯的可執(zhí)行文件正好互補
- 動態(tài)編譯:動態(tài)編譯的可執(zhí)行文件需要附帶一個的動態(tài)鏈接庫猪落,在執(zhí)行時俱病,需要調(diào)用其對應(yīng)動態(tài)鏈接庫中的命令途凫。
所以其優(yōu)點一方面是縮小了執(zhí)行文件本身的體積阅畴,另一方面是加快了編譯速度焦匈,節(jié)省了系統(tǒng)資源。
缺點是:哪怕是很簡單的程序命辖,只用到了鏈接庫中的一兩條命令况毅,也需要附帶一個相對龐大的鏈接庫;二是如果其他計算機上沒有安裝對應(yīng)的運行庫尔艇,則用動態(tài)編譯的可執(zhí)行文件就不能運行尔许。
nginx的安裝與配置
下載nginx的源碼包
想要安裝不同的版本可以取官網(wǎng)下載:https://nginx.org/en/download.html
[root@localhost ~]# wget http://nginx.org/download/nginx-1.20.1.tar.gz
解決nginx的依賴
[root@localhost ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ zlib make
解壓nginx的tar包
[root@localhost ~]# tar -xzf nginx-1.20.1.tar.gz -C /usr/local
創(chuàng)建系統(tǒng)用戶
[root@localhost ~]# useradd -r -M -s /sbin/nologin nginx
創(chuàng)建日志存放目錄
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx.nginx /var/log/nginx
編譯安裝nginx
[root@localhost nginx-1.20.1]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log
[root@localhost nginx-1.20.1]# make && make install
配置nginx環(huán)境變量
[root@localhost ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@localhost ~]# source /etc/profile.d/nginx.sh
配置nginx的service文件使用systemctl控制nginx
[root@localhost system]# pwd
/usr/lib/systemd/system
[root@localhost system]# cat > nginx.service << EOF
[Unit]
Description=Nginx server daemon
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecStop=/usr/local/nginx/sbin/nginx -s quit
ExecReload=/bin/kill -HUP \$MAINPID
設(shè)置開機自啟
[root@localhost system]# systemctl enable --now nginx
nginx主目錄下各個目錄的作用
/usr/local/nginx/ #為服務(wù)安裝目錄,若你安裝在/opt目錄下則是/opt/nginx终娃,根據(jù)你安裝的不同目錄也不同
/usr/local/nginx/sbin #為服務(wù)主程序目錄
/usr/local/nginx/sbin/nginx #為服務(wù)程序文件
/usr/local/nginx/modules/ #為模塊目錄
/usr/local/nginx/conf/ #為服務(wù)的配置文件目錄
/usr/local/nginx/html/ # 為服務(wù)網(wǎng)頁根目錄
/usr/local/nginx/conf/nginx.conf #為服務(wù)配置文件
/usr/local/nginx/logs/ #為服務(wù)日志文件目錄
/usr/local/nginx/logs/nginx.pid #服務(wù)pid文件
/usr/local/nginx/logs/error.log #服務(wù)錯誤日志文件
/usr/local/nginx/logs/access.log #服務(wù)訪問日志文件
nginx服務(wù)命令
/usr/local/nginx/sbin/nginx 啟動nginx
/usr/local/nginx/sbin/nginx -v #查看nginx版本
/usr/local/nginx/sbin/nginx -V #顯示除版本信息意外的其他配置參數(shù)信息
/usr/local/nginx/sbin/nginx -t #檢查nginx配置文件是否正確
/usr/local/nginx/sbin/nginx -s reload #重新加載nginx
/usr/local/nginx/sbin/nginx -s quit #正常關(guān)閉nginx味廊,建議使用這種方式關(guān)閉nginx,這個是優(yōu)雅的關(guān)閉nginx
/usr/local/nginx/sbin/nginx -s stop #快速關(guān)閉nginx
/usr/local/nginx/sbin/nginx -c //用來指定配置文件的路徑
nginx的配置文件詳解
主配置文件默認位置:/usr/local/nginx/conf/nginx.conf //在不指定安裝路徑的情況下
- 默認啟動nginx時棠耕,使用的配置文件是:安裝路徑/conf/nginx.conf文件
- 可以在啟動nginx時通過-c選項來指定要讀取的配置文件
nginx常見的配置文件及其作用
配置文件 | 作用 |
---|---|
nginx.conf | nginx的基本配置文件 |
mime.types | MIME類型關(guān)聯(lián)的擴展文件 |
fastcgi.conf | 與fastcgi相關(guān)的配置 |
proxy.conf | 與proxy相關(guān)的配置 |
sites.conf | 配置nginx提供的網(wǎng)站余佛,包括虛擬主機 |
nginx.conf配置詳解
nginx.conf的內(nèi)容分為以下幾段:
- main配置段:全局配置段。其中main配置段中可能包含event配置段
- event {}:定義event模型工作特性
- http {}:定義http協(xié)議相關(guān)的配置
配置指令的語法格式
derective value1 [value2 ...];
支持使用變量:
- 內(nèi)置變量:模塊會提供內(nèi)建變量定義
- 自定義變量:set var_name value
檢查nginx配置文件的語法cuowu
[root@localhost conf]# 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
查看nginx的版本信息
[root@localhost conf]# nginx -v
nginx version: nginx/1.20.1
[root@localhost conf]# nginx -V //-V不僅能看到nginx的版本信息窍荧,還能看到編譯nginx時編譯了那些功能等信息
nginx version: nginx/1.20.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log
使用nginx服務(wù)控制命令重啟并指定配置文件路徑
[root@localhost conf]# pwd
/usr/local/nginx/conf
[root@localhost conf]# cp nginx.conf mime.types /opt/
[root@localhost conf]# cd /opt/
[root@localhost opt]# ls
mime.types nginx.conf nginx.sh packages
[root@localhost opt]# head -3 nginx.conf
#user nobody;
worker_processes 1;
[root@localhost opt]# nginx -s quit ; nginx -c /usr/local/nginx/conf/nginx.conf
[root@localhost opt]# head -3 /usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 3;
[root@localhost opt]# ps -ef | grep nginx
root 42776 1 0 11:00 ? 00:00:00 nginx: master process nginx -c /usr/local/nginx/conf/nginx.conf
nginx 42777 42776 0 11:00 ? 00:00:00 nginx: worker process
nginx 42778 42776 0 11:00 ? 00:00:00 nginx: worker process
nginx 42779 42776 0 11:00 ? 00:00:00 nginx: worker process
root 43003 1358 0 11:00 pts/0 00:00:00 grep --color=auto nginx
[root@localhost opt]# nginx -s quit ; nginx -c /opt/nginx.conf
[root@localhost opt]# ps -ef | grep nginx
root 45058 1 0 11:02 ? 00:00:00 nginx: master process nginx -c /opt/nginx.conf
nginx 45059 45058 0 11:02 ? 00:00:00 nginx: worker process
root 45134 1358 0 11:02 pts/0 00:00:00 grep --color=auto nginx
用于調(diào)試辉巡,定位問題的配置參數(shù)
是否以守護進程方式運行Nginx
守護進程(daemon)是脫離終端并且在后臺運行的進程。它脫離終端是為了避免進程執(zhí)行過程中的信息在任何終端上顯示蕊退,這樣一來郊楣,進程也不會被任何終端所產(chǎn)生的信息所打斷。Nginx毫無疑問是一個需要以守護進程方式運行的服務(wù)咕痛,因此痢甘,默認都是以這種方式運行的。
不過Nginx還是提供了關(guān)閉守護進程的模式茉贡,之所以提供這種模式塞栅,是為了方便跟蹤調(diào)試Nginx,畢竟用gdb調(diào)試進程時最煩瑣的就是如何繼續(xù)跟進fork出的子進程了。
daemon {on|off}; //是否以守護進程方式運行nginx放椰,調(diào)試時應(yīng)設(shè)置為off
master_process {on|off}; //是否以master/worker模型來運行nginx作烟,調(diào)試時可以設(shè)置為off
error_log 位置 級別; //配置錯誤日志
用法:
Syntax: daemon on | off; //語法
Default: daemon on; //默認值
Context: main //可以配置在那個字段中
[root@localhost conf]# head -4 nginx.conf
#user nobody;
worker_processes 3;
daemon off
[root@localhost conf]# systemctl restart nginx.service
// 此時nginx將不會以守護進程的方式運行,會一直占據(jù)著前臺屏幕
master_process {on|off}; //是否以master/worker模型來運行nginx砾医,調(diào)試時可以設(shè)置為off
//用法
Syntax: master_process on | off;
Default: master_process on;
Context: main
// nginx默認是以master/worker模型來運行
[root@localhost opt]# head -4 nginx.conf
#user nobody;
worker_processes 1;
master_process off;
//重新讀取nginx配置文件
[root@localhost opt]# systemctl stop nginx.service ; nginx -c /opt/nginx.conf
[root@localhost opt]# ps -ef | grep nginx
root 13256 1 0 11:47 ? 00:00:00 nginx -c /opt/nginx.conf
root 13466 1358 0 11:47 pts/0 00:00:00 grep --color=auto nginx
error_log 位置 級別; //配置錯誤日志
//用法拿撩,在不同的字段有不同的含義,比如在main字段寫就會對整個nginx產(chǎn)生影響如蚜,在http字段寫就會對某個網(wǎng)站產(chǎn)生影響
Syntax: error_log file [level];
Default: error_log logs/error.log error;
Context: main, http, mail, stream, server, location
[root@localhost opt]# head -4 nginx.conf
#user nobody;
worker_processes 1;
error_log logs/error.log;
重啟nginx服務(wù)讓配置文件生效
[root@localhost opt]# systemctl stop nginx; nginx -c /opt/nginx.conf
[root@localhost opt]# ls /usr/local/nginx/logs/
error.log nginx.pid
[root@localhost opt]# ls /usr/local/nginx/logs/
error.log nginx.pid
[root@localhost opt]# curl http://192.168.182.131/sx.txt
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@localhost opt]# cat /var/log/nginx/error.log
2021/10/25 17:18:19 [error] 10117#0: *1 open() "/usr/local/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.182.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.182.131", referrer: "http://192.168.182.131/"
2021/10/25 18:29:13 [notice] 119113#0: signal process started
2021/10/25 18:33:46 [notice] 124307#0: signal process started
2021/10/25 19:29:31 [notice] 56895#0: signal process started
2021/10/26 10:53:47 [notice] 35176#0: signal process started
2021/10/26 10:53:47 [notice] 35188#0: signal process started
2021/10/26 10:57:44 [notice] 39890#0: signal process started
2021/10/26 10:57:44 [notice] 39893#0: signal process started
error_log里的位置和級別能有以下可選項:
位置 | 級別
file | 記錄到某個文件中
stdree | 記錄到標(biāo)準(zhǔn)錯誤中(不推薦)
syslog:server=address[,parameter=value] | 記錄到某臺日志服務(wù)器中
memory:size | 記錄到內(nèi)存中(不推薦)
日志級別 | 含義 |
---|---|
debug | 若要使用debug級別压恒,需要在編譯nginx時使用–with-debug選項 |
info | 一般信息 |
notice | 不影響正常功能,需要注意的消息 |
warn | 可能影響系統(tǒng)功能错邦,需要提醒用戶的重要事件 |
error | 錯誤信息(常用的) |
cuit | 緊急探赫,比較嚴重的 |
alert | 必須馬上處理的 |
emerg | 會導(dǎo)致系統(tǒng)不可用的 |
正常運行必備的配置參數(shù)
user USERNAME [GROUPNAME]; //指定運行worker進程的用戶和組
pid /path/to/pid_file; //指定nginx守護進程的pid文件
worker_rlimit_nofile number; //設(shè)置所有worker進程最大可以打開的文件數(shù),默認為1024
worker_rlimit_core size; //指明所有worker進程所能夠使用的總體的最大核心文件大小撬呢,保持默認即可