一 Nginx的簡介
1 Nginx:
①Nginx 是開源、高性能、高可靠的 Web 和反向代理服務器,而且支持熱部署,幾乎可以做到 7 * 24 小時不間斷運行,即使運行幾個月也不需要重新啟動,還能在不間斷服務的情況下對軟件版本進行熱更新
②Nginx的主要使用場景: 虛擬主機,反向代理,緩存,http ?
③可以跨平臺,配置簡單,內存消耗少,10個nginx才占用150M內存。
④使用的是epoll模型,這種模型是I/O多路復用技術(I/O多路復用是一種技術,它允許一個進程或線程監控多個網絡連接,當其中某個或某幾個連接有數據時,當前程序可以拿到網卡收到的數據進行下一步的處理;),異步非阻塞的模型(異步非阻塞模型可以提高程序的效率,在等待I/O操作完成的同時,可以繼續執行其他代碼。)
⑥nginx支持高并發連接,處理2-3萬并發連接數,官方監測能支持5萬并發。對HTTP并發連接的處理能力高,單臺物理服務器可支持30000~50000個并發請求。(實際操作,很多公司為了服務器的穩定,都會設置在20000個左右)
⑦成本低,且開源,穩定性高,宕機概率非常小;
⑧內置的健康檢查功能,可以允許在服務器宕機的時候,做健康檢查,再發送的請求就不會發給宕機的服務器,會重新提交到其他節點上。
Apache:
Apache是以進程為基礎的結構,進程要比線程消耗更多的系統開支,不太適用于多處理器環境,因此,在一個apache Web站點擴容時,通常是增加服務器或擴充群集節點而不是增加處理器?
nginx的缺點:
nginx不方便處理動態資源,可以進行動靜分離,將動態請求交給后端程序去進行處理。
2 Apache與Nginx的區別?
1 nginx是輕量級,nginx比apache 占用更少的內存及資源;
2 靜態處理,Nginx 靜態處理性能比 Apache 高 ;
3 Nginx可以實現無緩存的反向代理加速,提高網站運行速度;
4 Nginx的性能和可伸縮性不依賴于硬件,Apache依賴于硬件;
5 Nginx支持熱部署,啟動速度迅速,可以在不間斷服務的情況下,對軟件版本或者配置進行升級;
6 nginx是異步進程,基于事件的web服務器,多個連接對應一個進程 ;apache是同步多進程,基于流程的web服務器,單個線程處理單個請求;
7 Nginx高度模塊化,編寫模塊相對簡單,且組件比Apache少
8 nginx抗并發,nginx處理請求是異步非阻塞的,而Apache則是阻塞性的,在高并發下的nginx能夠保持低資源,低消耗高性能。
9 nginx類似于速度,apache類似于功率.
10 nginx在負載均衡方面比較好,apache當流量進程達到極限時,將拒絕新的連接
Nginx對比Apache的優勢:?
輕量級,nginx比apache 占用更少的內存及資源
靜態處理,Nginx 靜態處理性能比 Apache 高?
Nginx可以實現無緩存的反向代理加速,提高網站運行速度
Nginx的性能和可伸縮性不依賴于硬件,Apache依賴于硬件
Nginx支持熱部署,啟動速度迅速,可以在不間斷服務的情況下,對軟件版本或者配置進行升級
nginx是異步進程,多個連接可以對應一個進程 ;apache是同步多進程,一個連接對應一個進程
Nginx高度模塊化,編寫模塊相對簡單,且組件比Apache少
高并發下nginx 能保持低資源低消耗高性能
Nginx 配置簡潔, Apache配置復雜
apache相對于nginx的優點 :
Rewrite比nginx的rewrite強大 (rewrite的主要功能就是實現統一資源定位符URL的跳轉)
模塊多,基本想到的都可以找到
少bug, nginx的bug相對較多
超穩定
Nginx處理動態請求是弱項,動態請求要Apache去做
3 Nginx的進程 ?
Apache和Nginx的默認端口都是80,當你發先Nginx啟動失敗,導致的原因可能就是80端口被占用,而導致服務啟動失敗,可以修改服務的端口,從而實現兩個服務的同時進行
Nginx有兩個進程:
master process:主進程(守護進程),用來管理工作進程,讀取nginx的配置文件信息
worker process:工作進程,用來處理用戶的連接請求
nginx的應用場景
1 可以做web服務器,nginx是一個http服務,可以獨立地提供http服務,可以做靜態服務器;
2 虛擬主機。可以實現一臺服務器,虛擬多個站點,例如基于ip、不同端口、或者不同域名的站點
3 反向代理服務器,負載均衡。當網站的訪問量達到一定的程度時,單臺服務器就不能滿足用戶的請求,此時需要多臺服務器集群,此時可以使用nginx做反向代理,并且多臺服務器可以平均分擔負載,不會讓某臺服務器負載高或者閑置。(也可以使用ip hash技術 進行負載均衡分配)
4 nginx中還可以配置安全管理,比如支持nginx搭建API接口網關,對每一個接口服務進行攔截;
5 nginx還能做緩存服務器;
Nginx 是如何實現高并發的?
?異步,非阻塞,使用了epoll 和大量的底層代碼優化
如果一個server采用一個進程負責一個request的方式,那么進程數就是并發數。正常情況下,會有很多進程一直在等待中
而nginx采用一個master進程,多個woker進程的模式
master進程主要負責收集、分發請求。每當一個請求過來時,master就拉起一個worker進程負責處理這個請求。同時master進程也負責監控woker的狀態,保證高可靠性
woker進程一般設置為跟cpu核心數一致。nginx的woker進程在同一時間可以處理的請求數只受內存限制,可以處理多個請求
Nginx 的異步非阻塞工作方式正把當中的等待時間利用起來了。在需要等待的時候,這些進程就空閑出來待命了,因此表現為少數幾個進程就解決了大量的并發問題
同步和異步
同步:一個服務的完成需要依賴其他服務時,只有等待被依賴的服務完成后,才算完成,這是一種可靠的服務序列。要么成功都成功,失敗都失敗,服務的狀態可以保持一致
異步:一個服務的完成需要依賴其他服務時,只通知其他依賴服務開始執行,而不需要等待被依賴的服務完成,此時該服務就算完成了。被依賴的服務是否最終完成無法確定,因此它是一個不可靠的服務序列
阻塞與非阻塞
阻塞:阻塞調用是指調用結果返回之前,當前線程會被掛起,一直處于等待消息通知,不能夠執行其他業務,函數只有在得到結果之后才會返回。
非阻塞:非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回
Nginx為什么不使用多線程?
Apache: 創建多個進程或線程,而每個進程或線程都會為其分配 cpu 和內存(線程要比進程小的多,所以worker支持比perfork高的并發),并發過大會耗光服務器資源
Nginx: 采用單線程來異步非阻塞處理請求(管理員可以配置Nginx主進程的工作進程的數量)(epoll),不會為每個請求分配cpu和內存資源,節省了大量資源,同時也減少了大量的CPU的上下文切換。所以才使得Nginx支持更高的并發
nginx 模塊
-
核心模塊:是 Nginx 服務器正常運行必不可少的模塊,提供錯誤日志記錄 、配置文件解析 、事件驅動機制 、進程管理等核心功能
-
標準HTTP模塊:提供 HTTP 協議解析相關的功能,比如: 端口配置 、 網頁編碼設置 、 HTTP響應頭設置 等等
-
可選HTTP模塊:主要用于擴展標準的 HTTP 功能,讓 Nginx 能處理一些特殊的服務,比如:Flash 多媒體傳輸 、解析 GeoIP 請求、 網絡傳輸壓縮 、 安全協議 SSL 支持等
-
郵件服務模塊:主要用于支持 Nginx 的 郵件服務 ,包括對 POP3 協議、 IMAP 協議和 SMTP協議的支持
-
Stream服務模塊: 實現反向代理功能,包括TCP協議代理 反向
-
第三方模塊:是為了擴展 Nginx 服務器應用,完成開發者自定義功能,比如: Json 支持、 Lua 支持等
nginx高度模塊化,但其模塊早期不支持DSO機制;1.9.11 版本支持動態裝載和卸載
yum安裝nginx
?①yum install -y epel-release? ? ?#安裝epel源 ? centos7 需要安裝epel源??
②yum install nginx -y
[root@localhost ~]# yum install -y epel-release[root@localhost ~]# yum install -y nginx
③ 使用yum安裝的nginx
配置文件位置在:/etc/nginx/nginx.conf;
默認根目錄在:/usr/share/nginx/html;
默認日志文件在:/var/log/nginx/路徑下
二 編譯安裝Nginx服務
1 初步編譯安裝
systemctl stop firewalldsystemctl disable firewalld 開機不自啟setenforce 0
2 安裝依賴包?
nginx的配置及運行需要pcre、zlib、openssl等軟件包的支持,因此需要安裝這些軟件的開發包,以便提供相應的庫和頭文件。
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
3 創建運行用戶、組
(Nginx 服務程序默認以 nobody 身份運行,建議為其創建專門的用戶賬號,以便更準確地控制其訪問權限)?
useradd -M -s /sbin/nologin nginx
4 下載安裝包
先從官網下載安裝包? www.nginx.org.com
?
?步驟如下
rm -rf /var/run/yum.pid 殺死嘗試yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
安裝依賴包useradd -M -s /sbin/nologin nginx
#新建nginx用戶便于管理cd /opt/
wget http://nginx.org/download/nginx-1.18.0.tar.gz
#官網下載安裝包tar xf nginx-1.18.0.tar.gz
cd nginx-1.18.0/
#解壓軟件包./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
添加各種模塊make -j2 && make install
編譯安裝chown -R nginx.nginx /apps/nginx
#修改權限
至此安裝結束ln -s /apps/nginx/sbin/nginx /usr/sbin/①絕對路徑啟動
/apps/nginx/sbin/nginx 若啟動不起來,看看端口是否被占用,占用關閉pstree -p | grep nginx
②做完軟鏈接直接啟動nginx
[root@localhost ~]#nginx
[root@localhost ~]#pstree -p | grep nginx|-nginx(27991)---nginx(27992)ll /usr/local/sbin/
三 Nginx的初始命令?
①啟動Nginx服務
nginx -t #檢查nginx服務配置是否正確/usr/local/sbin/nginx #啟動nginx服務
啟動nginx方法二
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #讓系統識別nginx的操作命令
##做軟連接,創建二進制文件到PATH路徑中
##一般是安裝在/usr/local中,就放到/usr/local下的/sbin下還有一種當時是在PATH環境變量中加入nginx程序的目錄,這種不常用
絕對路徑啟動
/apps/nginx/sbin/nginx
#使用絕對路徑啟動nginxps aux |grep nginx
#查看是否有nginx進程
?創建nginx自啟動文件
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
#注意文件位置,如果不對 啟動不了
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
#注意啟動文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000[Install]
WantedBy=multi-user.target[root@localhost nginx]#systemctl daemon-reload
[root@localhost nginx]#systemctl start nginx
[root@localhost nginx]#systemctl status nginx
②停止nginx服務
cat /usr/local/nginx/logs/nginx.pid #先查看nginx的PID號kill -3 <PID號>kill -s QUIT <PID號>killall -3 nginxkillall -s QUIT nginx
多種方式可以查看nginx進程號
cat /usr/local/nginx/logs/nginx.pid //查看nginx主進程的PIDpgrep nginx -l //查看nginx的主進程號和工作進程號lsof -i :80 //查看nginx的主進程號和工作進程號?
ss -ntap | grep nginx //查看nginx的主進程號和工作進程號?
netstat -ntap | grep nginx //查看nginx主進程的PID
啟動關閉nginx查看進程?
[root@localhost nginx-1.18.0]# nginx
[root@localhost nginx-1.18.0]# ps aux | grep nginx
root 49343 0.0 0.0 20564 616 ? Ss 18:39 0:00 nginx: master process nginx
nobody 49344 0.0 0.0 23084 1380 ? S 18:39 0:00 nginx: worker process
root 49358 0.0 0.0 112824 984 pts/0 S+ 18:39 0:00 grep --color=auto nginx
文件夾功能
[root@localhost nginx-1.18.0]# ll /apps/nginx
總用量 4
drwxr-xr-x. 2 root root 4096 2月 21 18:22 conf
drwxr-xr-x. 2 root root 40 2月 21 18:22 html
drwxr-xr-x. 2 root root 6 2月 21 18:22 logs
drwxr-xr-x. 2 root root 36 2月 21 18:24 sbin
[root@localhost nginx-1.18.0]#
- conf:保存nginx所有的配置文件,其中nginx.conf是nginx服務器的最核心最主要的配置文件,其他的.conf則是用來配置nginx相關的功能的,例如fastcgi功能使用的是fastcgi.conf和
- fastcgi_params兩個文件,配置文件一般都有個樣板配置文件,是文件名.default結尾,使用的使用將其復制為并將default去掉即可。
- html目錄中保存了nginx服務器的web文件,但是可以更改為其他目錄保存web文件,另外還有一個50x的web文件是默認的錯誤頁面提示頁面。
- logs:用來保存nginx服務器的訪問日志錯誤日志等日志,logs目錄可以放在其他路徑,比如/var/logs/nginx里面。
- sbin:保存nginx二進制啟動腳本,可以接受不同的參數以實現不同的功能。
③重載nginx服務
kill -1 <PID號>
kill -s HUP <PID號>
killall -1 nginx
killall -s HUP nginx
④nginx的其余命令
①nginx -V 查看安裝了那些模塊②nginx -v 查看版本號③nginx -s 發送信號 后面可以跟stop、reload、quit、reopen④nginx -t 檢查著配置文件語法nginx -g 修改執行用戶ps aux |grep nginx中查看。需要注銷配置文件中的user nginx中。nginx -g "daemon off"前臺運行,默認后臺運行容器中需要使用。⑥nginx -c 指定配置文件,一般用于.service文件中
⑤發信號:日志分割,重新打開日志文件
日志每天要換一次
[root@localhost logs]#ls
access.log error.log nginx.pid[root@localhost logs]#mv access.log access.`date +%F`.log[root@localhost logs]#ls
access.2022-09-27.log error.log nginx.pid[root@localhost logs]#kill -USR1 8468[root@localhost logs]#ls
access.2022-09-27.log access.log error.log nginx.pid[root@localhost logs]#
另一種方法
錯誤對比?
創建nginx自啟動文件
注意:創建自啟動前需確保nginx軟件安裝,不僅僅時下載。[root@localhost ~]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
#注意文件位置,如果不對 啟動不了
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
#注意啟動文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target[root@localhost ~]# systemctl daemon-reload
#重新加載配置
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl status nginx
[root@localhost ~]# systemctl stop nginx
[root@localhost ~]# systemctl enable --now nginx
#開機自啟并立即啟動
指定配置
不以配置文件中的為準
[root@localhost nginx]#pstree -p |grep nginx|-nginx(8678)---nginx(9434)
[root@localhost nginx]#vim /apps/nginx/conf/nginx.conf
[root@localhost nginx]#nginx -s reload
[root@localhost nginx]#pstree -p |grep nginx|-nginx(8678)-+-nginx(13336)| `-nginx(13337)
?
平滑升級?
下載新版本安裝包,重新編譯安裝
[root@localhost ~]#wget https://nginx.org/download/nginx-1.20.2.tar.gz -P /usr/local/src/
#下載安裝包到/usr/local/src/目錄
[root@localhost ~]#cd /usr/local/src/
[root@localhost src]#ls
nginx-1.20.2.tar.gz
[root@localhost src]#tar xf nginx-1.20.2.tar.gz
[root@localhost src]#cd nginx-1.20.2/
[root@localhost nginx-1.20.2]#ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
[root@localhost nginx-1.20.2]# nginx -V
nginx version: nginx/1.18.0
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=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
[root@localhost nginx-1.20.2]# ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
#重新編譯
[root@localhost nginx-1.20.2]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README src
[root@localhost nginx-1.20.2]# make
[root@localhost nginx-1.20.2]# cd objs/
#此文件夾中有新版本的nginx運行程序
[root@localhost objs]# ls
autoconf.err Makefile nginx nginx.8 ngx_auto_config.h ngx_auto_headers.h ngx_modules.c ngx_modules.o src
[root@localhost objs]# ./nginx -v
nginx version: nginx/1.20.2
#查看版本
拷貝新版本至原安裝路徑
[root@localhost objs]# mv /apps/nginx/sbin/nginx /apps/nginx/sbin/nginx.bak
#將低版本的nginx主程序改名
[root@localhost objs]# cp nginx /apps/nginx/sbin/
#將新版本拷入原安裝路徑
[root@localhost objs]# cd /apps/nginx/sbin/
[root@localhost sbin]# ls
nginx nginx.bak
[root@localhost nginx-1.20.2]# ll /apps/nginx/sbin/
總用量 15308
-rwxr-xr-x. 1 root root 7896080 2月 20 21:15 nginx
-rwxr-xr-x. 1 nginx nginx 7774624 2月 20 20:52 nginx.bak
[root@localhost nginx-1.20.2]# nginx -v
nginx version: nginx/1.20.2
#nginx文件為新版本
[root@localhost sbin]# /apps/nginx/sbin/nginx -t
#檢查下語法問題
4 生成新進程
[root@localhost nginx-1.20.2]# kill -USR2 `cat /apps/nginx/logs/nginx.pid`
#發送 2 信號[root@localhost sbin]# pstree -p | grep nginx|-nginx(5073)-+-nginx(8717)-+-nginx(8718)| | `-nginx(8719)| |-nginx(5623)| `-nginx(5624)
[root@localhost sbin]# ps aux | grep -v grep | grep nginx
root 5073 0.0 0.1 46344 2020 ? Ss 22:33 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 5623 0.0 0.1 48856 2092 ? S 22:37 0:00 nginx: worker process
nginx 5624 0.0 0.1 48856 2084 ? S 22:37 0:00 nginx: worker process
root 8717 0.0 0.1 46220 3368 ? S 22:43 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 8718 0.0 0.1 48756 1992 ? S 22:43 0:00 nginx: worker process
nginx 8719 0.0 0.1 48756 1992 ? S 22:43 0:00 nginx: worker process
#生成新的master8717
[root@localhost ~]# cd /apps/nginx/logs
[root@localhost logs]# ls
access.log error.log nginx.pid nginx.pid.oldbin
[root@localhost logs]# cat nginx.pid
8717 #新的master進程
[root@localhost logs]# cat nginx.pid.oldbin
5073 #舊的master進程
192.168.11.4:(下載版本的虛擬機)
[root@localhost ~]# cd /apps/nginx/html
[root@localhost html]# ls
50x.html index.html
#會有新老兩個進程
[root@localhost html]# dd if=/dev/zero of=/apps/nginx/html/m.img bs=1G count=10
#生成大文件
[root@localhost html]# ll -h
總用量 1.1G
-rw-r--r--. 1 root root 494 2月 21 18:22 50x.html
-rw-r--r--. 1 root root 612 2月 21 18:22 index.html
-rw-r--r--. 1 root root 10G 2月 21 19:44 m.img192.168.11.3:
[root@localhost data]# wget --limit-rate=1M http://192.168.11.4/m.img
#下載文件192.168.11.9:
[root@localhost html]# kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`
#優雅關閉舊進程的worker進程,此時舊進程不會再接收新的任務,后期可以直接退出192.168.11.3:
[root@localhost ~]# curl 192.168.11.4 -I
HTTP/1.1 200 OK
Server: nginx/1.20.2
#新版本接替接收任務,即升級成功
引入新的升級安裝包:
3)nginx添加到系統服務?
我們使用yum安裝的服務時,一般啟動方式均為 :systemctl? 服務名? ?操作?。對于源碼安裝后的nginx并不能直接像這樣使用。所以我們可以通過腳本或則系統服務的更改來實現系統服務的啟動方式