1. 程式人生 > >Nginx詳解(二)操作

Nginx詳解(二)操作

ive nal set gen local pcr 大小寫 cpu 目錄結構

一、前言
二、Nginx安裝
三、Nginx的配置文件詳解
四、nginx配置之http段
五、其他模塊
六、實驗

一、前言
http://www.nginx.cn/doc/ nginx安裝等各個操作界面介紹
Nginx主要實現兩個功能:Web服務器和反向代理
Nginx的模塊類型:
核心模塊:core module
標準模塊:
Stanard HTTP modules
Optional HTTP modules
Mail modules
第三方模塊:
cat /etc/nginx/nginx.conf //查看pid文件,例如pid為4664
pidof nginx //也可查看pid
lsof -i:80 //查看80端口對應的程序

二、Nginx安裝
1.編譯安裝 //參考博客
http://nginx.org/en/docs/configure.html
http://www.nginx.cn/install
yum -y install openssl-devel
yum -y install pcre-devel
yum -y install zlib-devel
//這幾個會依賴到,解壓源碼文件後,記得創建鏈接文件
[root@web nginx]# useradd -u 108 -r -g 108 nginx
實際用到的參數:

./configure \  
  --prefix=/usr \   
   --sbin-path=/usr/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/ \   
   --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \   
   --with-pcre

=======================

--prefix=path    定義一個目錄,存放服務器上的文件 ,也就是nginx的安裝目錄。默認使用 /usr/local/nginx。
--sbin-path=path 設置nginx的可執行文件的路徑,默認為  prefix/sbin/nginx.
--conf-path=path  設置在nginx.conf配置文件的路徑。nginx允許使用不同的配置文件啟動,通過命令行中的-c選項。默認為prefix/conf/nginx.conf.
--pid-path=path  設置nginx.pid文件,將存儲的主進程的進程號。安裝完成後,可以隨時改變的文件名 , 在nginx.conf配置文件中使用 PID指令。默認情況下,文件名 為prefix/logs/nginx.pid.
--error-log-path=path 設置主錯誤,警告,和診斷文件的名稱。安裝完成後,可以隨時改變的文件名 ,在nginx.conf配置文件中 使用 的error_log指令。默認情況下,文件名 為prefix/logs/error.log.
--http-log-path=path  設置主請求的HTTP服務器的日誌文件的名稱。安裝完成後,可以隨時改變的文件名 ,在nginx.conf配置文件中 使用 的access_log指令。默認情況下,文件名 為prefix/logs/access.log.
--user=name  設置nginx工作進程的用戶。安裝完成後,可以隨時更改的名稱在nginx.conf配置文件中 使用的 user指令。默認的用戶名是nobody。
--group=name  設置nginx工作進程的用戶組。安裝完成後,可以隨時更改的名稱在nginx.conf配置文件中 使用的 user指令。默認的為非特權用戶。
--with-select_module --without-select_module 啟用或禁用構建一個模塊來允許服務器使用select()方法。該模塊將自動建立,如果平臺不支持的kqueue,epoll,rtsig或/dev/poll。
--with-poll_module --without-poll_module 啟用或禁用構建一個模塊來允許服務器使用poll()方法。該模塊將自動建立,如果平臺不支持的kqueue,epoll,rtsig或/dev/poll。
--without-http_gzip_module — 不編譯壓縮的HTTP服務器的響應模塊。編譯並運行此模塊需要zlib庫。
--without-http_rewrite_module  不編譯重寫模塊。編譯並運行此模塊需要PCRE庫支持。
--without-http_proxy_module — 不編譯http_proxy模塊。
--with-http_ssl_module — 使用https協議模塊。默認情況下,該模塊沒有被構建。建立並運行此模塊的OpenSSL庫是必需的。
--with-pcre=path — 設置PCRE庫的源碼路徑。PCRE庫的源碼(版本4.4 - 8.30)需要從PCRE網站下載並解壓。其余的工作是Nginx的./ configure和make來完成。正則表達式使用在location指令和 ngx_http_rewrite_module 模塊中。
--with-pcre-jit —編譯PCRE包含“just-in-time compilation”(1.1.12中, pcre_jit指令)。
--with-zlib=path —設置的zlib庫的源碼路徑。要下載從 zlib(版本1.1.3 - 1.2.5)的並解壓。其余的工作是Nginx的./ configure和make完成。ngx_http_gzip_module模塊需要使用zlib 。
--with-cc-opt=parameters — 設置額外的參數將被添加到CFLAGS變量。例如,當你在FreeBSD上使用PCRE庫時需要使用:--with-cc-opt="-I /usr/local/include。.如需要需要增加 select()支持的文件數量:--with-cc-opt="-D FD_SETSIZE=2048".
--with-ld-opt=parameters —設置附加的參數,將用於在鏈接期間。例如,當在FreeBSD下使用該系統的PCRE庫,應指定:--with-ld-opt="-L /usr/local/lib".

