一. Nginx是什么?
1. Nginx概述
- 高性能、輕量級Web服務軟件
- 系統資源消耗低
- 對HTTP并發連接的處理能力高
- 單臺物理服務器可支持30,000~50,000個并發請求
- Nginx(發音同 “engine x”)是一個高性能的反向代理和Web服務器軟件,由俄羅斯人Igor Sysoev開發。第一個版本發布于2004年,源代碼基于雙條款BSD許可證發布。Nginx在互聯網企業中因其資源消耗低、運行穩定且高性能的并發處理能力而廣泛應用。
- Nginx是互聯網上最受歡迎的開源Web服務器之一,不僅提供了一整套開發和交付的應用技術,還是應用交付領域的開源領導者。
- 2019年3月,F5宣布收購Nginx,將其作為F5的一部分。F5表示,將加強對開源和Nginx應用平臺的投資,致力于Nginx開源技術、開發人員和社區的發展。
2. Nginx模塊與作用
- main模塊:全局配置模塊,配置運行nginx服務器的用戶(組)、worker_process數(進程)、nginx進程PID存放路徑、錯誤日志存放路徑、配置文件的引入等。
- stream服務模塊:實現反向代理功能,包括TCP協議代理。
- 郵件服務模塊:支持Nginx的郵件服務,對POP3、IMAP和SMTP協議的支持。
- 第三方模塊:二次開發擴展Nginx服務器應用,完成開發者自定義功能(如Json支持、Lua支持)。
- events模塊:影響nginx服務器與用戶的網絡連接。
events {worker_connections 65536;use epoll;accept_mutex on;multi_accept on; }
- http模塊:跟web服務相關,擴展標準的HTTP功能,處理一些特殊服務,包含自定義服務日志、sendfile傳輸文件、連接超時時間、單連接請求數上限、Flash多媒體傳輸、解析GeoIP請求、網絡傳輸壓縮、安全協議SSL支持等。
- location模塊:uri網址定位。
- server模塊:服務模塊,配置80端口監聽、虛擬主機、DNS域名解析等。
- auth_basic模塊:對網頁設置用戶名密碼。
- gzip模塊:壓縮。
- proxy模塊:設置后端IP地址、端口號及http和加密的https。
- ssl模塊:https加密。
3. Nginx三大作用:反向代理、負載均衡、動靜分離
- 反向代理:在服務端配置,客戶端訪問服務器A,服務器A為代理服務器,將客戶請求轉發到服務器B。
- 作用:緩存服務器響應,減少服務器壓力;負載均衡,將用戶請求分配給多個服務器;訪問控制。
- 正向代理:在客戶端配置,代理服務器代理客戶端與目標服務器進行交互。
- 作用:提高訪問速度;隱藏客戶端真實IP地址。
- 負載均衡:分攤到多個操作單元(如Web服務器、FTP服務器等)上進行執行,從而共同完成工作任務。
- Nginx七層負載均衡調度算法:
- 輪詢(默認):每個請求按時間順序逐一分配到不同的后端服務器。
upstream backendserver {server 192.168.10.14:80 max_fails=2 fail_timeout=10s;server 192.168.10.15:80 max_fails=2 fail_timeout=10s; }
- 加權輪詢:指定輪詢幾率,weight值和訪問比例成正比。
upstream backendserver {server 192.168.10.14:80 weight=5 max_fails=2 fail_timeout=10s;server 192.168.10.15:80 weight=10 max_fails=2 fail_timeout=10s; }
- IP哈希:每個請求按訪問IP的hash結果分配,解決session會話保持問題。
upstream backendserver {ip_hash;server 192.168.10.14:80 max_fails=2 fail_timeout=10s;server 192.168.10.15:80 max_fails=2 fail_timeout=10s; }
- 最少連接數:按Nginx反向代理與后端服務器之間的連接數分配,連接數最少的優先分配。
upstream backendserver {least_conn;server 192.168.0.14:80 max_fails=2 fail_timeout=10s;server 192.168.0.15:80 max_fails=2 fail_timeout=10s; }
- 響應時間(需編譯安裝第三方模塊):按后端服務器的響應時間分配請求,響應時間短的優先分配。
upstream backendserver {fair;server 192.168.10.14:80 max_fails=2 fail_timeout=10s;server 192.168.10.15:80 max_fails=2 fail_timeout=10s; }
- URL哈希(需編譯安裝第三方模塊):按訪問URL的hash結果分配請求,使同一個URL訪問到同一個后端服務器。
upstream backendserver {server 192.168.10.14:80 max_fails=2 fail_timeout=10s;server 192.168.10.15:80 max_fails=2 fail_timeout=10s;hash $request_uri; }
- 動靜分離:通過代理方式,在server{}段中加入帶正則匹配的location來指定匹配項。靜態頁面交給Nginx處理,動態頁面交給PHP-FPM模塊或Apache處理。
二. Nginx和Apache的差異
Apache
- 同步多進程模型:一個連接對應一個進程,具有高穩定性。
- 優勢:
- rewrite功能強大(實現URL跳轉)。
- 模塊多,基本可找到所需的模塊。
- 穩定性高,bug少。
- PHP支持簡單。
- 處理動態請求更有優勢。
Nginx
- 異步非阻塞模型:多個連接(萬級別)對應一個進程,具有高性能。
- 優勢:
- 輕量級,采用C編寫,占用更少的內存與資源。
- 抗并發/高并發,負載能力高。
- 處理靜態文件性能比Apache高三倍以上。
- 設計高度模塊化,編寫模塊簡單。
- 配置簡潔,正則配置更簡單,可用-t測試配置。
- 作為負載均衡服務器,支持七層負載均衡,有效防止DDoS攻擊。
- 可作為反向代理服務器和郵件代理服務器使用。
- 支持熱部署,在線升級。
通過這些對比,可以根據具體需求選擇使用Nginx或Apache。
三、Nginx的應用場景
Web服務器:
- Nginx可以作為一個獨立的HTTP服務器,提供HTTP服務。它能夠高效地處理靜態資源(如HTML、CSS、JavaScript和圖片文件)的請求,成為一個高性能的靜態服務器。
虛擬主機:
- Nginx可以在一臺物理服務器上配置多個虛擬主機,分別對應不同的網站。這可以通過不同的IP地址、端口號或域名來實現。這種功能對托管多個網站非常有用,節省了硬件成本。
反向代理服務器與負載均衡:
- 當網站的訪問量增大時,單臺服務器可能無法滿足所有用戶的請求。Nginx可以作為反向代理服務器,將請求分發到后端的多臺服務器,實現負載均衡。通過這種方式,可以確保每臺服務器的負載均衡,不會有某臺服務器過載或閑置。Nginx還支持多種負載均衡策略,如輪詢、IP hash等。
安全管理:
- Nginx可以配置安全管理功能,例如搭建API接口網關。通過這種方式,Nginx能夠對每個接口服務進行攔截和安全檢查,防止惡意攻擊和未授權訪問,提高系統的安全性。
緩存服務器:
- Nginx可以作為緩存服務器,將經常訪問的資源緩存到內存中,加快資源的訪問速度,減少服務器的壓力,提高整體性能。
四、Nginx為什么能支持高并發
Nginx支持高并發的核心原因在于其采用了異步非阻塞的架構,利用了Linux的
epoll
機制,并且可以進行配置細節優化。
- 異步非阻塞架構:
- 如果每個請求都由一個獨立的進程或線程處理,那么系統資源消耗會非常高,特別是在等待網絡傳輸時,這種方式非常低效。而Nginx采用異步非阻塞的運行方式,可以有效地避免這一問題。
- Nginx有一個主調度進程和多個工作進程,每當有請求到達時,主進程會將請求分配給工作進程進行處理。由于大部分請求處理時間都耗費在網絡傳輸上,實際在服務器上占用的時間并不多,Nginx通過少量進程就能高效處理大量并發請求。
五、為什么Nginx不使用多線程
Nginx采用單線程來異步非阻塞處理請求,并且管理員可以配置Nginx主進程的工作進程數量。主要原因包括:
資源節約:
- Nginx不會為每個請求單獨分配CPU和內存資源,這節省了大量的系統資源。
減少CPU上下文切換:
- 使用單線程避免了頻繁的上下文切換,提高了系統效率。
這種設計使得Nginx能夠支持更高的并發量,處理更多的請求。
六、Nginx的兩種進程分別有什么作用
Nginx主要有兩種進程:master進程和worker進程。
master進程:
- 負責管理worker進程,讀取和加載Nginx的配置文件,控制Nginx的啟動、重啟和關閉等操作。
worker進程:
- 處理實際的連接請求。每個worker進程都可以處理多個連接,并通過異步非阻塞的方式進行高效處理。
?七、編譯安裝nginx
cd /opt/ tar zxvf nginx-1.22.0.tar.gz -C /opt/ cd nginx-1.22.0/ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module make -j16&& make install bash setup-local-yum-repo.sh? yum -y install gcc pcre-devel openssl-devel zlib-devel openssl ?openssl-devel make -j16&& make install make -j16 && make install ls rm setup-local-yum-repo.sh? cd nginx-1.22.0/./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module make -j16 && make install ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ tee /lib/systemd/system/nginx.service ? <<eof [Unit] Description=nginx After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/bin/kill -1 $MAINPID ExecStop=/bin/kill -3 $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target eof chmod 777 /lib/systemd/system/nginx.service? sudo useradd -r -d /var/www -s /sbin/nologin nginx systemctl daemon-reload systemctl start nginx
yum安裝
Centos7 需要安裝epel源
?
cd /etc/yum.repos.d
vim epel.repo
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/$releasever/x86_64
gpgcheck=0
?
yum install -y epel-release
?
yum install nginx -y
?