Nginx系列--01基本架構及其安裝
早期Nginx 的誕生是為了解決Web中出現的C10K 問題,即服務器如何承受一萬的並發量。當時流行的Web server為Apache Httpd,而Httpd的IO模型使用的select()模型,這種IO模型為端口復用模型,他的並發量只能達到1024。而Nginx的使用了一種epoll的IO模型,這種模型使用事件驅動機制極大的提高了並發量。當然到現今為止,Nginx的功能不僅僅提供web服務。
一. Nginx架構
1. Nginx進程架構
由上圖可知,nginx的進程模型分為兩級,一個master進程和多個工作進程。master進程用於負載加載和分析配置文件、管理worker進程、平滑升級。woker進程處理並響應用戶請求,worker進程在響應用戶請求可以通過異步、事件驅動和非阻塞多種方式;與緩存相關的進程用於加載,管理緩存對象。
2. Nginx高度模塊
Nginx的每個功能由具體模塊提供,是高度模塊化的,但其模塊早期不支持DSO機制;近期版本(1.10及其以上)支持動態裝載和卸載。Nginx模塊主要分為分類:
1). 核心模塊:core module
2). 標準模塊:根據功能不同分為三類
- HTTP modules:用於配置HTTP服務,這裏面的模塊分為Standard HTTP modules和Optional HTTP modules,Standard modules本身就有有,而Optional模塊需要我們在編譯時指定參數才會有。而第三方模塊在編譯時要指向引用此模塊。
- Mail modules:用於Mail相關配置
- Stream modules:用於Stream相關配置
3). 第三方模塊:用於擴展Nginx https://www.nginx.com/resources/wiki/modules/ 此連接可以看到目前支持的第三方模塊。
3. Nginx功能
1). 靜態的web資源服務器:圖片服務器或js/css/html/txt等靜態資源服務器
2). 結合FastCGI/uwSGI/SCGI等協議反代動態資源請求
3). http/https協議的反向代理
4). imap4/pop3協議的反向代理:用於處理郵件協議,此處不涉及
5). tcp/udp協議的請求轉發: 使用stream模塊
這些功能除了imap4/pop3協議的反向代理其他的都會通過模塊的方式在後續的文章中一一介紹。
二. Nginx的安裝
我們將會使用兩種方式來安裝Nginx,一種是通過yum安裝,一種使用源碼安裝。
操作系統版本:
- CentOS7.2 處於最小化安裝。
- IP為 192.168.239.131
- 清空iptables規則:~]# iptables -F
- 禁用selinux:~]# setenforce 0
1. YUM源安裝Nginx
一般沒有什麽特許要求我們都是通過信任的yum源進行安裝
1)配置yum源
Nginx在EPEL源中,我們使用的是阿裏的鏡像。
~]# vim /etc/yum.repos.d/epel.repo
[epel]
name=CentOS-$releasever EPEL
baseurl=http://mirrors.aliyun.com/epel/$releasever/$basearch
gpgcheck=0
2)yum安裝Nginx
~]# yum install -y nginx
查看安裝包安裝了哪些文件
~]# rpm -ql nginx | less
啟動nginx服務
~]# systemctl restart nginx
訪問nginx服務
看到此頁面說明nginx啟動成功
2. 源碼編譯Nginx
一般我們都會使用yum安裝,因為它更便於升級管理。而我們之所以對源碼進行編譯是因為版本出現了大的漏洞,或者我們需要第三方模塊提供的功能。
1)安裝編譯開發工具(包組)
~]# yum groupinstall -y "Desktop Platform Development" "Server Platform Development" "Development Tools"
查看yum源中的包組可以使用 yum grouplist 命令,如果使用此命令查看的包組名是中文那麽在安裝是要使用中文安裝。
2)安裝依賴的包
~]# yum install -y install pcre-devel zlib-devel openssl-devel
pcre:perl 兼容的正則表達式庫,他為nginx 的核心和rewrite模塊提供正則表達式功能
zlib:用於Nginx為Gzip模塊提供頭部壓縮功能
openssl:為Nginx SSL模塊提供HTTPS協議支持
3)下載源碼包
我們編譯最新Nginx版本
~]# wget http://nginx.org/download/nginx-1.13.8.tar.gz (如果沒有安裝wget可以使用 yum install -y wget 安裝)
~]# tar xf nginx-1.13.8.tar.gz -C /opt
~]# cd /opt
opt]# ln -sv nginx-1.13.8 nginx
~]# cd nginx
說明: 之所以創建軟連接是因為後期版本的升級時,我們只需要修改軟連接即可。而且一旦新版本有問題我們只需修改軟連接指向就可以回退到老版本。
4)編譯之普通版
C語言編寫的程序是有多個原文件組成的,而且文件與文件之間具有依賴關系。所以我們需要特定的項目管理工具對其進行管理,使得程序在編譯的時候可以根據依賴關系依次進行。在Linux平臺上常用的項目管理工具為GUN make,make在編譯時會根據其makefile配置文件中定義的次序對其進行編譯。
makefile文件如何生成: 在程序編寫完成後,會使用autoconf為程序代碼生成一個腳本文件configure,這個腳本文件會收集當前系統的開發環境中所依賴的各組件的版本,和其依賴的環境是否滿足,最後會更具makefile.in生成makefile文件
makefile.in文件如何生成: 在程序編寫完成後,會使用autoconf為程序代碼生成一個makefile模板文件makefile.in
- ./configure
運行configure命令時一定要處於其所在的父目錄下。
~]# cd /opt/nginx
~]# ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/etc/nginx.conf --pid-path=/usr/local/nginx/run/nginx.pid --lock-path=/usr/local/nginx/run/nginx.lock --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-http_dav_module --with-threads --with-file-aio
--prefix:編譯完成後,程序的安裝目錄。默認在/usr/local
--conf-path: 指明配置文件的安裝文件路徑,如果不指明則在--prefix 指明的目錄下
--pid-path:主程序的pid文件路徑,如果不指明則在--prefix 指明的目錄下
--lock-path:鎖文件路徑,如果不指明則在--prefix 指明的目錄下
--error-log-path:nginx錯誤日誌文件路徑,如果不指明則在--prefix 指明的目錄下
--http-log-path:nginx訪問日誌路徑,如果不指明則在--prefix 指明的目錄下
--user,--group:指明程序運行的用戶,默認是nobody,配置文件中使用user指令指明
--with-http_ssl_module,--with-http_v2_module, --with-http_stub_status_module,--with-dav-module:啟動對應的模塊功能,使用--with-XXX_module的說明默認沒有編譯,需要顯示說明編譯。使用--without-XXX_module的表明默認會編譯,但如果你不想使用此功能模塊,可以使用此選項顯示表明不編譯。可以使用--help查看有哪些選項。
--with-threads:使用線程池功能
--with-file-aio:啟用文件一步IO功能
下圖為configure運行結果
可以看到沒有報任何錯,在configure當前目錄下我們看到生成了一個Makefile文件。
-
使用make工具編譯源碼
make命令會根據生成的Makefile文件編譯源碼,運行此命令是處於makefile的父目錄下。
nginx]# make -
將編譯好的文件安裝到指定目錄
nginx]# make install
在configure時我們通過--prefix指明安裝在/usr/local/nginx目錄下。有些文件是在nginx啟動後才生成的,所以此處看不到。如下圖: - 運行nginx
運行nginx程序時發現報錯,查找資料發現是因為沒有啟動程序使用的用戶,我們指定運行work進程的用戶為nginx。
我們發現80端口已經監聽,訪問nginx頁面
由上圖可知nginx使用正常。
5)編譯之添加第三方模塊
https://www.nginx.com/resources/wiki/modules/ 可以看到可用的第三方模塊。此次我們會使用阿裏巴巴的nginx-http-footer-filter模塊進行
- 下載nginx-http-footer-filter
~]# wget https://github.com/alibaba/nginx-http-footer-filter/archive/1.2.2.zip
~]# cp 1.2.2.zip /opt
opt]# unzip 1.2.2.zip
目錄結構為:
opt]# cd nginx -
編譯
記得清楚原有編譯結果,在重新展開nginx tarball
~]# rm -rf /usr/local/nginx
~]# rm -rf /opt/nginx*
~]# tar xf nginx-1.13.8.tar.gz -C /opt
~]# cd /opt
opt]# ln -sv nginx-1.13.8 nginx
~]# cd nginx
正式編譯:
nginx]# ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/etc/nginx.conf --pid-path=/usr/local/nginx/run/nginx.pid --lock-path=/usr/local/nginx/run/nginx.lock --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-http_dav_module --with-threads --with-file-aio --add-module=../nginx-http-footer-filter-1.2.2 - 修改配置文件
~]# vim /usr/local/nginx/etc/nginx.conf -
啟動服務
~]# /usr/local/nginx/sbin/nginx start - 頁面訪問nginx服務
可以看到配置生效了。
此模塊的詳細用法請看鏈接https://github.com/alibaba/nginx-http-footer-filter/tree/1.2.2
5)編譯之支持動態裝卸在模塊
前期的一些步驟就省略了
~]# ./configure --help
~]# ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/etc/nginx.conf --pid-path=/usr/local/nginx/run/nginx.pid --lock-path=/usr/local/nginx/run/nginx.lock --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-http_dav_module --with-threads --with-file-aio --with-stream=dynamic
查看生成的目錄
我們如果要想使用此模塊就要使用load_module加載對應模塊,才能使用其模塊中的指令。如果我們想要將第三方庫編譯成動態裝卸載怎麽辦?只需將--add-module 改為--add-dynamic-module即可
後記
接下來將會整理Nginx的配置文件的使用,以及常用模塊的使用。
參考資料
https://www.nginx.com/resources/admin-guide/installing-nginx-open-source/
Nginx系列--01基本架構及其安裝