# make && make install
====================================================
nginx -s {start,quit,reopen,reload,stop} //quit立即終止,stop平滑終止
-t 測試語法

2.提供服務啟動腳本
[root@web nginx-1.4.2]# vim /etc/init.d/nginx

#!/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/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

[root@web ~]# chmod +x /etc/init.d/nginx
用service啟動,並打開瀏覽器訪問

三、Nginx的配置文件詳解
1.nginx的配置文件的組成部分:
主配置文件:nginx.conf
fastcgi,scgi,uwscgi
配置指令(必須以分號結尾):
directive value[va1,va2,va3,...]
支持使用變量:
內部變量:由模塊引入,可直接引用
自定義變量:set var_name value
引用:$var_name
配置文件結構:

    main block//全局配置,對http及mail模塊均有效
        worker_process //產生多少個worker進程,一般建議和cpu個數一樣
    events {
        ...
        worker_conncections 1024; //每個worker模型可以接受的並發數量        
        } //事件驅動的相關配置
    http {
        ...
        公共配置
        server { //虛擬主機
            ...
            server_name
            root //指定根文檔路徑
            alias
            location /url/ { //訪問該url的專用配置
                ...
                }
            }
        server {
            ...
            }
        ...
        };http協議相關的配置
    mail {
        ...
        };mail相關的配置

Nginx配置文件主要分為4部分:main(全局配置),server(主機配置),upstream(負載均衡配置),location(URL匹配特定位置) //逐層繼承
main影響所有,server用於特定指定主機和端口,upstream用於負載均衡,location匹配網頁位置。
server繼承main,location繼承server,upstream既不會繼承其他設置也不會被繼承。
main:全局配置:主模塊執行
events:事件模塊指令
http:http模塊指令

===============================
1)、main段 //由核心模塊引出的配置指令
http://nginx.org/en/docs/ngx_core_module.html //core指令
配置指令的類別:
正常運行必備的配置
優化性能的配置
用於調試、定位問題的配置
正常運行必備的配置:
1.user USERNAME [GROUPNAME] //指定用於運行worker進程的用戶和組
例:user nginx nginx
官網--Document-->Modules reference (Core functionality)
http://nginx.org/en/docs/ngx_core_module.html#error_log
2.pid /path/to/pid_file //指定nginx進程的pid文件路徑
pid /var/run/nginx.pid
3.worker_rlimit_nofile NUMBER //#指定一個nginx進程可以打開的最多文件描述符數目

性能優化的配置:
1.worker_processes NUMBER|auto //設定默認開啟的worker進程數,通常應該為cpu的核心數-1,如果開啟了ssl或者壓縮,建議設置1.5-2倍cpu個數
2.worker_cpu_affinity //CPU綁定進程
worker_cpu_affinity cpumask ...;//cpu掩碼0001,0010,0100,1000 //分別表示1,2,3,4號cpu
worker_cpu_affinity auto [cpumask]; //第幾位為1,表示使用該cpu
例如:
worker_cpu_affinity 0010 0100; //綁定在2,3cpu上
ps axo pid,psr,comm
3.worker_priority NICE//指定nice優先級-20-19==100-139
用於調試、定位問題的配置
1.daemon on|off //是否以守護進程方式啟動nginx,默認on到後臺 ,開啟守護進程回到後臺運行
//只有在調試的時候,才off
2.master_process on|off;//是否以master/worker模型啟動nginx進程,正常應該是on,調試時off
3.error_log file [level];//需要依賴於編譯時--with-debug
error_log /var/log/nginx/error.log warn;
錯誤日誌文件的記錄方式以及日誌級別
方式:file /path/to/log_file
stderr:發送到錯誤輸出,到當前終端
syslog:server=address[,parameter=value] //發送給syslog服務器
memory:size //記錄到內存中
日誌級別:stderr,info,notice,warn,error,crit,alert,emerg
debug依賴於configure中的--with-debug

