nginx 一、nginx簡介 nginx(發音同engine x)是一款輕量級的Web伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,併在一個BSD-like協議下發行。 nginx由俄羅斯的程式設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler ...
nginx
目錄一、nginx簡介
nginx(發音同engine x)是一款輕量級的Web伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,併在一個BSD-like協議下發行。
nginx由俄羅斯的程式設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler使用。
第一個公開版本0.1.0發佈於2004年10月4日。其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4發佈。
nginx的特點是占有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
二、nginx的特性與優點
1.nginx的特性
Nginx 可以在大多數 Unix Linux OS 上編譯運行,並有 Windows 移植版。Nginx 的1.20.0穩定版已經於2021年4月20日發佈,一般情況下,對於新建站點,建議使用最新穩定版作為生產版本,已有站點的升級急迫性不高。Nginx 的源代碼使用 2-clause BSD-like license。
Nginx 是一個很強大的高性能Web和反向代理服務,它具有很多非常優越的特性:
在連接高併發的情況下,Nginx是Apache服務不錯的替代品:Nginx在美國是做虛擬主機生意的老闆們經常選擇的軟體平臺之一。能夠支持高達 50,000 個併發連接數的響應,感謝Nginx為我們選擇了 epoll and kqueue作為開發模型。
- 伺服器
- Nginx作為負載均衡服務:Nginx 既可以在內部直接支持 Rails 和 PHP 程式對外進行服務,也可以支持作為 HTTP代理服務對外進行服務。Nginx採用C進行編寫,不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多。
- 處理靜態文件,索引文件以及自動索引;打開文件描述符緩衝。
- 無緩存的反向代理加速,簡單的負載均衡和容錯。
- FastCGI,簡單的負載均衡和容錯。
- 模塊化的結構。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCG或其它代理伺服器處理單頁中存在的多個 SSI,則這項處理可以並行運行,而不需要相互等待。
- 支持 SSL 和 TLSSNI。
- 代碼
- Nginx代碼完全用C語言從頭寫成,已經移植到許多體繫結構和操作系統,包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows。Nginx有自己的函數庫,並且除了zlib、PCRE和OpenSSL之外,標準模塊只使用系統C庫函數。而且,如果不需要或者考慮到潛在的授權衝突,可以不使用這些第三方庫。
- 代理伺服器
- 作為郵件代理服務:Nginx 同時也是一個非常優秀的郵件代理服務(最早開發這個產品的目的之一也是作為郵件代理伺服器),Last.fm 描述了成功並且美妙的使用經驗。
- Nginx 是一個安裝非常的簡單、配置文件非常簡潔(還能夠支持perl語法)、Bug非常少的服務。Nginx 啟動特別容易,並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動。你還能夠不間斷服務的情況下進行軟體版本的升級。
2.nginx的優點
- 高併發連接:官方測試能夠支撐5萬併發連接,在實際生產環境中跑到2-3萬併發連接數
- 記憶體消耗少:在3萬併發連接下,開啟的10個nginx進程才消耗150M記憶體(15M*10=150M)
- 配置文件非常簡單:風格跟程式一樣通俗易懂
- 成本低廉:nginx為開源軟體,可以免費使用。而購買F5 BIG-IP、NetScaler等硬體負載均衡交換機則需要十多萬至幾十萬人民幣
- 支持Rewrite重寫規則:能夠根據功能變數名稱、URL的不同,將HTTP請求分到不同的後端伺服器群組
- 內置的健康檢查功能:如果Nginx Proxy後端的某台Web伺服器宕機了,不會影響前端訪問
- 節省帶寬:支持GZIP壓縮,可以添加瀏覽器本地緩存的Header頭
- 穩定性高:用於反向代理,宕機的概率微乎其微
- 模塊化設計:模塊可以動態編譯
- 外圍支持好:文檔全,二次開發和模塊較多
- 支持熱部署:可以不停機重載配置文件
- 支持事件驅動、AIO(AsyncIO,非同步IO)、mmap(Memory Map,記憶體映射)等性能優化
三、nginx的功能及應用類別
1. nginx的基本功能
- 靜態資源的web伺服器,能緩存打開的文件描述符
- http、smtp、pop3協議的反向代理伺服器
- 緩存加速、負載均衡
- 支持FastCGI(fpm,LNMP),uWSGI(Python)等
- 模塊化(非DSO機制),過濾器zip、SSI及圖像的大小調整
- 支持SSL
2. nginx的擴展功能
- 基於名稱和IP的虛擬主機
- 支持keepalive
- 支持平滑升級
- 定製訪問日誌、支持使用日誌緩衝區提高日誌存儲性能
- 支持URL重寫
- 支持路徑別名
- 支持基於IP及用戶的訪問控制
- 支持速率限制,支持併發數限制
3. nginx的應用類別
- 使用nginx結合FastCGI運行PHP、JSP、Perl等程式
- 使用nginx作反向代理、負載均衡、規則過濾
- 使用nginx運行靜態HTML網頁、圖片
- nginx與其他新技術的結合應用
四、nginx的模塊,工作原理,工作模式
nginx由內核和模塊組成。其中,內核的設計非常微小和簡潔,完成的工作也非常簡單,僅僅通過查找配置文件將客戶端請求映射到一個location block(location是nginx配置中的一個指令,用於URL匹配),而在這個location中所配置的每個指令將會啟動不同的模塊去完成相應的工作。
1.nginx的模塊分類
nginx的模塊從結構上分為核心模塊、基礎模塊和第三方模塊
- HTTP模塊、EVENT模塊和MAIL模塊等屬於核心模塊
- HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊屬於基本模塊
- HTTP Upstream模塊、Request Hash模塊、Notice模塊和HTTP Access Key模塊屬於第三方模塊
用戶根據自己的需要開發的模塊都屬於第三方模塊。正是有瞭如此多模塊的支撐,nginx的功能才會如此強大
nginx模塊從功能上分為三類,分別是:
- Handlers(處理器模塊)。此類模塊直接處理請求,併進行輸出內容和修改headers信息等操作。handlers處理器模塊一般只能有一個
- Filters(過濾器模塊)。此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最後由nginx輸出
- Proxies(代理器模塊)。就是nginx的HTTP Upstream之類的模塊,這些模塊主要與後端一些服務比如fastcgi等操作交互,實現服務代理和負載均衡等功能
nginx模塊分為:核心模塊、事件模塊、標準Http模塊、可選Http模塊、郵件模塊、第三方模塊和補丁等
- nginx基本模塊:所謂基本模塊,指的是nginx預設的功能模塊,它們提供的指令,允許你使用定義nginx基本功能的變數,在編譯時不能被禁用,包括:
- 核心模塊:基本功能和指令,如進程管理和安全。常見的核心模塊指令,大部分是放置在配置文件的頂部
- 事件模塊:在Nginx內配置網路使用的能力。常見的events(事件)模塊指令,大部分是放置在配置文件的頂部
- 配置模塊:提供包含機制
具體的指令,請參考nginx的官方文檔
2. nginx的工作原理
-
nginx採用了非同步非阻塞的工作方式
epoll模型:當有i/o事件產生時,epoll就會告訴進程哪個連接由i/o事件產生,然後進程就會處理這個事件。
nginx配置use epoll後,以非同步非阻塞的方式工作,能夠處理百萬計的併發連接 -
處理過程:
每進來一個請求,會有一個工作進程去處理,但不是全程進行處理,處理可以會發生阻塞的情況;比如:向後端伺服器轉發請求,那麼這個處理的工作進程不會一直等待,它會在發送完請求後,註冊一個事件等待後端伺服器返回;此時,再有新的請求,這個worker就很快再按這種方式處理;而一旦後端伺服器返回信息,就會觸發這個事件,worker就會進行處理,這個請求才會接著往下走;
通過這種<快速處理並快速釋放請求>的方式,達到同樣的配置可以處理更大併發的目的
3. nginx的工作模式
1.master-worker模式
nginx啟動成功後,會有一個master進程和至少一個worker進程;
master進程負責處理系統信號、載入配置、管理worker進程
worker進程負責處理具體的業務邏輯
對外部來說,真正提供服務的時worker進程
優點:
穩定性高;一個worker進程掛掉後master進程會立即啟動一個新的worker進程,保證worker進程數量不變,降低服務中斷的概率;
配合Linux的cpu親和性的匹配中,可以充分利用多核cpu的優勢,提升性能;
處理信號、配置重新載入等可以做到儘可能不中斷服務;
2.單進程模式
nginx只有一個進程,nginx的所有工作都由這個進程負責
優點:可以很方便的利用gdb工具進行調試
缺點:
不支持平滑升級
任何的信號處理都可以造成服務的中斷
進程掛掉後,在沒有外部監控的情況下,無法重啟服務
生產環境中不會使用
nginx源碼部署
環境說明:
系統 | 主機名 | IP |
---|---|---|
centos8 | nginx | 192.168.111.141 |
//修改名字
[root@localhost ~]# hostnamectl set-hostname nginx
[root@localhost ~]# bash
[root@nginx ~]#
//關閉防火牆和selinux
[root@nginx ~]# setenforce 0
[root@nginx ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@nginx ~]# systemctl disable --now firewalld
[root@nginx ~]# reboot
//配置yum源
[root@nginx ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
[root@nginx ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
//創建用戶
[root@nginx ~]# useradd -rMs /sbin/nologin nginx
//安裝依賴包
[root@nginx ~]# dnf -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ make wget vim
//創建日誌存放目錄
[root@nginx ~]# mkdir -p /var/log/nginx
[root@nginx ~]# chown -R nginx.nginx /var/log/nginx
//下載nginx包並解壓
[root@nginx ~]# wget http://nginx.org/download/nginx-1.20.2.tar.gz
[root@nginx ~]# tar xf nginx-1.20.2.tar.gz
//進行編譯安裝
[root@nginx ~]# cd nginx-1.20.2
[root@nginx nginx-1.20.2]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module
[root@nginx nginx-1.20.2]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install
//安裝完成
[root@nginx nginx-1.20.2]# cd /usr/local/nginx/
[root@nginx nginx]# ls
conf html logs sbin
nginx安裝後配置
//配置環境變數
[root@nginx ~]# echo "export PATH=$PATH:/usr/local/nginx/sbin" > /etc/profile.d/nginx.sh
[root@nginx ~]# source /etc/profile.d/nginx.sh
//配置system啟動服務
[root@nginx ~]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx server daemon
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecReload=/bin/kill -HUP \$MAINPID
[Install]
WantedBy=multi-user.target
[root@nginx ~]# systemctl daemon-reload
//啟動nginx
[root@nginx ~]# systemctl enable --now nginx
[root@nginx ~]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
瀏覽器訪問