Nginx安裝配置及其理論詳解
Nginx的功能介紹紹及其優勢性能
Nginx的官方站點Nginx.org
Nginx的版本號,次版本號如是表示偶數一般表示是穩定版,如果是基數一般表示是開發版。我們可以根據需要來使用。
Nginx的優勢特性:
1.模塊化設計,有着很好的擴展性。(想實現什麼功能,只需要安裝模塊就好)
2.高可靠性:因爲他是主控進程和worker是同步實現的,一個worker出現問題,會立刻啓動另一個worker。
3.較低的內存消耗,一萬個長連接(keep-alive),在Nginx僅消耗2.5MB內存。
4.支持熱部署 。允許不用停止服務器,而實現更新配置文件,更換日誌文件、更新服務器程序版本。
Nginx的基本功能:
1.支持靜態資源的web服務器,能緩存打開的文件描述符。
2.http,smtp,pop3協議的反向代理服務器、緩存、負載均衡;
3.支持FASTCGI(fpm)
4.支持模塊化,非DSO機制,過濾器(讓文本可以實現壓縮,節約帶寬),ssl及圖像大小調整。
Nginx擴展功能:
基於名稱和ip的虛擬主機
定製訪問日誌
支持平滑升級
支持KEEPALIVE
支持url rewrite
支持路徑別名
支持基於IP和用戶名的訪問控制。
支持傳輸速率限制,支持併發數限制。
Nginx的基本架構:
1.Nginx的基本工作模式: 一個master進程,生成一個或者多個worker進程。但是這裏master是使用root身份啓動的,因爲nginx要工作在80端口。而只有管理員纔有權限啓動小於低於1023的端口。而master主要是負責的作用只是啓動worker,加載配置文件,負責系統的平滑升級。其它的工作是交給worker。那麼當worker被啓動之後,也只是負責一些web最簡單的工作,而其他的工作都是有worker中調用的模塊來實現的。另外注意的是,這些模塊之間是以流水線的方式實現功能的。這裏說的流水線,指的是一個用戶請求,是由多個模塊組合各自的功能依次實現完成的。比如:第一個模塊只負責分析請求首部,第二個模塊只負責查找數據,第三個模塊只負責壓縮數據,依次完成各自工作。來實現整個工作的完成。對那麼他們是如何實現熱部署的呢?其實是這樣的,我們前面說master不負責具體的工作,而是調用worker工作,他只是負責讀取配置文件,因此當一個模塊修改或者配置文件發生變化,是由master進行讀取,因此此時不會影響到worker工作。在master進行讀取配置文件之後,也不會立即的把修改的配置文件告知worker。而是讓被修改的worker繼續使用老的配置文件工作,當worker工作完畢之後,直接當掉這個子進程,更換新的子進程,使用新的規則。
worker主要的工作:
1.接受和處理來自客戶端的連接請求,
2.提供反向代理和過濾功能
3.調用模塊實現完成其他任務。
2.Nginx支持的sendfile機制
Sendfile機制是,用戶將請求發給內核,內核根據用戶的請求調用相應用戶進程,進程在處理時需要資源。此時再把請求發給內核(進程沒有直接IO的能力),由內核加載數據。內核查找到數據之後,會把數據複製給用戶進程,由用戶進程對數據進行封裝,之後交給內核,內核在進行tcp/ip首部的封裝,最後再發給客戶端。這個功能用戶進程只是發生了一個封裝報文的過程,卻要繞一大圈。因此nginx引入了sendfile機制,使得內核在接受到數據之後,不再依靠用戶進程給予封裝,而是自己查找自己封裝,這樣就減少了一個很長一段時間的浪費,這是一個提升性能的核心點。
基於事件驅動:epoll,kqueue,/dev/poll(event ports) 也就是可以異步的IO
消息通知:select,poll,rt signal
Nginx的編譯安裝
1.編譯前準備
編譯安裝nginx需要事先需要安裝開發包組"Development Tools"和 "Development Libraries"。同時,還需要專門安裝pcre-devel包|openssl-devel
# yum -y install pcre-devel # yum -y install openssl-devel
2、創建應用於啓動Nginx的用戶
首先添加用戶nginx,實現以之運行nginx服務進程:
# groupadd -r nginx # useradd -r -g nginx nginx
3.下載源碼包解壓,並且cd到這個包內。接着開始編譯和安裝:
# ./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/local/nginx/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_flv_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/tmp/nginx/client/ \ --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ --with-pcre # make && make install
注意:這個編譯過程可能還是會出現錯誤,要注意查看錯誤日誌。缺少某個開發包,就安裝對應的包-devel.
4.爲nginx提供SysV init腳本:
/etc/nginx/nginx.conf
#!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/local/nginx/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/etc/nginx/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx make_dirs() { # make required directories user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g'` options=`$nginx -V 2>&1 | grep 'configure arguments:'` for opt in $options; do if [ `echo $opt | grep '.*-temp-path'` ]; then value=`echo $opt | cut -d "=" -f 2` if [ ! -d "$value" ]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done } start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 make_dirs echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { configtest || return $? stop sleep 1 start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2;; esac
5.導出需要的文件:
# cd /etc/profile.d/ # vim nginx.sh export PATH=/usr/local/nginx/sbin:$PATH
添加man文件
找到源碼包裏的man文件,把相應的man#,對應的放到/usr/share/man/man#
導出庫文件
導出庫文件就是在原本的找到源碼包的lib文件位置。然後把這個lib的文件路徑寫到/etc/ld.so.conf.d/*.conf的文件中。
#cd /etc/ld.so.conf.d/ #vim nginx.conf /usr/local/nginx/lib
或者使用下面的方法:
#echo '/usr/local/nginx/lib' > /etc/ld.so.conf.d/nginx.conf #ldconfig
而後爲此腳本賦予執行權限:
# chmod +x /etc/rc.d/init.d/nginx
添加至服務管理列表,並讓其開機自動啓動:
# chkconfig --add nginx # chkconfig nginx on
而後就可以啓動服務並測試了:
# service nginx start
Nginx的相關配置:
Nginx的配置文件位置/我這裏編譯安裝的位置/etc/nginx/nginx.conf
#vim /etc/nginx/nginx.conf
Nginx語法着色插件的配置:
這裏打開發現Nginx的配置文件是沒有語法着色的。下面我們來安裝一個簡單的小程序,來實現語法着色。
語法着色用到的一個小插件名字叫nginx.vim.
1.下載頁面:http://www.vim.org/scripts/script.php?script_id=1886
2.下載好後安裝nginx.vim 放置於
/root/.vim/syntax
3.配置nginx.vim
而後在~/.vim/filetype.vim中添加如下行。
auBufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/conf/*if&ft=="|setfiletype nginx |" endif
注意:其中/etc/nginx爲nginx的配置文件。
再次打開文件nginx.conf,就可以看到語法着色了。
Nginx配置文件結構框架:
nginx的配置文件段落是可以分爲三段
main配置段
http配置段
mail配置段
一.main配置段
1.開機必備的配置:
#user username [groupname] 指定worker的啓動用戶和屬組。 #pid /path/to/pidfile 指定pidfile文件 #worker_rlimit_nofile # : 指定一個worker進程所能打開的最大文件個數。 #worker_rlimit_sigpending: 每個用戶能夠發往worker的信號的數量。
2.優化性能的配置:
#worker_processes #: 啓動的worker線程數。 #work_cpu_affinity cpumask ; 將worker進程綁定在CPU上。使用cpumask表示CPU掩碼。 #timer_resolusion t: 時間解析度。定義多久更新一次緩存時鐘。
3.事件相關的配置:
#accept_mutex[on|off] 是否啓用worker進程的負載均衡。 #lock_file /path/to/lock_file ;執行負載均衡鎖文件的存放位置(就是mutex的鎖)。 #accept_mutex_delay #ms: 每個worker等待拿到這個鎖的等待時長。 #use [epoll|rgsig|select|poll] 定義使用的事件模型 #work_connetions #: 每個worker進程所能夠響應的的最大併發請求數;默認是1024.
4..用於調試、定位問題
#daemon[off|on] 正常的時候開啓守護進程模式on。 #master_proccess on|off;
如果是off,表示只開啓master,不啓動worker。這樣處理工作由master直接響應。看看問題還 不是出現在master。如果是on,則開啓master/worker模式。這是由worker響應問題,表示看看問題還不是出現在worker。這樣便於逐項查找問題。
3.錯誤日誌error_log /path/to/error_log level 可以使用debug級別。但是這個選項只有在編譯時使用了--with-debug選項纔有效。
二.http配置段
1.指明監聽的端口:listen 下面是完整的格式.但是一般需要用到的有:
listenaddress:[port][default_server][ssl]
例如:listen 172.16.100.8:8080
如果IP不給出,表示全部的IP。
default_server 用於別人訪問我們的虛擬主機不存在時,來訪問我們默認的虛擬主機。
lack_log = # ,指明tcp協議的back_log的隊列的大小,默認爲-1.表示不啓用。
ssl 表示監聽的端口,必須使用ssl協議。
rcvbuf=size 設定監聽的句柄的so_rcvbuf參數。就是接受緩衝大小
2.server_name name1 name2 […]
定義主機名,可以使用通配符和正則表達式(~):當一個客戶端發起一個報文請求,這是web服務器會把報文中的host,與我們定義的衆多server進行匹配。如果匹配到了就解析到這個對應的server來執行。
判斷流程爲下面五步:
1.先做精確匹配:www.baidu.com
2.左側通配符匹配,例如:*.baidu.com 那麼mail.baidu.com ,.com都解析於該虛擬主機。
3.右側通配符匹配,例如:www.*; www.baidu.com 被匹配過來了。
4.正則表達式匹配,例如:~^.*\.baidu\.com$ 這裏面的點要做轉義,所以加了反斜線。
5.如果都沒有匹配到,就是使用listen中的default server。
3.location [=|~*|^~]/urL{…}
=:表示精確匹配,對於用戶的請求URL,對應各location做逐項匹配。如果對應的找到了,則優先做出處理。
~ :表示正則表達式匹配,區分字符大小寫。
~* :也是正則表達式匹配,但是不區分字符大小寫。
^~ :做URL的前半段匹配,不檢查正則表達式。
對於匹配的優先級,首先是精確匹配=這個是等級最高的.其次是字符字面量匹配^~ 左側匹配, 然後是或者 ~, ~* ,最後對於如果
多個location正則表達式匹配的到,那麼就以第一個被正則表達式匹配到的location作爲處理。
4.root設置web資源路徑的映射,指明請求的URL所對應的目錄的路徑。
5.alias path 別名映射
用於location匹配字段
location /p_w_picpaths/{ //這個表示請求的p_w_picpaths在/web/imags/下面查找p_w_picpaths root “/web/imags” } socation /p_w_picpaths/{ alias “/web/imags” //這個表示路徑別名。也就是說這裏/web/p_w_picpaths=/p_w_picpaths }
默認主頁面:放在http中對所有sever有效
放在server 對所有location有效
放在location只對這個location有效.
6.error_page code[…] [=code]URL | @name
這裏面name表示另一個location 的名字。用另一個location代替這個URL路徑。
error_page 404 /404.html 表示如果狀態信息404狀態碼,就去讀取404.html
還可以可以自己指定狀態碼:使用 =code 比如:
除此之外,錯誤狀態碼還可以是多個,出現那些狀態碼就跳轉到這個跳轉頁面。這個跳轉頁面,然後使用跳轉到指定頁面。
error_page 500 502 503 504 /50x.html; location= /50x.html { root html; }
三.網絡鏈接相關的配置:
1.keepalive_timeout time ; 保持鏈接的超時時長,超過這個時間,就斷開鏈接
2.keepalive_requests #; 再一次保持連接上允許承載最大資源請求數;資源超過就斷開鏈接
3.keepalive_disable [rnsie6][safari][none]; 爲指定類型的瀏覽器禁用長鏈接
4.tcp_nodelay on|off tcp協議爲了節省帶寬,通常在對於一些小報文不是直接發送,而是通過將諸多的小報文匯聚成一個大報文,然後打包發送。但是這樣往往會增加延遲時間,這個選項我們一般是關閉的。
5.client_header_timeout time ;讀取客戶端首部超時時長,主要是針對一些網速比較慢的客戶端,如果超過這個不給於響應。
6.client_body_time_out time ;讀取客戶端請求報文body部分的超時時長。
7.send_timeout time ;發送響應報文的超時時長
其中,keepalive的三個選項是重要的網絡配置選項。
四.對內存或者磁盤資源進行分配:
1.clinet_body_in_file_only on|clean|off 用於定於請求報文的部分是否可以暫存於磁盤,形成緩存;on表示允許,並且即使請求結束不刪除。
clean表示請求報文的可以暫存磁盤,請求結束被刪除。
off關閉這個功能。 這個在編譯nginx的時候,有這麼一個選項,指專門定義這個功能的。
--http-client-body-temp-path
2.client_body_in_single_buffer on|off
用於定於請求報文的部分是否可以暫存於buffer。其實如果我們的buffer。夠大開啓這個功能,是可以加速的。
默認是關閉 。
3.client_body_buffer_size SIZE 是否允許服務器暫存的限制大小
4.client_body_temp_path /var/tmp/nginx DIR [l1][lve2][lve3]…暫存的文件允許暫存的存儲位置,可有多級。
5.client_header_buffer_size SIZE;
五. MIME相關的配置:
1.types{}
定義MIME types至文件的擴展名, 如果說是.html就表示是text/html。
type { Text/html .html; Image/jpeg .jpg; }
2.default_type
六.文本操作優化的相關配置:
Sendfile on|off 是否開啓sendfile機制
aio on|off ; 異步IO 這個一般是要啓動
directio szie|off;是否使用O_DIRECT選項去讀取文件;
open_file _cache max=SIZE | off 緩存最大大小
open_file_cache_error on|off ;是否緩存在文件中打開時找不到文件路徑的,沒有權限的。
open_file_cache_min_users time;每隔多久檢查一次緩存中緩存條目的有效性,默認60秒;
七.各功能模塊的配置
1.訪問控制模塊
基於IP的的控制訪問
可以使用的位置: http,server,location
使用的指令:allow,deny
例如:這裏放在location的頁面進行限制。
server { listen8080; server_name www.stu11.com; location /{ root"/web/htdocs"; } location/IMAGES { alias "/web/htdocs/IMAGES"; Allow 172.16.0.0/16; Deny all; }
基於用戶的訪問控制
location ~/music { root "/web/htdoc3"; auth_basic "close site"; auth_basic_user_file /etc/nginx/.htpasswd; }
注意:這裏的文件還是用htpasswd的生成的。
這裏面的用戶密碼,也是使用htpasswd生成的:
2.壓縮模塊
Gzip on|off 這是應用在http的。
Gzip on;開啓web使用gzip壓縮的功能,節約帶寬。
Gzip_http_version 1.1;壓縮使用的版本
Gzip_comp_level 7;指定壓縮比
Gzip-types ,text/plain….;指定壓縮的類型。
Gzip_min_length 1024;意思就是對於大於這個數字的纔給壓縮。
Gzip_buffers 16 8k 使用多大的緩存來存儲gzip的壓縮結果。內存是離散分段的,這裏表示使用16個8K來緩存。
Gzip_disabled 禁用那種瀏覽器。
3.定義響應首部:add_header
可以添加的位置:http,location,server等。
直接添加一個首部 add_header 。注意每一個首部的構成都是由首部的名字和對應的值構成的。
location / { root "/web/www/html"; Add_header X-header testheader; //首部名和對應的值 }
4.定義合法refer引用。(****)
防止盜鏈使用的模塊。Refer_module.
合法引用的使用主要是兩個部分的定義:
1.定義那些引用是合法的。
2.對於非法的引用返回值,或者頁面。
valid_referers none blocked server_names *.example.com example.* www.example.org/galleries/ ~\.google\.; if ($invalid_referer) { return 403; }
注意:None 表示爲非跨站引用,Block 就表示不以http或者https開頭的,因爲只要不以http開頭的肯定不是絕對路徑,server_nmaes定義的網站可以引用。支持正則表達時和字符串通配。
5.rewrite regex replacement [flag];
[flag]是一個標誌位。
last 的含義:一旦匹配到,對於URL重寫。然後對規則從上到下,繼續查詢。
break 的含義:對於匹配到的請求,給予重寫,並且給予客戶端直接相應。不在查找,防止循環
Redirect ;表示這是臨時重定定向。
例如:
server {
...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
...
}
6.狀態頁面的定義:
location /basic_status { stub_status; }
下面是狀態頁面顯示信息的含義:
Active connection 當前活動的連接數。
Accepts 已經接受的請求
Requests 總共的請求
Handle 已經處理的連接數
Reading 正在讀取的(正在接受請求)
Writing 正在響應報文
Waiting 處於空閒狀態等待。
7. https 表示是否啓用
下面給予https實現的完整演示
爲CA產生私鑰及形成自簽證書
[root@www~]# cd /etc/pki/CA/ [root@wwwCA]# (umask 077;openssl genrsa -out private/cakey.pem 2048) Generating RSA private key, 2048 bit long modulus ............+++ ..............+++ e is 65537 (0x10001)
#opensslreq -new -x509 -key private/cakey.pem -out cacert.pem 填寫證書信息 Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:HA Locality Name (eg, city) [Default City]:ZZ Organization Name (eg, company) [Default Company Ltd]:stu11 Organizational Unit Name (eg, section) []:ops Common Name (eg, your name or your server's hostname) []:web.stu11.com Email Address []:[email protected] [root@wwwCA]# echo 01 >serial [root@wwwCA]# ls cacert.pem certs crl index.txt newcerts private serial
[root@wwwCA]# mkdir /etc/nginx/certs [root@wwwCA]# cd /etc/nginx/certs [root@wwwcerts]# (umask 077; openssl genrsa -out nginx.key 2048) Generating RSA private key, 2048 bit long modulus ......................................................+++ .................................................................+++ e is 65537 (0x10001)
Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:HA Locality Name (eg, city) [Default City]:ZZ Organization Name (eg, company) [Default Company Ltd]:stu11 Organizational Unit Name (eg, section) []:ops Common Name (eg, your name or your server's hostname) []:www.stu11.com Email Address []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []
[root@wwwcerts]# openssl ca -in nginx.csr -out nginx.crt -days 3650 Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Dec 28 02:52:22 2014 GMT Not After : Dec 25 02:52:22 2024 GMT Subject: countryName = CN stateOrProvinceName = HA organizationName = stu11 organizationalUnitName = ops commonName = www.stu11.com emailAddress = [email protected] X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 4F:21:A7:F2:6C:AD:6A:5F:4A:EC:2D:F7:F9:F3:7D:4D:B6:17:07:25 X509v3 Authority Key Identifier: keyid:1D:5B:72:6A:BA:8D:DE:D8:36:AB:F9:26:D0:85:AC:16:E5:4E:7C:DA Certificate is to be certified until Dec 25 02:52:22 2024 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new en
triesData Base Updated
root@wwwcerts]# ls /etc/nginx/certs/ nginx.crt nginx.csr nginx.key [root@www certs]# vim /etc/nginx/nginx.conf server { listen 443 ssl; server_name www.stu11.com; ssl_certificate /etc/nginx/certs/nginx.crt; ssl_certificate_key /etc/nginx/certs/nginx.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /www/vhosts/www.stu11.com; index index.html index.htm; access_log /var/log/nginx/https/error_log; } }
導出CA證書給客戶端:
# sz cacert.pem //我這裏使用本機windows作爲客戶端
將cacert.pem 後綴改爲cacert.crt。然後就能看到證書的樣式了。
安裝證書
看下導入的證書,確定是CA的。
下面可以使用瀏覽器查看結果了!!!