2)、event段
1.worker_connections 1024; //單個worker的最大並發響應數量
註:只能寫在event段,默認512
註:受限於worker_rlimit_nofile //最大client連接數:worker_process * worker_conncections,
//作為反向代理時max_clients=worker_conncections*worker_process/4 //還需要考慮ulimit
2.use METHOD //指定並發鏈接請求處理時使用的方法,centos使用epoll
select
poll
epoll
kqueue //BSD系統中
rtsig
/dev/poll
eventport
建議:use epoll
3.accept_mutext on|off //建議開啟,mutext互斥機制,臨界區
on:worker進程會輪流接受新請求
4.lock_file FILE //worker使用lock實現互斥,讓各worker輪流去接受請求
lock_file logs/nginx.lock

四、nginx配置之http段
默認的http段內容:
=================================================================================

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
access_log  /var/log/nginx/access.log  main;
sendfile            on;
tcp_nopush          on;
tcp_nodelay         on;
keepalive_timeout   65;
types_hash_max_size 2048;
include             /etc/nginx/mime.types;
default_type        application/octet-stream;

==================================================================================
通用配置:
include是個主模塊指令,實現對配置文件所包含的文件的設定,可以減少主配置文件的復雜度。類似於Apache中的include方法。
default_type屬於HTTP核心模塊指令,這裏設定默認類型為二進制流,也就是當文件類型未定義時使用這種方式,例如在沒有配置PHP環境時,Nginx是不予解析的,此時,用瀏覽器訪問PHP文件就會出現下載窗口。
log_format是Nginx的HttpLog模塊指令,用於指定Nginx日誌的輸出格式。main為此日誌輸出格式的名稱,可以在下面的access_log指令中引用。
client_max_body_size用來設置允許客戶端請求的最大的單個文件字節數。
client_header_buffer_size用於指定來自客戶端請求頭的headerbuffer大小。對於大多數請求,1KB的緩沖區大小已經足夠,如果自定義了消息頭或有更大的cookie,可以增加緩沖區大小。這裏設置為32KB。
large_client_header_buffers用來指定客戶端請求中較大的消息頭的緩存最大數量和大小, “4”為個數,“128K”為大小,最大緩存為4個128KB。
sendfile參數用於開啟高效文件傳輸模式。將tcp_nopush和tcp_nodely兩個指令設置為on,用於防止網絡阻塞。
keepalive_timeout用於設置客戶端連接保持活動的超時時間。在超過這個時間之後,服務器會關閉該連接。
client_header_timeout用於設置客戶端請求頭讀取超時時間。如果超過這個時間,客戶端還沒有發送任何數據,Nginx將返回“Request time out(408)”錯誤。
client_body_timeout用於設置客戶端請求主體讀取超時時間,默認值為60。如果超過這個時間,客戶端還沒有發送任何數據,Nginx將返回“Request time out(408)”錯誤。
send_timeout用於指定響應客戶端的超時時間。這個超時僅限於兩個連接活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連接。
gzip用於設置開啟或者關閉gzip模塊,“gzip on”表示開啟gzip壓縮,實時壓縮輸出數據流。

http://nginx.org/en/docs/http/ngx_http_core_module.html
1)、定義套接字功能(虛擬主機)
server標誌定義虛擬主機開始;
listen用於指定虛擬主機的服務器端口;
server_name用來指定IP地址或者域名,多個域名之間用空格分開;
index用於設定訪問的默認首頁地址;
root指令用於指定虛擬主機的網頁根目錄,這個目錄可以是相對路徑,也可以是絕對路徑;
charset用於設置網頁的默認編碼格式。
access_log用來指定此虛擬主機的訪問日誌存放路徑。最後的main用於指定訪問日誌的輸出格式。

1#.server { ... }
配置一個虛擬主機
server {
listen PORT;
server_name HOSTNAME;
root /path/to/documentroot;
...
}
2#.listen address[:port][default_server] [ssl] [backlog=number][rcvbuf=size][sndbuf=size]//
listen port [default_server] [ssl]//指定本機所有可用端口
listen unix:path [default_server] [ssl] //使用unix socket通信
套接字種類:v4,v6,unix socket //Unix socket使用的是
[backlog=number]//後援隊列:人太多,等待隊列排滿了,靠後援隊列,後援隊列也滿了,那就超時了
[rcvbuf=size] //接受緩沖大小
[sndbuf=size] //發送緩沖大小

