nginx詳解

nginx的啓動和簡易部署

nginx服務器的啓動:  

nginx源碼安裝默認安裝路徑爲:/usr/local/nginx
把nginx的啓動腳本加入到path環境變量:
  export PATH=$PATH:/usr/local/nginx/sbin
php

查看一下幫助文檔:html

[root@os1 sbin]# nginx -h
nginx version: nginx/1.2.9
Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit  #顯示版本號
  -V            : show version and configure options then exit # 顯示版本號及可選參數退出
  -t            : test configuration and exit                  # 測試配置文件,並退出
  -q            : suppress non-error messages during configuration testing # 測試配置文件時,只顯示錯誤
  -s signal     : send signal to a master process: stop, quit, reopen, reload # 接收後面的信號
  -p prefix     : set prefix path (default: /usr/local/nginx/)   # 指定nginx的安裝路徑
  -c filename   : set configuration file (default: conf/nginx.conf)  # 設定nginx的配置文件
  -g directives : set global directives out of configuration file # 指定nginx的附加配置文件

啓動的時候直接使用nginx命令便可。前端

nginx服務器的中止:linux

在上面的命令幫助裏面有一個-s參數,nginx服務中止,能夠藉助於-s參數,nginx -s stop便可中止nginx服務器。nginx

nginx服務器的信號控制

nginx除了使用安裝包裏面的nginx基本進行重啓以外,還可使用linux系統的信號傳輸機制。正則表達式

nginx服務器在運行是,會保持一個主進程和一個或多個工做進程,咱們能夠經過給nginx服務主進程發送信號就能夠控制服務的動做。後端

[root@db1 ~]# ps aux |grep nginx
root     25281  0.0  0.1  96492  2116 ?        Ss   Jul06   0:00 nginx: master process nginx
nginx    25282  0.0  0.1  96884  3084 ?        S    Jul06   0:01 nginx: worker process
root     25313  0.0  0.0 103244   840 pts/1    S+   08:34   0:00 grep nginx

#這裏面是一個主進程和一個worker進程

nginx服務主進程可以接收的信號以下:瀏覽器

  做用
TERM或INT 快速中止nginx服務
QUIT 平緩中止nginx服務
HUP 使用新的配置文件啓動進程,以後平緩中止原有進程,也就是所謂的「平滑重啓」
USR1 從新打開日誌文件
USR2 使用新版本的nginx文件啓動服務,以後平緩中止原有nginx進程,也就是」平滑升級」
WINCH 平緩中止worker process,用於nginx服務器平滑升級。

而後使用kill向nginx主進程發送信號:緩存

kill  SIGNAL  PID #向主進程發送信號

nginx服務重啓安全

更改nginx服務器的配置和加入新模塊後,若是但願當前的nginx服務應用新的配置或使新模塊生效,就須要重啓nginx服務。關閉nginx服務,而後使用新的配置文件重啓。

平滑重啓:平滑重啓是這樣一個過程,nginx服務接收到信號後,首先讀取新的nginx配置文件,若是配置語法正確,則啓動新的nginx服務,而後平緩關閉舊的nginx服務進程;若是新的nginx服務配置有問題,將顯示錯誤,仍然使用舊的nginx進程提供服務。

平滑重啓命令以下:

./nginx -g HUP  [-c  newConfigFile]  
#HUP信號用於發送平滑重啓信號
#newConfigFile  用於指定新的配置文件

nginx服務器基礎配置指令

nginx默認的服務器配置文件都存放在安裝目錄conf中,主配置文件名nginx.conf.。首先查看一下nginx的配置文件。

user              nginx;                      #在全局中生效
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;


events {                                       #在events塊中生效
    worker_connections  1024;
}


http {                                         #在http模塊中生效
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;         #在導入conf.d目錄下面的配置文件,server虛擬目錄塊在裏面配置

}

全局塊

  全局塊是默認配置文件從開始到events塊之間的一部份內容,主要設置一些影響nginx服務器總體運行的配置指令,所以,這些指令的做用域是nginx服務器全局。

  一般包含配置nginx服務器的用戶組,容許生成的worker process數,nginx進程PID存放路徑,日誌的存放路徑和類型以及配置文件的引入。

events塊

  events塊涉及的指令主要影響nginx服務器與用戶的網絡鏈接。經常使用到的設置包含是否開啓對多進程worker process下的網絡鏈接進行序列化,是否容許同時接收多個網絡鏈接,選取那種事件驅動模型處理鏈接請求,每一個worker process能夠同時支持的最大鏈接數等。

  這一部分指令對nginx服務器的性能影響比較大。

http塊

  http塊是nginx服務器配置中的重要部分,代理,緩存和日自定義等絕大多數的功能和第三方的配置均可以放在這個模塊中。

  http塊中能夠包含本身的全局塊,也能夠包含server塊,server塊中又能夠進一步包含location塊。

