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進程在響應用戶請求可以通過異步、事件驅動和非阻塞多種方式;與緩存相關的進程用于加載,管理緩存對象。
平滑升級:master/worker進程的工作模式使得能Nginx能夠平滑升級。升級時我們先關閉master進程,由于負責處理請求的是work進程,所以并不影響業務。此時我們在啟動升級后的master,舊版本的work進程此時不再接受新請求,完成正在處理的后會關閉。升級后的master進程會啟動升級后的work進程。這樣就達到了平滑升級
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安裝,一種使用源碼安裝。
操作系統版本:
1. YUM源安裝Nginx
一般沒有什么特許要求我們都是通過信任的yum源進行安裝
1)配置yum源
Nginx在EPEL源中,我們使用的是阿里的鏡像。
~]# vim /etc/yum.repos.d/epel.repo
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/
轉載于:https://blog.51cto.com/13589448/2070319
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Nginx系列--01基本架构及其安装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NoSQL之【Redis】学习(二):配
- 下一篇: Nginx配置SSL后不能正常访问解决方