default_server:默認虛擬主機//用戶請求的都不匹配時的默認返回信息
ssl:限制只能通過ssl鏈接提供服務
3#.server_name:指定當前server的主機名;後可跟一個空白字符分隔的多個主機;
*:匹配任意長度任意字符
~:正則表達式模式匹配 ,"\d"數字0-9
假如用戶請求的能夠被多個server匹配到,則根據優先級,優先順序如下
1.精確名稱
2.左側通配, *.mt.comm
3.右側通配,www.mt.*
4.正則表達式匹配
正如:www.mt.com
1.server_name www.mt.comm;
2.server_name *.mt.comm;
3.server_name www.mt.*;
4.server_name ~^.*\.mt\..*$;
4#.tcp_nodelay on | off; //只有在長連接時啟用
Nagle算法。它規定:如果包的大小滿足MSS,那麽可以立即發送,否則數據會被放到緩沖區,等到已經發送的包被確認了之後才能繼續發送。
通過這樣的規定,可以降低網絡裏小包的數量,從而提升網絡性能。
tcp自己的優化,把多個小文件打包成一個文件發送
第一個到達的時候,太小了,等待幾個小的結合到一起發,節約帶寬
對keepalived模式下的鏈接啟用tcp_nodelay選項

5#.tcp_nopush on | off;//只有在sendfile啟用時才有用
開啟或者關閉nginx在FreeBSD上使用TCP_NOPUSH套接字選項, 在Linux上使用TCP_CORK套接字選項。 選項僅在使用sendfile的時候才開啟。
默認是關閉的

6#.sendfile on|off
在內核中直接封裝響應報文,並發送,默認是關閉的,建議開啟
... //等等
備註:tcp_nopush和tcp_nodelay的詳細說明詳見:https://www.cnblogs.com/wajika/p/6573014.html

2)、定義路徑相關配置
1#.root PATH //位置http,單個server,located中僅對當前url生效,if in location
可用於server,http,location,if in location
設置web資源路徑映射,用於用戶請求的URL所對應的本地文件系統上的文檔目錄路徑
2#.location
location [ = | ~ | ~* | ^~ |@ ] uri { ... } //優先級
匹配模式:
=:精確匹配
~:正則表達式模式匹配,區分字符大小寫
~*:正則表達式模式匹配,不區分字符大小寫
^~:錨定行首 //對開頭前的uri匹配
@:是用來定義“Named Location ”的(可以理解為獨立於“普通location”和“正則location”之外的第三種類型),這種“Named Location ”不是用來處理普通的HTTP 請求的,它是專門用來處理“內部重定向(internally redirected )”請求的。

註意:這裏說的“內部重定向(internally redirected )”是不需要跟瀏覽器交互的,純粹是服務端的一個轉發行為。
匹配優先級:=,^~,~*,~,不帶符號 //從大到小
location @name { ... }
location可以放在server內部,也可放在location內部
根據用戶請求的URI來匹配定義的location,匹配到時,此請求將被響應的location中所配置的塊所響應
示例1:
location ~*\.txt {
gzip on;
}
server {
...
location {
...
}
location {
...
}
}
示例2:
location ~ .*\.(gif|jpg|jpeg|png|bmgf|swf)$ { //區分大小寫
root /web/www/picture;
expires 30d; //指定靜態文件的過期時間為30天
}
示例3:
location ~ .*.jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
}
示例4:
location ~ ^/(upload|html)/ {
root /web/www;
expires 30d;
}
將upload和html下的所有文件都交給Nginx來處理。
//假如有多個location匹配到了

3#.alias path: //定義路徑別名
只能用在location中
location /i/ {
alias /data/w3/images/;
}
註意:
alias指令,給定的路徑對應於location中的/uri/後的這個url
註:附件2
4#.index index.html //設置默認主頁
http,server,location中都可以定義
5#.自定義錯誤頁面 //根據用戶請求的資源的http響應碼
定義在:http,server,location中
error_page code ... [=[response]] uri;

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
error_page 404 =200 /empty.gif; //重定向404響應碼為200
error_page
6#.try_file //應用於server,location,
try_files file ... uri; //用戶請求的頁面不存在,使用的響應文件,依次查找,都沒有,就用uri
try_files file ... =code;

location /images/ {
try_files $uri /images/default.gif;
}