server塊

  server塊和虛擬主機的概念有密切聯繫。

  虛擬主機,又稱爲虛擬服務器,主機空間或網頁空間,它是一種技術。該技術是爲了節省互聯網服務器硬件成本而出現的。

配置服務器運行的nginx服務器用戶名,用戶組

user usename  [group];
username:  指定能夠運行nginx服務器的用戶。
group:    可選項,指定能夠運行nginx服務器的用戶組。

只有被設置的用戶或者用戶組纔有權限啓動nginx。

若想全部的用戶均可以啓動nginx進程,能夠把username,group都設置爲nobody,或者把這一行註釋掉。

配置容許生成的worker process數量

worker process是nginx服務器實現併發處理服務的關鍵所在。

worker process  number |auto;
number:指定nginx進程最多能夠產生worker process的數量、
auto:設置此值,nginx進程將自動檢測。

配置系統的pid路徑

pid   file;

#默認是在nginx安裝目錄logs下面,名字爲nginx.pid,可使用絕對路徑或相對路徑

配置錯誤日誌的存放路徑

在全局塊,http塊和server塊中均可以對nginx服務器的日誌進行相關配置。

error_log  file [debug|into|notice|warn|error|crit|alert|emerg]

後面的日誌的級別,從低到高能夠選擇、

配置文件的引入

include file;

file爲要引入的配置文件。

新引用的文件一樣要求運行nginx進程的用戶對其具備寫權限,而且符合nginx配置文件規定的相關語法和結構。

設置網絡鏈接的序列化

當某一個時刻只有一個網絡鏈接到來時,多個睡眠進程會被同時叫醒,可是隻有一個進程可得到鏈接。若是每次喚醒的進程數目太多,會影響一部分系統性能。在nginx服務器的多進程下,就由可能出現這樣的問題。

爲了解決這樣的問題,nginx配置中包含了這樣一條指令accept_mutex,當其設置爲開啓的時候,將會對多個nginx進程接收鏈接進行序列化,防止多個進程對鏈接的爭搶。其語法結構爲:

multi_accpet   on |off;

此指令默認爲off狀態,即每一個worker process一次只能接收一個新到達的網絡鏈接。此指令只能在events塊中進行設置。

事件驅動模型的選擇

不一樣的事件驅動模型對nginx的性能影響蠻大的,此指令來強制nginx服務器選擇某種事件驅動模型進行消息處理。

use method;
#其中,method可選擇的有:select, poll, kqueue, epoll, rtsig, /dev/poll以及eventport

注意:

  能夠再編譯時使用--with-select_module, 和--without-select_moudle設置是否強制編譯select模塊到nginx內核。

配置最大鏈接數:

worker_connections number;
#主要用來設置容許每個worker process同時開啓的最大鏈接數。

注意:

  這裏的number不只僅包含和前端用戶創建的鏈接數,而是包括全部可能的鏈接數。另外number值不能大於操做系統支持打開的最大文件句柄數量。次指令只能在events塊中配置。

定義MIME-Type

在默認的nginx配置文件中,在http塊中有以下設置:

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

第一行引用了mime_types文件。

第二行中使用指令default_type配置了用於處理前端請求的MIME類型。

自定義服務日誌

nginx服務器支持對服務日誌的格式,大小,輸出等進行配置,須要使用兩個指令,分別是access_log和log_format指令。

access_log指令的語法結構爲:

access_log path [format [buffer=zise]];
paht:配置服務日誌的文件存放路徑和名稱。
format:可選項,自定義服務日誌的格式字符串。
size:配置臨時存放日誌的內存緩存大小。

log_format name  string;
name:  格式字符串的名字,默認爲combined。名字被access_log引用。
string:服務日誌的格式字符串:

一個實例以下:
    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  logs/access.log  main;

log_format中的可用變量,原連接nginx的內置變量

