Nginx學習筆記二基本配置
1.Nginx的配置文件默認在Nginx程序安裝目錄的conf二級目錄下,主配置文件為nginx.conf.假設您的Nginx安裝
在/usr/local/webserver/nginx/目錄下,那么默認的主配置文件則為/usr/local/webserver/nginx/nginx.conf.
2.Nginx配置參數:
(1)user www www 指定使用的用戶和用戶所在的組
(2)worker_processes 8 指定工作衍生進程數(一般等于CPU的總核數或總核數的兩倍,如兩個四核CPU,則總核數為8)
(3)error_log /data1/logs/nginx_error.log crit;指定錯誤日志存放路徑,錯誤日志記錄級別[debug|info|notice|warn|
error|crit]
(4)pid /usr/local/webserver/nginx/nginx.pid; 指定pid存放的路徑
(5)events{use epoll;} 指定使用的網絡I/O模型,Linux系統推薦采用epoll模型,FreeBSD系統推薦采用kqueue模型.
(6)events{worker_connections 51200;}指定允許的連接數
(7)http{charset gb2312;}設置使用的字符集,如果一個網站有多種字符集,請不要隨便設置,應讓程序員在HTML代碼中通過
Meta標簽設置
(8)http{client_max_body_size 8M;}設置客戶端能夠上傳的文件大小.
(9)http{gzip on ;}開啟gzip壓縮
3.nginx.conf配置文件結構如下:
...
events
{
...
}
http
{
...
server{
...
}
server{
...
}
...
}
4.Nginx可以配置多種類型的虛擬主機:一是基于IP的虛擬主機,二是基于域名的,三是基于端口的
5.本地回環lo,被看作室永遠不會宕掉得接口.它的主要作用是測試本機的網絡配置,能ping通127.0.0.1說明本機的網卡和IP
協議安裝都沒有問題.
6.IP別名背后的概念很簡單:可以在一塊物理網卡上綁定多個IP地址.這樣就能夠在使用單一網卡的同一服務器上運行多個基
于IP的虛擬主機.如果要在eth0網卡設備上添加兩個IP別名192.168.8.43和192.168.8.44可以通過以下ifconfig 和route命令
來進行:
/sbin/ifconfig eth0:1 192.168.8.43 broadcast 192.168.8.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.8.43 dev eth0:1
/sbin/ifconfig eth0:2 192.168.8.44 broadcast 192.168.8.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.8.44 dev eth0:2
配置后如果能從另外一臺服務器ping 192.168.8.43和192.168.8.44 ,如果能ping通,則證明配置無誤.但是通過ifconfig 和
route配置的IP別名在服務器重啟后會消失.不過可以將這兩條命令添加到/etc/rc.local文件中,讓系統開機時自動運行,
vi /etc/rc.local
在文件末尾增加以下內容,然后保存即可.
/sbin/ifconfig eth0:1 192.168.8.43 broadcast 192.168.8.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.8.43 dev eth0:1
/sbin/ifconfig eth0:2 192.168.8.44 broadcast 192.168.8.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.8.44 dev eth0:2
無論是通過IP別名在一臺服務器上配置多個IP地址,還是通過多塊網卡在服務器上配置多個IP地址,在Nginx中都能將其配置
成為基于IP的虛擬主機.
7.在Nginx配置文件中,分別對192.168.8.43,192.168.8.44,192.168.8.45三個IP配置三個純靜態HTML支持的虛擬主機
http{
#第一個虛擬主機
server{
#監聽的IP和端口
listen 192.168.8.43:80;
#主機名稱
server_name 192.168.8.43;
#訪問日志文件存放路徑
access_log logs/sever1.access.log combined ;
location /
{
#默認首頁文件,順序從左到右,如果找不到index.html,則找index.htm
index index.html index.htm
#HTML網頁文件存放的目錄
root /data0/htdocs/server1;
}
}
#第二個虛擬主機
server{
#監聽的IP和端口
listen 192.168.8.44:80;
#主機名稱
server_name 192.168.8.44;
#訪問日志文件存放路徑
access_log logs/sever2.access.log combined ;
location /
{
#默認首頁文件,順序從左到右,如果找不到index.html,則找index.htm
index index.html index.htm
#HTML網頁文件存放的目錄
root /data0/htdocs/server2;
}
}
#第三個虛擬主機
server{
#監聽的IP和端口
listen 192.168.8.45:80;
#主機名稱
server_name 192.168.8.45;
#訪問日志文件存放路徑
access_log logs/sever3.access.log combined ;
location /
{
#默認首頁文件,順序從左到右,如果找不到index.html,則找index.htm
index index.html index.htm
#HTML網頁文件存放的目錄
root /data0/htdocs/server3;
}
}
}
從配置文件可以看出,一段server{...}就是一個虛擬主機,如果要配置多個虛擬主機,建立多段server{}配置即可,監聽的IP和
端口也可以不寫IP地址,只寫端口,把它配置成"listen 80",則表示監聽該服務器上所有Ip的80端口,可以通過server_name區
分不同的虛擬主機.
8.基于域名的虛擬主機是最常見的虛擬主機,只需配置DNS服務器,將每個主機名映射到正確的IP地址,然后配置Nginx服務器,
令其識別不同的主機名即可.這種技術可以使很多虛擬主機共享同一個IP地址.
9.Nginx中配置基于域名的虛擬主機.主機1對aaa.domain.com的訪問都由它來處理,主機2對bbb.otherdomain.com的訪問都由
它來處理,主機3對域名www.domain.com,domain.com及aaa.domain.com之外的所有*.domain.com二級域名的訪問都由它來處理
.每個虛擬主機的網頁文件分別存放在了不同的目錄中,每個虛擬主機使用了不同的日志文件來記錄訪問日志.配置情況如下:
http{
#第一個虛擬主機
server{
#監聽的端口
listen 80 ;
#主機名稱
server_name aaa.domain.com;
#訪問日志文件存放路徑
access_log logs/aaa.domain.com.access.log combined ;
location /
{
index index.html index.htm;
root /data0/htdocs/aaa.domain.com;
}
}
#第二個虛擬主機
server{
listen 80;
server_name bbb.otherdomain.com;
access_log logs/bbb.otherdomain.com.access.log.combined ;
location /
{
index index.html index.htm
root /data0/htdocs/bbb.otherdomain.com;
}
}
#第三個虛擬主機
server{
listen 80;
server_name www.domain.com domain.com *.domain.com;
access_log logs/bbb.domain.com.access.log bombined ;
location /
{
index index.html index.htm ;
root /data0/htdocs/domain.com;
}
}
}
10.Nginx的日志文件配置與切割
與Nginx日志相關的指令主要有兩條,一條是log_format,用來設置日志的格式,另外一條是access_log,用來指定日志文件的
存放路徑,格式和緩存大小.兩條指令在Nginx配置文件中的位置可以在http{...}之間,也可以在虛擬主機之間,即server{...}
11.用log_format指令設置日志格式
設置格式為:
log_format name format [format ...]
name 表示定義的格式名稱 , format 表示定義的格式樣式. log_format有一個默認的,無須設置的combined日志格式設置.也
可以自定義一份日志記錄格式,不過需要注意,log_format指令設置的name名稱在Nginx配置文件中是不能重復的.
具體參數如下:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
注意:如果Nginx作為Web服務器,位于負載均衡設備,Squid,Nginx反向代理之后,就沒法獲得客戶端的真實IP地址了.即
$reomte_addr變量拿到得不是客戶端的IP地址,而是反向代理服務器的IP地址.但是反向代理服務器在轉發請求的HTTP頭信息
中,可以增加X-Forwarded-For信息,用來記錄原有的客戶端IP地址和原來客戶端請求的服務器地址.這個時候可以自定義日志
格式.如下.
log_format mylogformat '$http_x_forwarded_for - $remote_user [$time_local]'
'"$request" $status $body_bytes_sent'
'"$http_referer" "$http_user_agent"';
在日志格式中,變量
$remote_addr 和$http_x_forwarded_for用于記錄IP地址
$remote_user 用來記錄遠程客戶端用戶名稱;
$time_local用于記錄訪問時間與時區;
$request用于記錄請求URL與HTTP協議;
$status用于記錄請求狀態,例如成功時狀態為200,頁面找不到時狀態為404;
$body_bytes_sent用于記錄發送給客戶端的文件主體內容大小
$http_referer用于記錄是從哪個頁面鏈接訪問過來的;
$http_user_agent用于記錄客戶端瀏覽器的相關信息
日志信息如下:
123.42.4.194 - - [12/Mar/2009:02:18:23 +0800] "GET / HTTP/1.1" 200 36179 "-" "Mozilla/4.0 (compatible;MSIE
7.0;Windows NT 5.1;Mozilla/4.0 (compatible; MSIE6.0; Windows NT 5.1; SV1) ; CIBA; .NET CLR 2.0.50727)"
分別對應以上的變量
12.用access_log指令指定日志文件存放路徑
access_log path [format [buffer=size | off]]
path表示日志文件的存放路徑,format表示使用log_format指令設置的日志格式的名稱,buffer=size 表示設置內存緩存區的
大小,例如可以設置buffer=32k
(1)不記錄日志.可以用如下指令關閉記錄.
access_log off ;
(2)使用默認的combined格式的日志記錄,使用如下示例:
access_log /data1/logs/filename.log;
或
access_log /data1/logs/filename.log combined ;
(3)如果使用自定義格式的日志記錄,就需要兩條命令了.mylogformat是日志格式名稱
log_format mylogformat '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for' ;
access_log /data1/logs/access.log mylogformat buffer=32k
(4)在Nginx0.7.4之后的版本中,access_log指令中的日志文件路徑可以包含變量.如:
access_log /data1/logs/$server_name.log combined
如果sever_name指令設置的虛擬主機名稱為test.domain.com.那么access_log指令將把訪問日志記錄在
/data1/logs/test.domain.com.log文件中
13.日志文件中含有變量的限制
(1)Nginx進程設置的用戶和組必須有對該路徑創建文件的權限.假設Nginx的user指令設置的用戶名和用戶組都是www,
而/data1/logs/目錄的用戶名和用戶組為root.日志文件/data1/logs/test.domain.com.log將無法被Nginx創建.
(2)緩沖將不會被使用.(這個沒看明白)
(3)每一條日志記錄,日志文件都將先打開文件,再寫人日志記錄,然后馬上關閉,這個比較耗性能,為了提高包含變量的日志文
件存放路徑的性能,須要使用open_log_file_cache指令設置經常被使用的日志文件描述符緩存.
語法:
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time] | off
例如:open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m ;
max:設置緩存中的最大文件描述符數量
inactive: 設置一個時間,如果在設置的時間內沒有使用此文件描述符,則自動刪除此描述符,默認是10秒
min_uses:在參數inactive指定的時間范圍內,如果日志文件超過被使用的次數,則將該日志文件的描述符記入緩存,默認次數
為1.
valid:設置檢查時間,看變量指定的日志文件路徑與文件名是否仍然存在,默認時間為60秒.
open_log_file_cache off 禁止使用緩存.
14.日志文件的切割
生產環境中的服務器,由于訪問日志文件增長速度非常快,日志太大會嚴重影響服務器效率.同時為了方便對日志進行分析計算
,須要對日志進行定時切割.定時切割的方式有按月切割,按天切割,按小時切割.最常用的是按天切割.
切割命令如下:
mv /data1/logs/access.log /data1/logs/20090318.log
kill -USR1 Nginx主進程號
或者(如果在配置文件中使用了 pid /usr/local/webserver/nginx/nginx.pid指令)
mv /data1/logs/access.log /data1/logs/20090318.log
kill -USR1 'cat /usr/local/webserver/nginx/nginx.pid' 這樣的話就不用ps查找Nginx主進程號了.
如果要讓它每天定時切割日志,可以編寫shell腳本.并且利用crontab來每天定時運行.
shell 腳本代碼:
#!/bin/bash
#定義Nginx日志文件的存放路徑
logs_path = "/data1/logs/"
mkdir -p ${logs_path}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday"+"%m")/
access_$(date -d "yesterday" + "%Y%m%d").log
kill -USR1 'cat /usr/local/webserver/nginx/nginx.pid'
再配置crontab,輸入crontab -e
輸入:
00 00 * * * /bin/bash /usr/loca/webserver/nginx/sbin/cut_nginx_log.sh
shell腳本和crontab配置主要實現的功能是:假設今天的日期為2009年5月19日,Nginx當前的日志文件
為/data1/logs/access.log,2009年5月20日00:00會執行cut_nginx_log.sh腳本,cut_nginx_log.sh腳本首先創建一個目錄
/data1/logs/2009/05/,然后將/data1/logs/access.log文件移動并重命名為/data1/logs/2009/05/access_20090519.log,
再發送kill -USR1信號給Nginx主進程,告訴Nginx重新生成一個/data1/logs/access.log文件,2009年5月20日的日志記錄在這
個新生成的日志文件中.而/data1/logs/2009/05/access_20090519.log文件,就是2009年5月19日的日志文件.
15.Nginx的壓縮輸出配置.
經過gzip壓縮后頁面大小可以變為原來的30%甚至更小,這樣用戶瀏覽頁面的時候速度會快很多.服務器壓縮,瀏覽器解壓
縮.IE,Firefox,Opera,Chrome都支持gzip解壓縮.
壓縮輸出的相關指令位于http{...}兩個大括號之間:
gzip on ;
gzip_min_length 1k;
gzip_buffers 4 16k ;
gzip_http_version 1.1 ;
gzip_comp_level 2 ;
gzip_types text/plain application/x-javascript text/css application/xml ;
gzip_vary on ;
16.Nginx的自動列目錄配置.
感覺沒什么用,就不寫了,用到再查.
17.Nginx的瀏覽器本地緩存設置.
瀏覽器在用戶磁盤上對最近請求過的文檔進程存儲,當訪問者再次請求這個頁面時,瀏覽器就可以從本地磁盤顯示文檔,這樣就
可以加速頁面的閱歷.
通過expires指令輸出Header頭來實現緩存.控制HTTP應答中的"Expires"和"Cache-Control"的Header頭信息.
語法: expires [ time | epoch | max | off]
默認值為: expires expires off
作用域: http , server , location
time可以為正數或負數,Expires頭標的值將通過當前系統時間加上您設定的time值來獲得.
"Cache-Control"頭標的值由指定的時間來決定.
負數:Cache-Control:no-cache
正數或零:Cache-Control:max-age=您指定的時間的秒數,-1表示永遠過期.
epoch指定Expires的值為1 january,1970,00:00:01 GMT
max指定"Expires”的值為31December 2037 23:59:59 GMT , "Cache-Control"的值為10年
off表示不修改"Expires"和"Cache-Control"的值.
18網站一般緩存設置.不常被修改的javascript,圖片, Flash ,css可以通過expires設置瀏覽器緩存.
配置代碼如下:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d ;
}
location ~ .*\.(js|css)?$
{
expires 1h ;
}
對圖片和flash緩存30天,對css 和js 緩存1個小時.