3)、定義客戶端請求的相關配置
1#.keepalive相關,應用在http,server,location
keepalive_disable none|browser //關閉對哪些瀏覽器的keepalive
例如:keepalive_disable msie6 //msie6不支持長連接
2#.keepalive_requests number //一次長連接所允許請求資源的最大數量
3#.keepalive_timeout timeout [header_timeout]; //超時時間,默認75s
keepalive_timeout 75s //默認
4#.send_timeout 60s //向客戶端發送響應報文的超時時長;特別地,是指兩次寫操作之間的間隔時長

5#.client_body_buffer_size size; //接受客戶端請求報文的body部分的緩沖區大小,默認為16k,超出此大小時,其將被暫存到磁盤上
client_body_buffer_size 8k|16k;
6#.client_body_temp_path path [level1 [level2 [level3]]];
設定用於存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量
例如/var/tmp/body/1,2,3子目錄, 分級存儲,
level1,創建多少個1級子目錄,多少個2級子目錄,多少個3級子目錄
/var/tmp/body 2 1 //創建一級子目錄256個,每個一級目錄創建16個子目錄
2:16進制表示從00-ff,2個十六進制字符來創建一級子目錄,1個16進制字符來創建二級子目錄
2個16進制表示範圍:256
client_body_temp_path /spool/nginx/client_temp 1 2;

6#.client_body_in_file_only on | clean | off;
7#.client_body_in_single_buffer on | off;
8#.
9#.client_body_timeout time;
10#.client_header_buffer_size size;
11#.client_header_timeout time;
12#.client_max_body_size size;

4)、對客戶的請求進行限制的配置
1#.limit_rate rate //限制響應給客戶端每s響應的速率,單位: bytes/second默認是 0:不做限制
location /download/ {
root /web/htdocs;
limit_rate 20;
}
使用dd命令創建測試文件
wget去下載
2#.limit_execpt method...{...} //使用範圍location
limit_execpt GET POST { //只允許該主機可以使用GET,POST之外的其他方法
allow 192.168.1.1/32; //GET方法是大家都可以使用
deny all;
}
curl -X ///使用自定義方法

5)、文件操作優化的配置
1#.aio on|off|threads[=pool] //異步IO,定義為http,server,location中
location /video/ { //線程池不指定,用多少,啟用多少
aio on;
oputput_bufffers 64k;
}
2#.directio size|off //直接io,http,server,location,//數據不再內存中保留,直接寫入到disk
3#.open_file_cache off; //是否緩存,緩存文件的元數據,並不是文件的內容
open_file_cache max=N [inactive=time] //緩存多少個文件的信息,失效時間20s
//當條目滿載的時候,使用LRU最近最少使用算法剔除那些不經常使用的
//inactive:多長時間內沒有被訪問,就定為超時,剔除
nginx可以緩存以下三種信息:
1.文件的描述符,文件大小,和最近一次修改的時間
2.打開的目錄的結構,
3.沒有找到的文件,或者沒有權限訪問的文件的相關信息
open_file_cache max=1000 inactive=20s
4#.open_file_cache_errors on | off; //是否緩存查找時發生錯誤的文件的相關信息
5#.open_file_cache_min_uses number; //open_file_cache指定的inactive參數定義的時長內,至少被命中此處指定的次數,方可不被歸類為inactive
6#.open_file_cache_valid time //valid:合法的,每隔多長時間檢查一下緩存是否失效,默認60s

五、其他模塊
1)、ngx_http_access_module
http://nginx.org/en/docs/http/ngx_http_core_module.html

location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
allow address | CIDR | unix: | all;
應用Context:http, server, location, limit_except
2)、ngx_http_auth_basic_module
location /admin/ {
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
}

Syntax: auth_basic string | off;
Default:
auth_basic off;
Context: http, server, location, limit_except
使用openpasswd或者htpasswd生成
yum -y install httpd
htpasswd -c -m /etc/nginx/.nginxpasswd tom //-d crypt加密
htpaswwd -m /etc/nginx/.nginxpasswd wolf
文件格式:
name:passwd:comment
vim /etc/nginx/nginx.conf
http {
server {
server_name www.mt.com;
root /web/www;
listen 80;
location /admin/ {
auth_basic "Admin Area.";
auth_basic_user_file /etc/nginx/.ngpasswd;

}
}
//註:location只能在server內部,否則會報錯
3)、ngx_http_stub_status_module //狀態頁面
nginx狀態輸出:以後做監控的時候會用到

4)、ngx_http_referer_module //引用參考,從哪裏獲取到的數據
valid_referers none blocked server_names
*.example.com example.* www.example.org/galleries/
~\.google\.;