$args                    #請求中的參數值
$query_string            #同 $args
$arg_NAME                #GET請求中NAME的值
$is_args                 #若是請求中有參數,值爲"?",不然爲空字符串
$uri                     #請求中的當前URI(不帶請求參數,參數位於$args),能夠不一樣於瀏覽器傳遞的$request_uri的值,它能夠經過內部重定向,或者使用index指令進行修改,$uri不包含主機名,如"/foo/bar.html"。
$document_uri            #同 $uri
$document_root           #當前請求的文檔根目錄或別名
$host                    #優先級:HTTP請求行的主機名>"HOST"請求頭字段>符合請求的服務器名.請求中的主機頭字段,若是請求中的主機頭不可用,則爲服務器處理請求的服務器名稱
$hostname                #主機名
$https                   #若是開啓了SSL安全模式,值爲"on",不然爲空字符串。
$binary_remote_addr      #客戶端地址的二進制形式,固定長度爲4個字節
$body_bytes_sent         #傳輸給客戶端的字節數,響應頭不計算在內;這個變量和Apache的mod_log_config模塊中的"%B"參數保持兼容
$bytes_sent              #傳輸給客戶端的字節數
$connection              #TCP鏈接的序列號
$connection_requests     #TCP鏈接當前的請求數量
$content_length          #"Content-Length" 請求頭字段
$content_type            #"Content-Type" 請求頭字段
$cookie_name             #cookie名稱
$limit_rate              #用於設置響應的速度限制
$msec                    #當前的Unix時間戳
$nginx_version           #nginx版本
$pid                     #工做進程的PID
$pipe                    #若是請求來自管道通訊,值爲"p",不然爲"."
$proxy_protocol_addr     #獲取代理訪問服務器的客戶端地址,若是是直接訪問,該值爲空字符串
$realpath_root           #當前請求的文檔根目錄或別名的真實路徑,會將全部符號鏈接轉換爲真實路徑
$remote_addr             #客戶端地址
$remote_port             #客戶端端口
$remote_user             #用於HTTP基礎認證服務的用戶名
$request                 #表明客戶端的請求地址
$request_body            #客戶端的請求主體:此變量可在location中使用,將請求主體經過proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass傳遞給下一級的代理服務器
$request_body_file       #將客戶端請求主體保存在臨時文件中。文件處理結束後,此文件需刪除。若是須要之一開啓此功能,須要設置client_body_in_file_only。若是將次文件傳 遞給後端的代理服務器,須要禁用request body,即設置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion      #若是請求成功,值爲"OK",若是請求未完成或者請求不是一個範圍請求的最後一部分,則爲空
$request_filename        #當前鏈接請求的文件路徑,由root或alias指令與URI請求生成
$request_length          #請求的長度 (包括請求的地址,http請求頭和請求主體)
$request_method          #HTTP請求方法,一般爲"GET""POST"
$request_time            #處理客戶端請求使用的時間,單位爲秒,精度毫秒; 從讀入客戶端的第一個字節開始,直到把最後一個字符發送給客戶端後進行日誌寫入爲止。
$request_uri             #這個變量等於包含一些客戶端請求參數的原始URI,它沒法修改,請查看$uri更改或重寫URI,不包含主機名,例如:"/cnphp/test.php?arg=freemouse"
$scheme                  #請求使用的Web協議,"http""https"
$server_addr             #服務器端地址,須要注意的是:爲了不訪問linux系統內核,應將ip地址提早設置在配置文件中
$server_name             #服務器名
$server_port             #服務器端口
$server_protocol         #服務器的HTTP版本,一般爲 "HTTP/1.0""HTTP/1.1"
$status                  #HTTP響應代碼
$time_iso8601            #服務器時間的ISO 8610格式
$time_local              #服務器時間(LOG Format 格式)
$cookie_NAME             #客戶端請求Header頭中的cookie變量,前綴"$cookie_"加上cookie名稱的變量,該變量的值即爲cookie名稱的值
$http_NAME               #匹配任意請求頭字段;變量名中的後半部分NAME能夠替換成任意請求頭字段,如在配置文件中須要獲取http請求頭:"Accept-Language",$http_accept_language便可
$http_cookie
$http_host               #請求地址,即瀏覽器中你輸入的地址(IP或域名)
$http_referer            #url跳轉來源,用來記錄從那個頁面連接訪問過來的
$http_user_agent         #用戶終端瀏覽器等信息
$http_x_forwarded_for
$sent_http_NAME          #能夠設置任意http響應頭字段;變量名中的後半部分NAME能夠替換成任意響應頭字段,如須要設置響應頭Content-length,$sent_http_content_length便可
$sent_http_cache_control
$sent_http_connection
$sent_http_content_type
$sent_http_keep_alive
$sent_http_last_modified
$sent_http_location
$sent_http_transfer_encoding
log_format中可引用的日誌變量

配置容許sendfile方式傳輸文件

用於開啓或關閉使用sendfile傳輸文件,默認值爲off,能夠在http塊,server塊或者location塊中進行設置。

sendfile  on | off;   # 默認爲off,
sendfile_max_chunk  size;
# size值若是大於0,nginx進程的每一個worker process每次調用sendfile()傳輸的數據量最大不能超過這個值;
# 若是設置爲0,則無限制。默認值爲0.

配置鏈接超時時間

與用戶創建會話鏈接後,nginx服務器能夠保持這些鏈接打開一段時間,指令keepalive_timeout就是用來設置此時間的,其語法結構爲:

keepalive_timeout timeout [header_timeout];
#timeout:服務器對連接的保持事件,默認值爲75s。
#可選項,在應答報文頭部的keep-alive域設置超時時間:「Keep-Alive: timeout=header_timeout」.

單鏈接請求數上限

nginx服務器和用戶端創建會話鏈接後,用戶端經過此鏈接發送請求。指令keepalive_requests用於限制用戶經過某一鏈接向nginx服務器發送請求的次數。

keepalice_requests  number;

配置網絡監聽

listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred]  [ssl];
address: ip地址,若是是IPv6,須要使用中括號"[]"括起來。
port:端口號,默認使用80端口。
path:socket文件路徑
default_server:標識符,將此虛擬設置爲address:port的默認主機。
setfib:nginx-0.8.44中使用這個變量爲監聽socket關聯路由表,目前只對FreeBSD系統有用。
backlog=number:設置監聽函數,最多容許多少網絡鏈接同時處於掛起狀態。FreeBSD默認爲-1,其餘平臺默認爲511.
rcvbuf=size, 設置監聽socket接收緩存區大小。
sndbuf=size, 設置監聽socket發送緩存區大小。
deferred, 標識符,將accept()設置爲Deferred模式。
ssl: 使用ssl模式連接。

----------------------
listen命令使用起來比較簡單,
listen  *:80; 監聽全部ip鏈接的80端口
listen    80; 監聽全部ip鏈接的80端口
listen  192.168.1.120:80;  監聽具體ip和具體端口上的鏈接。
listen  192.168.1.120  default_server backlog=1024; 
                #設置192.168.1.120的鏈接請求默認由次虛擬主機處理,而且容許最多1024網絡鏈接同時處於掛起狀態。

基於名稱的虛擬主機配置

客戶可使用這個名稱向此虛擬主機發送請求,配置主機名稱指令爲server_name,

server_name  name ...;
#name能夠是一個名稱,也能夠由多個名稱並列,
server_name  myserver.com   www.test.com;

在name中可使用通配符「*」,可是通配符只能用在三段域名的段首和段尾,和兩端域名的段尾。

server_name  *.myserver.com   www.test.* ;

在那麼中可使用正則表達式,使用"~"做爲正則表達式字符串的開始標記。

server_name  ~^www\d+\.myserver\.com$;

因爲server_name指令支持使用通配符和正則表達式兩種配置名稱的方式,所以在包含多個虛擬主機的配置文件中,可能會出現一個名稱被多個虛擬主機的server_name匹配。爲解決這個問題,nginx作以下規定:
按照如下的優先級選擇虛擬主機,排在前面的優先處理請求。

  • 精確匹配server_name
  • 通配符在開始時匹配server_name成功
  • 通配符在結尾時匹配server_name成功
  • 正則表達式匹配server_name成功

以上四種匹配方式中,若是server_name被處於同一優先級的匹配屢次匹配成功,則首次匹配成功的虛擬主機處理請求。

基於ip的虛擬主機配置

......
server 
{
       listen 80;
       server_name  192.168.1.120;       
}
......

可使用這個ip對網站發起請求。

配置請求的根目錄:

root  path;

設置網站的默認首頁

location / {
            root   html;
            index  index.html index.htm;
        }

#index默承認以有多個值,默認是使用index.html

配置nginx的錯誤頁面響應

error_page code   [=[response]]  uri;
#code: 要處理http錯誤代碼
#response: 可選項,將code指定的錯誤代碼轉化爲新的錯誤代碼response。
#uri: 用指定的頁面響應錯誤代碼。

基於ip配置nginx的訪問權限:

nginx配置經過兩種途徑支持基本訪問權限的控制,其中一種是有http標準模塊ngx_http_access_module支持的,其經過ip來判斷客戶端是否擁有對nginx的訪問權限。

allow指令,用於設置容許訪問nginx的客戶端ip

allow  address |CIDR |all;
address: 容許訪問的客戶端ip,不支持同時設置多個。若是有多個ip須要設置,須要重複使用allow指令。
CIDR:  容許訪問的客戶端cIDR地址。
all: 表示容許全部的客戶端訪問。

###deny指令與allow相反,則爲禁止訪問。

location / {
    deny 192.168.1.1;
    allow 192.168.1.120;
    deny all;
}
從上到下依次匹配,匹配成功就中止繼續匹配。

基於密碼重置nginx的訪問權限:

auth-basic  string |off;
string: 開啓認證功能,並配置驗證時的指示信息。
off:關閉認證功能。

auth_basic_user_file指令,用於設置包含用戶名和密碼信息的文件路徑,語法結構爲:
auth_basic_user_file  file;

須要注意的是:

    這裏建立密碼文件須要用到htpasswd命令,htpasswd命令用法!

相關文章
相關標籤/搜索