一、Nginx概述
Nginx:
Nginx 是開源、高效能、高可靠的 Web 和反向代理伺服器,而且支援熱部署,幾乎可以做到 7 * 24 小時不間斷執行,即使執行幾個月也不需要重新啟動,還能在不間斷服務的情況下對軟體版本進行熱更新。
對HTTP併發連線的處理能力高,單臺物理伺服器可支援30000~50000個併發請求。
Apache:
Apache是以程序為基礎的結構,程序要比執行緒消耗更多的系統開支,不太適用於多處理器環境,因此,在一個apache Web站點擴容時,通常是增加伺服器或擴充群集節點而不是增加處理器。
二、Nginx和Apache的差異
Nginx | Apache |
---|---|
nginx是一個基於事件的web伺服器 | apache是一個基於流程的伺服器 |
所有請求都由一個執行緒處理 | 單個執行緒處理單個請求 |
nginx避免子程序的概念 | apache是基於子程序的 |
nginx類似於速度 | apache類似於功率 |
nginx在記憶體消耗和連線方面比較好 | apache在記憶體消耗和連線上沒有提高 |
nginx在負載均衡方面表現較好 | 當流量到達程序極限時,apache將拒絕新的連線。 |
nginx不支援IBMI和openvms一樣的os | apache支援更多的os |
nginx只具有核心功能 | apache提供了比nginx更多的功能 |
nginx的效能和可伸縮性不依賴於硬體 | apache依賴於cpu和記憶體等硬體元件 |
Nginx支援熱部署 | Apache不支援熱部署 |
同步和非同步
同步:一個服務的完成需要依賴其他服務時,只有等待被依賴的服務完成後,纔算完成,這是一種可靠的服務序列。要麼成功都成功,失敗都失敗,服務的狀態可以保持一致。
非同步:一個服務的完成需要依賴其他服務時,只通知其他依賴服務開始執行,而不需要等待被依賴的服務完成,此時該服務就算完成了。被依賴的服務是否最終完成無法確定,因此它是一個不可靠的服務序列。
阻塞與非阻塞
阻塞:阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起,一直處於等待訊息通知,不能夠執行其他業務,函式只有在得到結果之後纔會返回。
非阻塞:非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。
Apache:建立多個程序或執行緒,而每個程序或執行緒都會為其分配cpu和記憶體(執行緒要比程序小的多,所以worker支援比perfork高的併發),併發過大會榨乾伺服器資源。
Nginx:採用單執行緒來非同步非阻塞處理請求(管理員可以配置Nginx主程序的工作程序的數量),不會為每個請求分配cpu和記憶體資源,節省了大量資源,同時也減少了大量的CPU的上下文切換。所以才使得Nginx 支援更高的併發。
三、Nginx和Apache的優缺點比較
nginx相對於apache的優點∶
輕量級,同樣起web服務,比apache佔用更少的記憶體及資源
抗併發,nginx處理請求是非同步非阻塞的,而apache是阻塞型的在高併發下,nginx能保持低資源低消耗高效能
高度模組化的設計,編寫模組相對簡
支援熱部署,平滑升級
apache相對於nginx的優點∶
Rewrite比nginx的rewrite強大 (rewrite的主要功能就是實現統一資源定位符URL的跳轉)
模組多,基本想到的都可以找到
少bug, nginx的bug相對較多
超穩定
Nginx處理動態請求是弱項,動態請求要Apache去做。
總結:一般來說,需要效能的web服務,用Nginx. 如果不需要效能只求穩定,那就Apache。Nginx處理動態請求是弱項,一般動態請求要Apache去做,Nginx只適處理靜態網頁或反向代理。
四、Nginx的程序
Apache和Nginx的預設埠都是80,如果其中一個已經啟動了,那麼再啟動另一個會報錯。如果想要同時使用,可以修改其中一個的埠號。
Nginx有兩個程序:
master process:主程序(守護程序),用來管理工作程序。
worker process:工作程序,用來處理使用者的請求。
五、編譯安裝Nginx服務
1.安裝準備
2.安裝依賴包
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
3.新建nginx使用者便於管理
useradd -M -s /sbin/nologin nginx
4.切換到nginx-1.18.0,編譯安裝nginx
./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
5.修改檔案許可權
chown -R nginx.nginx /apps/nginx 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二進制啟動指令碼,可以接受不同的引數以實現不同的功能。
6.將nginx的操作指令放入環境變數PATH的目錄下
將nginx的可執行檔案做個軟連結,放入環境變數PATH的目錄下,讓系統識別nginx的操作指令。
ln -s /apps/nginx/sbin/nginx /usr/sbin/
7.檢查、啟動、重啟、停止nginx服務
檢查、啟動nginx服務
多種方式檢視nginx的PID號
停止nginx服務
過載nginx服務
8.建立Nginx自啟動檔案
#複製同一版本的nginx的yum安裝生成的service檔案 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 systemctl daemon-reload #重新載入配置 systemctl start nginx #啟動nginx服務
六、yum安裝nginx服務
centos7 需要安裝epel源 yum install -y epel-release #安裝epel源 yum install nginx -y 去使用官方源按裝較新的版本 http://nginx.org/en/linux_packages.html#RHEL
1.nginx訊號
nginx 命令支援向其傳送訊號,實現不同功能
顯示Nginx的幫助資訊:nginx -h
顯示版本:nginx -v
顯示編譯詳細情況、模組等資訊:nginx -V
看訊號大全:kill -l
檢查語法格式:nginx -t
2.日誌分割(移走原有日誌,重新開啟日誌檔案)
[root@localhost opt]# cd /apps/nginx/logs//切換到日誌目錄 [root@localhost logs]# ls access.log error.log nginx.pid [root@localhost logs]# mv access.log access.log.bak//將原有日誌移走 [root@localhost logs]# touch access.log [root@localhost logs]# cat /apps/nginx/logs/nginx.pid 5985 [root@localhost logs]# ps aux |grep nginx root 5985 0.0 0.0 46160 1168 ? Ss 14:26 0:00 nginx: master process nginx nginx 5986 0.0 0.1 48688 2012 ? S 14:26 0:00 nginx: worker process root 10201 0.0 0.0 112676 984 pts/0 S+ 15:16 0:00 grep --color=auto nginx [root@localhost logs]# kill -s USR1 kill: 用法:kill [-s 訊號宣告 | -n 訊號編號 | -訊號宣告] 程序號 | 任務宣告 ... 或 kill -l [訊號宣告] [root@localhost logs]# kill -USR1 5985//重新生成日誌檔案 [root@localhost logs]# ls access.log access.log.bak error.log nginx.pid
客戶端訪問伺服器
服務端檢視日誌
七、Nginx服務的主配置檔案
nginx 官方幫助文件:nginx.org/en/docs/
tengine 幫助文件:tengine.taobao.org/nginx_docs/…
Nginx的配置檔案的組成部分:
主配置檔案:nginx.conf
子配置檔案: include conf.d/*.conf
主配置檔案中有六個主要模組:
全域性塊:全域性配置,對全域性生效。
events塊:配置影響Nginx伺服器與使用者的網路連線。
http塊:配置代理,快取,日誌定義等絕大多數功能和第三方模組的配置。
server塊:配置虛擬主機的相關引數,一個http塊中可以有多個server 塊。每個 server 塊就相當於一個虛擬主機。。
location塊:用於配置匹配的url,一個server塊中可以有多個location塊。
upstream:配置後端伺服器具體地址,負載均衡配置不可或缺的部分。
配置檔案由指令和指令塊構成
每條指令以;分號結尾,指令與值之間以空格符號分隔
pid:/apps/run/nginx.pid
指令已{}達括號將多條指令組織在一起且可以巢狀指令塊
include語句允許組合多個配置檔案以提升可維護性
1.全域性配置
nginx有多種模組
核心模組:是 Nginx 伺服器正常執行必不可少的模組,提供錯誤日誌記錄 、配置檔案解析 、事件驅動機制 、程序管理等核心功能。
標準HTTP模組:提供 HTTP 協議解析相關的功能,比如: 埠配置 、 網頁編碼設定 、 HTTP響應頭設定 等等。
可選HTTP模組:主要用於擴充套件標準的 HTTP 功能,讓 Nginx 能處理一些特殊的服務,比如:Flash 多媒體傳輸 、解析 GeoIP 請求、 網路傳輸壓縮 、 安全協議 SSL 支援等。
郵件服務模組:主要用於支援 Nginx 的 郵件服務 ,包括對 POP3 協議、 IMAP 協議和 SMTP協議的支援。
Stream服務模組: 實現反向代理功能,包括TCP協議代理。
第三方模組:是爲了擴充套件 Nginx 伺服器應用,完成開發者自定義功能,比如: Json 支援、 Lua 支援等。
2.隱藏版本或修改版本
隱藏版本號
[root@localhost ~]# vim /apps/nginx/conf/nginx.conf #修改配置檔案放在http語句中 http { server_tokens off; [root@localhost ~]# nginx -s reload #重新載入
修改版本號
在nginx停止執行的情況下進行編譯
#去修改原始碼,在安裝包裡, 再重新編譯 #號不要去掉 [root@localhost ~]# killall nginx [root@localhost ~]# cd /opt [root@localhost opt]# ls nginx-1.18.0 nginx-1.18.0.tar.gz rh [root@localhost opt]# vim /opt/nginx-1.18.0/src/core/nginx.h /* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #ifndef _NGINX_H_INCLUDED_ #define _NGINX_H_INCLUDED_ #define nginx_version 1018000 #define NGINX_VERSION "9527 #define NGINX_VER "LHEY/" NGINX_VERSION [root@localhost opt]# cd nginx-1.18.0/ [root@localhost 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
3.修改啟動的程序數
worker_processes 1; #允許的啟動工作程序數數量,和你真實的cpu數量有關 worker_processes auto; #如果設定為auto,就是你真實的cpu數量 nginx -s reload #重新載入 [root@localhost ~]#ps axo pid,cmd,psr,ni|grep nginx #可以看到nginx的worker數量
4.cpu與work程序繫結
將Nginx工作程序繫結到指定的CPU核心,預設Nginx是不進行程序繫結的,繫結並不是意味著當前nginx程序獨佔以一核心CPU,但是可以保證此程序不會執行在其他核心上,這就極大減少了nginx的工作程序在不同的cpu核心上的來回跳轉,減少了CPU對程序的資源分配與回收以及記憶體管理等,因此可以有效的提升nginx伺服器的效能。
worker_cpu_affinity模組指令用於控制 worker程序與CPU的親緣
vim /apps/nginx/conf/nginx.conf #編輯配置檔案 user nginx; worker_processes 2; worker_cpu_affinity 00000001 00000010; #繫結到第一和第二塊cpu上 error_log /apps/nginx/logs/error.log; #指定報錯檔案的路徑
5.nginx程序的優先順序(work程序的優先順序)
vim /apps/nginx/conf/nginx.conf #編輯配置檔案 user nginx; worker_processes 2; worker_cpu_affinity 00000001 00000010; #繫結到第一和第二塊cpu上 error_log /apps/nginx/logs/error.log; #指定報錯檔案的路徑 #pid /run/nginx.pid; worker_priority -20;
5. 除錯work程序開啟的檔案的個數
所有worker程序能開啟的檔案數量上限,包括:Nginx的所有連線(例如與代理伺服器的連線等),而不僅僅是與客戶端的連線,另一個考慮因素是實際的併發連線數不能超過系統級別的最大開啟檔案數的限制.最好與ulimit -n 或者limits.conf的值保持一致,只要機器效能夠多加幾個也沒問題。
vim /apps/nginx/conf/nginx.conf #首先修改配置檔案 #新增 worker_rlimit_nofile 65536;
臨時修改
ulimit -n 30000 #修改單個程序能開啟的最大檔案數為 30000 #僅應用於當前會話即不會永久修改限制 ulimit -a #顯示當前使用者的所有資源限制資訊
永久修改(需要修改pam認證模組)
vim /etc/security/limits.conf #最後加入 * soft core unlimited * hard core unlimited * soft nproc 1000000 * hard nproc 1000000 * soft nofile 1000000 * hard nofile 1000000 * soft memlock 32000 * hard memlock 32000 * soft msgqueue 8192000 * hard msgqueue 8192000 `nproc`(最大程序數限制)的軟限制和硬限制都設定為 1000000,當前使用者在單個會話中可以建立的最大程序數為 1000000 `nofile`(開啟檔案描述符限制)的軟限制和硬限制都設定為 1000000,這意味著當前使用者在單個會話中可以使用的最大檔案描述符數將被限制為 1000000。軟限制是軟性限制,使用者可以根據需要進行調整,而硬限制是硬性限制,一旦設定,使用者無法超過該限制 `memlock`(鎖定記憶體限制)的軟限制和硬限制都設定為 32000,這意味著當前使用者在單個會話中可以鎖定的最大記憶體量為 32000KB `msgqueue`(訊息佇列限制)的軟限制和硬限制都設定為 8192000,這意味著當前使用者在單個會話中可以使用的最大訊息佇列大小為 8192000位元組