Nginx 筆記存檔01:Nginx 編譯、安裝、配置筆記記錄

Nginx

首先我們需要一個內核爲Linux 2.6及以上版本的操作系統,因爲Linux 2.6及以上內核才 支持epoll,而在Linux上使用select或poll來解決事件的多路複用,是無法解決高併發壓力問題 的。 我們可以使用uname-a命令來查詢Linux內核版本,例如:

# uname -a 
Linux wehf2wng001 2.6.18-128.el5 #1 SMP Wed Jan 21 10:41:14 EST 2009 x86_64 x86_64 x86_64 GNU/Linux 

執行結果表明內核版本是2.6.18,符合我們的要求。

1.3.2 使用Nginx的必備軟件

如果要使用Nginx的常用功能,那麼首先需要確保該操作系統上至少安裝瞭如下軟件。

(1)GCC編譯器 GCC(GNU Compiler Collection)可用來編譯C語言程序。

Nginx不會直接提供二進制可 執行程序(1.2.x版本中已經開始提供某些操作系統上的二進制安裝包了)

我們可以使用最簡單的yum方式安裝GCC,
例如: yum install -y gcc

GCC是必需的編譯工具。G++編譯器也可以用yum安裝,例如:

yum install -y gcc-c++ 

Linux上有許多軟件安裝方式,yum只是其中比較方便的一種,其他方式這裏不再贅述。

(2)PCRE庫 PCRE(Perl Compatible Regular Expressions,Perl兼容正則表達式)是由Philip Hazel開發 的函數庫,目前爲很多軟件所使用,該庫支持正則表達式。

它由RegEx演化而來,實際上, Perl正則表達式也是源自於Henry Spencer寫的RegEx。 如果我們在配置文件nginx.conf裏使用了正則表達式,那麼在編譯Nginx時就必須把PCRE 庫編譯進Nginx,因爲Nginx的HTTP模塊要靠它來解析正則表達式。當然,如果你確認不會使 用正則表達式,就不必安裝它。

其yum安裝方式如下:

yum install -y pcre pcre-devel 

pcre-devel是使用PCRE做二次開發時所需要的開發庫,包括頭文件等,這也是編譯Nginx 所必須使用的。

(3)zlib庫 zlib庫用於對HTTP包的內容做gzip格式的壓縮,如果我們在nginx.conf裏配置了gzip on, 並指定對於某些類型(content-type)的HTTP響應使用gzip來進行壓縮以減少網絡傳輸量,那 麼,在編譯時就必須把zlib編譯進Nginx。

其yum安裝方式如下:

yum install -y zlib zlib-devel 

同理,zlib是直接使用的庫,zlib-devel是二次開發所需要的庫。

(4)OpenSSL開發庫 如果我們的服務器不只是要支持HTTP,還需要在更安全的SSL協議上傳輸HTTP,那麼 就需要擁有OpenSSL了。另外,如果我們想使用MD5、SHA1等散列函數,那麼也需要安裝 它。

其yum安裝方式如下: yum install -y openssl openssl-devel

上面所列的4個庫只是完成Web服務器最基本功能所必需的。 Nginx是高度自由化的Web服務器,它的功能是由許多模塊來支持的。而這些模塊可根據 我們的使用需求來定製,如果某些模塊不需要使用則完全不必理會它。同樣,如果使用了某 個模塊,而這個模塊使用了一些類似zlib或OpenSSL等的第三方庫,那麼就必須先安裝這些 軟件。

1.3.3 磁盤目錄

要使用Nginx,還需要在Linux文件系統上準備以下目錄。

(1)Nginx源代碼存放目錄 該目錄用於放置從官網上下載的Nginx源碼文件,以及第三方或我們自己所寫的模塊源 代碼文件。

(2)Nginx編譯階段產生的中間文件存放目錄 該目錄用於放置在configure命令執行後所生成的源文件及目錄,以及make命令執行後生 成的目標文件和最終連接成功的二進制文件。默認情況下,configure命令會將該目錄命名爲 objs,並放在Nginx源代碼目錄下。

(3)部署目錄 該目錄存放實際Nginx服務運行期間所需要的二進制文件、配置文件等。默認情況下, 該目錄爲/usr/local/nginx。

(4)日誌文件存放目錄 日誌文件通常會比較大,當研究Nginx的底層架構時,需要打開debug級別的日誌,這個 級別的日誌非常詳細,會導致日誌文件的大小增長得極快,需要預先分配一個擁有更大磁盤 空間的目錄。

1.3.4 Linux內核參數的優化

由於默認的Linux內核參數考慮的是最通用的場景,這明顯不符合用於支持高併發訪問 的Web服務器的定義,所以需要修改Linux內核參數,使得Nginx可以擁有更高的性能。 在優化內核時,可以做的事情很多,不過,我們通常會根據業務特點來進行調整,當 Nginx作爲靜態Web內容服務器、反向代理服務器或是提供圖片縮略圖功能(實時壓縮圖片) 的服務器時,其內核參數的調整都是不同的。這裏只針對最通用的、使Nginx支持更多併發 請求的TCP網絡參數做簡單說明。

首先,需要修改/etc/sysctl.conf來更改內核參數。

例如,最常用的配置:

然後執行sysctl-p命令,使上述修改生效。
上面的參數意義解釋如下:

  • file-max:這個參數表示進程(比如一個worker進程)可以同時打開的最大句柄數,這 個參數直接限制最大併發連接數,需根據實際情況配置。

  • tcp_tw_reuse:這個參數設置爲1,表示允許將TIME-WAIT狀態的socket重新用於新的 TCP連接,這對於服務器來說很有意義,因爲服務器上總會有大量TIME-WAIT狀態的連接。

  • tcp_keepalive_time:這個參數表示當keepalive啓用時,TCP發送keepalive消息的頻度。 默認是2小時,若將其設置得小一些,可以更快地清理無效的連接。

  • tcp_fin_timeout:這個參數表示當服務器主動關閉連接時,socket保持在FIN-WAIT-2狀 態的最大時間。

  • tcp_max_tw_buckets:這個參數表示操作系統允許TIME_WAIT套接字數量的最大值, 如果超過這個數字,TIME_WAIT套接字將立刻被清除並打印警告信息。該參數默認爲 180000,過多的TIME_WAIT套接字會使Web服務器變慢。

  • tcp_max_syn_backlog:這個參數表示TCP三次握手建立階段接收SYN請求隊列的最大 長度,默認爲1024,將其設置得大一些可以使出現Nginx繁忙來不及accept新連接的情況時, Linux不至於丟失客戶端發起的連接請求。

  • ip_local_port_range:這個參數定義了在UDP和TCP連接中本地(不包括連接的遠端) 端口的取值範圍。

  • net.ipv4.tcp_rmem:這個參數定義了TCP接收緩存(用於TCP接收滑動窗口)的最小 值、默認值、最大值。

  • net.ipv4.tcp_wmem:這個參數定義了TCP發送緩存(用於TCP發送滑動窗口)的最小 值、默認值、最大值。

  • netdev_max_backlog:當網卡接收數據包的速度大於內核處理的速度時,會有一個隊列 保存這些數據包。這個參數表示該隊列的最大值。

  • rmem_default:這個參數表示內核套接字接收緩存區默認的大小。

  • wmem_default:這個參數表示內核套接字發送緩存區默認的大小。

  • rmem_max:這個參數表示內核套接字接收緩存區的最大大小。

  • wmem_max:這個參數表示內核套接字發送緩存區的最大大小。

注意 滑動窗口的大小與套接字緩存區會在一定程度上影響併發連接的數目。每個 TCP連接都會爲維護TCP滑動窗口而消耗內存,這個窗口會根據服務器的處理速度收縮或擴 張。
參數wmem_max的設置,需要平衡物理內存的總大小、Nginx併發處理的最大連接數量 (由nginx.conf中的worker_processes和worker_connections參數決定)而確定。當然,如果僅僅 爲了提高併發量使服務器不出現Out Of Memory問題而去降低滑動窗口大小,那麼並不合 適,因爲滑動窗口過小會影響大數據量的傳輸速度。

rmem_default、wmem_default、 rmem_max、wmem_max這4個參數的設置需要根據我們的業務特性以及實際的硬件成本來綜 合考慮。

  • tcp_syncookies:該參數與性能無關,用於解決TCP的SYN攻擊。

1.3.5 獲取Nginx源碼

可以在Nginx官方網站(http://nginx.org/en/download.html )獲取Nginx源碼包。將下載的 nginx-1.0.14.tar.gz源碼壓縮包放置到準備好的Nginx源代碼目錄中,然後解壓。

1.4 編譯安裝Nginx

安裝Nginx最簡單的方式是,進入nginx-1.0.14目錄後執行以下3行命令:

./configure 
make 
make install 

configure命令做了大量的“幕後”工作,包括檢測操作系統內核和已經安裝的軟件,參數 的解析,中間目錄的生成以及根據各種參數生成一些C源碼文件、Makefile文件等。

make命令根據configure命令生成的Makefile文件編譯Nginx工程,並生成目標文件、最終 的二進制文件。

make install命令根據configure執行時的參數將Nginx部署到指定的安裝目錄,包括相關目 錄的建立和二進制文件、配置文件的複製。

1.5 configure詳解

可以看出,configure命令至關重要,下文將詳細介紹如何使用configure命令,並分析 configure到底是如何工作的,從中我們也可以看出Nginx的一些設計思想。

1.5.1 configure的命令參數

使用help命令可以查看configure包含的參數。
./configure --help 這裏不一一列出help的結果,只是把它的參數分爲了四大類型,下面將會詳述各類型下 所有參數的用法和意義。
1.路徑相關的參數
表1-2列出了Nginx在編譯期、運行期中與路徑相關的各種參數。


2.編譯相關的參數

表1-3列出了編譯Nginx時與編譯器相關的參數。

3.依賴軟件的相關參數

表1-4~表1-8列出了Nginx依賴的常用軟件支持的參數。



4.模塊相關的參數

除了少量核心代碼外,Nginx完全是由各種功能模塊組成的。這些模塊會根據配置參數 決定自己的行爲,因此,正確地使用各個模塊非常關鍵。

在configure的參數中,我們把它們 分爲五大類。

  • 事件模塊。

  • 默認即編譯進入Nginx的HTTP模塊。

  • 默認不會編譯進入Nginx的HTTP模塊。

  • 郵件代理服務器相關的mail模塊。

  • 其他模塊。

(1)事件模塊 表1-9中列出了Nginx可以選擇哪些事件模塊編譯到產品中。

(2)默認即編譯進入Nginx的HTTP模塊 表1-10列出了默認就會編譯進Nginx的核心HTTP模塊,以及如何把這些HTTP模塊從產品 中去除。


(4)郵件代理服務器相關的mail模塊

表1-12列出了把郵件模塊編譯到產品中的參數。

5.其他參數

configure還接收一些其他參數,表1-13中列出了相關參數的說明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章