if ($invalid_referer) { //不被valid_referers匹配到的都是invalid_refer變量的內容
return 403;
}
valid_referers none | blocked | server_names | string
//定義合法的
none:請求報文中首部沒有refer首部
blocked:請求報文refer首部沒有值
server_names:給定一個服務器名稱,來自於該服務器的都認為是合法的
string:
直接字符串,可以使用*作為通配符;
指定正則表達式匹配到的字符串;要使用~開頭;
valid_referers none blocked server_names *.mt.com *.mt.* ~\.mt\.
註:該模塊主要用於防盜鏈

六、實驗
實驗一:開啟status頁面

http  {
    server {
        server_name www.mt.com;  
        root /web/www;
        listen 80;
        location /admin/ {
                auth_basic "Admin Area.";
                auth_basic_user_file /etc/nginx/.ngpasswd;
        }
        location /status {
                stub_status;
        }
    }
}

http://192.168.4.118/status
Active connections: 2 //活動連接,正在處於活動狀態的客戶端連接請求的數量
server accepts handled requests //以前的統計數據
13 13 11
Reading: 0 Writing: 1 Waiting: 1 //正在進行的請求

accpet:已經接受的客戶端連接總數 //總共處理了的連接數
handled:已經處理完成的客戶端連接總數 //成功創建握手的次數
Waiting:共處理的總請求數

Reading:處於讀取client請求報文首部的數量
Writing:處於向客戶端發送響應報文過程中的連接數
Waiting:處於等待客戶端發送請求的空閑進程數,太多,建議調低keepalive值 ////開啟 keep-alive 的情況下,這個值等於 active – (reading+writing), 意思就是 Nginx 已經處理完正在等候下一次請求指令的駐留連接。所以,在訪問效率高,請求很快被處理完畢的情況下,Waiting數比較多是正常的.如果reading +writing數較多,則說明並發訪問量非常大,正在處理過程中。

註:假如無法訪問,可以嘗試修改server_name為ip地址

實驗二:虛擬主機實現
1.vim /etc/hosts //windows也要修改hosts文件
192.168.4.118 www.mt.com web.mt.com
2.vim /etc/nginx/nginx.conf //或者vim /etc/nginx/conf.d/vhosts.conf新建配置文件
server {
listen 80;
server_name www.mt.com;
root /web/www;
}

server {
listen 80;
server_name web.mt.com;
root /web/web;
}
//註:只能在httpd { } 內部
mkdir /web/{web,www} -pv
echo "<h1> web </h1>" > /web/web/index.html
echo "<h1> www </h1>" > /web/www/index.html
nginx -t
nginx -s reload
註意:
1.基於port的虛擬主機
listen指令要使用不同的端口
2.基於hostname的虛擬主機
server_name指向不同的主機名
3.基於ip的虛擬主機
listen IP:PORT

七、其他
1、location匹配順序
location開始:
附件1:location匹配順序
//:=,^~,~*,~,不帶符號 //從大到小
//等於,左半,區分大消息的正則表達式,正則表達式[不區分],不帶符號

    location = / {        //精確匹配
        [ configuration A ]
    }
    
    location / {  //什麽都沒有
        [ configuration B ]
    }
    location /documents/ {  //什麽都沒有,B和C優先級一樣,但是C更精確
        [ configuration C ]
    }
    location ^~ /images/ { //錨定行首
        [ configuration D ]
    }
    location ~* \.(gif|jpg|jpeg)$ {  //有空格,正則表達式不區分大小寫
        [ configuration E ]
    }

對www.mt.com 的請求會匹配到A,
對www.mt.com/index.html的請求會匹配到B
對www.mt.com/documents/document.html會匹配到C
對www.mt.com/images/1.gif會匹配到D
對www.mt.com/documents/1.jpg會匹配到E //C的優先級低於E

2、root和alias的對應關系
http://www.mt.com/bbs/a.jpg
方法1:
location /bbs/ {
alias /web/forum/;
}
訪問的是/web/forum/a.jpg
方法2:
location /bbs/ {
root /web/forum/;
}
訪問的是:/web/forum/bbs/a.jpg

root指令:相當於 /bbs/ 最左側的 "/"
alias指令:相當於 /bbs/ 最右側的 "/"


參考博客:
http://blog.51cto.com/freeloda/1288553
http://www.nginx.cn/doc/
http://nginx.org/en/docs/

Nginx詳解(二)操作