Nginx配置文件nginx.conf詳解
Nginx 總的 配置文件 位置 /usr/local/nginx/conf/nginx.conf
nginx 正則匹配
一.正則表達(dá)式匹配市框,其中:
符號 | 功能 |
---|---|
~ | 為區(qū)分大小寫匹配 |
~* | 為不區(qū)分大小寫匹配 |
!~ 和 !~* | 分別為區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配 |
二.文件及目錄匹配,其中:
符號 | 功能 |
---|---|
-f 和!-f | 用來判斷是否存在文件 |
-d和!-d | 用來判斷是否存在目錄 |
-e和!-e | 用來判斷是否存在文件或目錄 |
-x和!-x | 用來判斷文件是否可執(zhí)行 |
三.rewrite指令的最后一項參數(shù)為flag標(biāo)記宁赤,flag標(biāo)記有:
符號 | 功能 |
---|---|
last | 相當(dāng)于apache里面的[L]標(biāo)記,表示rewrite。 |
break | 本條規(guī)則匹配完成后础芍,終止匹配杠氢,不再匹配后面的規(guī)則些楣。 |
redirect | 返回302臨時重定向昂勉,瀏覽器地址會顯示跳轉(zhuǎn)后的URL地址浪册。 |
permanent | 返回301永久重定向扫腺,瀏覽器地址會顯示跳轉(zhuǎn)后的URL地址岗照。 |
last和break | 實現(xiàn)URI重寫,瀏覽器地址欄不變笆环。 |
alias | 使用指令必須用last標(biāo)記; |
proxy_pass | 使用指令時攒至,需要使用break標(biāo)記。 |
Last | 標(biāo)記在本條rewrite規(guī)則執(zhí)行完畢后躁劣,會對其所在server{......}標(biāo)簽重新發(fā)起請求 |
break | 標(biāo)記則在本條規(guī)則匹配完成后迫吐,終止匹配。 |
四.NginxRewrite 規(guī)則相關(guān)指令
符號 | 功能 | ||
---|---|---|---|
break | 使用環(huán)境:server,location,if;該指令的作用是完成當(dāng)前的規(guī)則集账忘,不再處理rewrite指令志膀。 | ||
if | 使用環(huán)境:server,location;該指令用于檢查一個條件是否符合鳖擒,如果條件符合溉浙,則執(zhí)行大括號內(nèi)的語句。If指令不支持嵌套蒋荚,不支持多個條件&&和 | 處理戳稽。 | |
return | 語法:return code ;使用環(huán)境:server,location,if;該指令用于結(jié)束規(guī)則的執(zhí)行并返回狀態(tài)碼給客戶端。示例:如果訪問的URL以".sh"或".bash"結(jié)尾期升,則返回403狀態(tài)碼.例如: location ~ .*\.(sh|bash)?$ { return 403; }
|
||
rewrite | 語法:rewriteregex replacement flag;使用環(huán)境:server,location,if;該指令根據(jù)表達(dá)式來重定向URI惊奇,或者修改字符串。指令根據(jù)配置文件中的順序來執(zhí)行播赁。注意重寫表達(dá)式只對相對路徑有效颂郎。如果你想配對主機(jī)名,你應(yīng)該使用if語句容为,示例如下:if ( $host ~* www\.(.*) ) { set $host_without_www $1; rewrite ^(.*)$ http://$host_without_www$1 permanent; }
|
||
Set | 語法:setvariable value ; 默認(rèn)值:none; 使用環(huán)境:server,location,if;該指令用于定義一個變量乓序,并給變量賦值诞吱。變量的值可以為文本、變量以及文本變量的聯(lián)合竭缝。示例:set $varname "hello world";
|
||
Uninitialized_variable_warn | 語法:uninitialized_variable_warnon|off;使用環(huán)境:http,server,location,if;該指令用于開啟和關(guān)閉未初始化變量的警告信息房维,默認(rèn)值為開啟。 |
五.Nginx的Rewrite規(guī)則編寫實例
1.當(dāng)訪問的文件和目錄不存在時抬纸,重定向到某個php文件
if ( !-e $request_filename )
{
rewrite ^/(.*)$ index.php last;
}
2.目錄對換 /123456/xxxx ====> /xxxx?id=123456
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
3.如果客戶端使用的是IE瀏覽器咙俩,則重定向到/ie目錄下
if( $http_user_agent ~ MSIE)
{
rewrite ^(.*)$ /ie/$1 break;
}
4.禁止訪問多個目錄
location ~ ^/(cron|templates)/
{
deny all;
break;
}
5.禁止訪問以/data開頭的文件
location ~ ^/data
{
deny all;
}
6.禁止訪問以.sh,.flv,.mp3為文件后綴名的文件
location ~ .*\.(sh|flv|mp3)$
{
return 403;
}
7.設(shè)置某些類型文件的瀏覽器緩存時間
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)$
{
expires 1h;
}
8.給favicon.ico和robots.txt設(shè)置過期時間;
這里為favicon.ico為99天,robots.txt為7天并不記錄404錯誤日志
location ~(favicon.ico)
{
log_not_found off;
expires 99d;
break;
}
location ~(robots.txt)
{
log_not_found off;
expires 7d;
break;
}
9.設(shè)定某個文件的過期時間;這里為600秒,并不記錄訪問日志
location ^~ /html/scripts/loadhead_1.js
{
access_log off;
root /opt/lampp/htdocs/web;
expires 600;
break;
}
10.文件反盜鏈并設(shè)置過期時間
這里的return412 為自定義的http狀態(tài)碼湿故,默認(rèn)為403阿趁,方便找出正確的盜鏈的請求
“rewrite ^/ http://img.linuxidc.net/leech.gif;” 顯示一張防盜鏈圖片
“access_log off;” 不記錄訪問日志,減輕壓力
“expires 3d” 所有文件3天的瀏覽器緩存
location ~*^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$
{
valid_referers none blocked *.linuxidc.com*.linuxidc.net localhost 208.97.167.194;
if ($invalid_referer)
{
rewrite ^/ http://img.linuxidc.net/leech.gif;
return 412;
break;
}
access_log off;
root /opt/lampp/htdocs/web;
expires 3d;
break;
}
11.只允許固定ip訪問網(wǎng)站坛猪,并加上密碼
root /opt/htdocs/www;
allow 208.97.167.194;
allow 222.33.1.2;
allow 231.152.49.4;
deny all;
auth_basic “C1G_ADMIN”;
auth_basic_user_file htpasswd;
12將多級目錄下的文件轉(zhuǎn)成一個文件脖阵,增強(qiáng)seo效果
/job-123-456-789.html 指向/job/123/456/789.html
rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;
13.文件和目錄不存在的時候重定向:
if (!-e $request_filename)
{
proxy_pass http://127.0.0.1;
}
14.將根目錄下某個文件夾指向2級目錄
如/shanghaijob/ 指向 /area/shanghai/
如果你將last改成permanent,那么瀏覽器地址欄顯是/location/shanghai/
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
上面例子有個問題是訪問/shanghai時將不會匹配
rewrite ^/([0-9a-z]+)job$ /area/$1/ last;
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
這樣/shanghai 也可以訪問了墅茉,但頁面中的相對鏈接無法使用命黔,
如./list_1.html真實地址是/area/shanghia/list_1.html會變成/list_1.html,導(dǎo)至無法訪問。
那我加上自動跳轉(zhuǎn)也是不行咯
(-d $request_filename)它有個條件是必需為真實目錄就斤,而我的rewrite不是的悍募,所以沒有效果
if (-d $request_filename)
{
rewrite ^/(.*)([^/])$ http://$host/$1$2/permanent;
}
知道原因后就好辦了,讓我手動跳轉(zhuǎn)吧
rewrite ^/([0-9a-z]+)job$ /$1job/permanent;
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
15.域名跳轉(zhuǎn)
server
{
listen 80;
server_name jump.linuxidc.com;
index index.html index.htm index.php;
root /opt/lampp/htdocs/www;
rewrite ^/ http://www.linuxidc.com/;
access_log off;
}
16.多域名轉(zhuǎn)向
server_name www.linuxidc.com www.linuxidc.net;
index index.html index.htm index.php;
root /opt/lampp/htdocs;
if ($host ~ "linuxidc\.net") {
rewrite ^(.*) http://www.linuxidc.com$1permanent;
}
六.nginx全局變量
變量名 | 功能 |
---|---|
arg_PARAMETER | 這個變量包含GET請求中洋机,如果有變量PARAMETER時的值坠宴。 |
args | 這個變量等于請求行中(GET請求)的參數(shù),如:foo=123&bar=blahblah; |
binary_remote_addr | 二進(jìn)制的客戶地址绷旗。 |
body_bytes_sent | 響應(yīng)時送出的body字節(jié)數(shù)數(shù)量喜鼓。即使連接中斷,這個數(shù)據(jù)也是精確的衔肢。 |
content_length | 請求頭中的Content-length字段庄岖。 |
content_type | 請求頭中的Content-Type字段。 |
cookie_COOKIE | cookie COOKIE變量的值 |
document_root | 當(dāng)前請求在root指令中指定的值膀懈。 |
document_uri | 與uri相同顿锰。 |
host | 請求主機(jī)頭字段,否則為服務(wù)器名稱启搂。 |
hostname | Set to themachine’s hostname as returned by gethostname |
http_HEADER | |
is_args | 如果有args參數(shù)硼控,這個變量等于”?”,否則等于”"胳赌,空值牢撼。 |
http_user_agent | 客戶端agent信息 |
http_cookie | 客戶端cookie信息 |
limit_rate | 這個變量可以限制連接速率。 |
query_string | 與args相同疑苫。 |
request_body_file | 客戶端請求主體信息的臨時文件名熏版。 |
request_method | 客戶端請求的動作纷责,通常為GET或POST。 |
remote_addr | 客戶端的IP地址撼短。 |
remote_port | 客戶端的端口再膳。 |
remote_user | 已經(jīng)經(jīng)過Auth Basic Module驗證的用戶名。 |
request_completion | 如果請求結(jié)束曲横,設(shè)置為OK. 當(dāng)請求未結(jié)束或如果該請求不是請求鏈串的最后一個時喂柒,為空(Empty)。 |
request_method | GET或POST |
request_filename | 當(dāng)前請求的文件路徑禾嫉,由root或alias指令與URI請求生成灾杰。 |
request_uri | 包含請求參數(shù)的原始URI,不包含主機(jī)名熙参,如:”/foo/bar.php?arg=baz”艳吠。不能修改。 |
scheme | HTTP方法(如http孽椰,https)昭娩。 |
server_protocol | 請求使用的協(xié)議,通常是HTTP/1.0或HTTP/1.1弄屡。 |
server_addr | 服務(wù)器地址题禀,在完成一次系統(tǒng)調(diào)用后可以確定這個值鞋诗。 |
server_name | 服務(wù)器名稱膀捷。 |
server_port | 請求到達(dá)服務(wù)器的端口號。 |
七.Apache和Nginx規(guī)則的對應(yīng)關(guān)系
apache的規(guī)則 | nginx的規(guī)則 |
---|---|
RewriteCond | 對應(yīng)Nginx的if |
RewriteRule | 對應(yīng)Nginx的rewrite |
[R] | 對應(yīng)Nginx的redirect |
[P] | 對應(yīng)Nginx的last |
[R,L] | 對應(yīng)Nginx的redirect |
[P,L] | 對應(yīng)Nginx的last |
[PT,L] | 對應(yīng)Nginx的last |
例如:允許指定的域名訪問本站削彬,其他的域名一律轉(zhuǎn)向www.linuxidc.net
Apache:
RewriteCond %{HTTP_HOST} !^(.*?)\.aaa\.com$[NC]
RewriteCond %{HTTP_HOST} !^localhost$
RewriteCond %{HTTP_HOST}!^192\.168\.0\.(.*?)$
RewriteRule ^/(.*)$ http://www.linuxidc.net[R,L]
Nginx:
if( $host ~* ^(.*)\.aaa\.com$ )
{
set $allowHost '1';
}
if( $host ~* ^localhost )
{
set $allowHost '1';
}
if( $host ~* ^192\.168\.1\.(.*?)$ )
{
set $allowHost '1';
}
if( $allowHost !~ '1' )
{
rewrite ^/(.*)$ http://www.linuxidc.netredirect ;
}
nginx conf 配置文件
nginx進(jìn)程數(shù)全庸,建議設(shè)置為等于CPU總核心數(shù).
worker_processes 8;
全局錯誤日志定義類型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
進(jìn)程文件
pid /var/run/nginx.pid;
一個nginx進(jìn)程打開的最多文件描述符數(shù)目融痛,理論值應(yīng)該是最多打開文件數(shù)(系統(tǒng)的值ulimit -n)與nginx進(jìn)程數(shù)相除壶笼,但是nginx分配請求并不均勻,所以建議與ulimit -n的值保持一致雁刷。
worker_rlimit_nofile 65535;
工作模式與連接數(shù)上限
events
{
#參考事件模型覆劈,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本內(nèi)核中的高性能網(wǎng)絡(luò)I/O模型,如果跑在FreeBSD上面沛励,就用kqueue模型责语。
use epoll;
#單個進(jìn)程最大連接數(shù)(最大連接數(shù)=連接數(shù)*進(jìn)程數(shù))
worker_connections 65535;
}
設(shè)定http服務(wù)器
http
{
include mime.types; #文件擴(kuò)展名與文件類型映射表
default_type application/octet-stream; #默認(rèn)文件類型
#charset utf-8; #默認(rèn)編碼
server_names_hash_bucket_size 128; #服務(wù)器名字的hash表大小
client_header_buffer_size 32k; #上傳文件大小限制
large_client_header_buffers 4 64k; #設(shè)定請求緩
client_max_body_size 8m; #設(shè)定請求緩
sendfile on; #開啟高效文件傳輸模式,sendfile指令指定nginx是否調(diào)用sendfile函數(shù)來輸出文件目派,對于普通應(yīng)用設(shè)為 on坤候,如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用,可設(shè)置為off企蹭,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度白筹,降低系統(tǒng)的負(fù)載智末。注意:如果圖片顯示不正常把這個改成off。
autoindex on; #開啟目錄列表訪問徒河,合適下載服務(wù)器系馆,默認(rèn)關(guān)閉。
tcp_nopush on; #防止網(wǎng)絡(luò)阻塞
tcp_nodelay on; #防止網(wǎng)絡(luò)阻塞
keepalive_timeout 120; #長連接超時時間顽照,單位是秒
FastCGI相關(guān)參數(shù)是為了改善網(wǎng)站的性能:減少資源占用它呀,提高訪問速度。下面參數(shù)看字面意思都能理解棒厘。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip模塊設(shè)置
gzip on; #開啟gzip壓縮輸出
gzip_min_length 1k; #最小壓縮文件大小
gzip_buffers 4 16k; #壓縮緩沖區(qū)
gzip_http_version 1.0; #壓縮版本(默認(rèn)1.1纵穿,前端如果是squid2.5請使用1.0)
gzip_comp_level 2; #壓縮等級
gzip_types text/plain application/x-javascript text/css application/xml;
壓縮類型,默認(rèn)就已經(jīng)包含text/html奢人,所以下面就不用再寫了谓媒,寫上去也不會有問題,但是會有一個warn何乎。
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #開啟限制IP連接數(shù)的時候需要使用
upstream blog.ha97.com {
#upstream的負(fù)載均衡句惯,weight是權(quán)重,可以根據(jù)機(jī)器配置定義權(quán)重支救。weigth參數(shù)表示權(quán)值抢野,權(quán)值越高被分配到的幾率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}
虛擬主機(jī)的配置
server
{
listen 80; #監(jiān)聽端口
server_name aa.cn www.aa.cn ; #server_name end #域名可以有多個各墨,用空格隔開
index index.html index.htm index.php; # 設(shè)置訪問主頁
set $subdomain ''; # 綁定目錄為二級域名 bbb.aa.com 根目錄 /bbb 文件夾
if ( $host ~* "(?:(\w+\.){0,})(\b(?!www\b)\w+)\.\b(?!(com|org|gov|net|cn)\b)\w+\.[a-zA-Z]+" ) { set $subdomain "/$2"; }
root /home/wwwroot/aa.cn/web$subdomain;# 訪問域名跟目錄
include rewrite/dedecms.conf; #rewrite end #載入其他配置文件
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
圖片緩存時間設(shè)置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
JS和CSS緩存時間設(shè)置
location ~ .*.(js|css)?$
{
expires 1h;
}
}
日志格式設(shè)定
log_format access '\$remote_addr - \$remote_user [\$time_local] "\$request" '
'\$status \$body_bytes_sent "\$http_referer" '
'"\$http_user_agent" \$http_x_forwarded_for';
定義本虛擬主機(jī)的訪問日志
access_log /var/log/nginx/ha97access.log access;
對 "/" 啟用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服務(wù)器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置指孤,可選。
proxy_set_header Host $host;
client_max_body_size 10m; #允許客戶端請求的最大單文件字節(jié)數(shù)
client_body_buffer_size 128k; #緩沖區(qū)代理緩沖用戶端請求的最大字節(jié)數(shù)贬堵,
proxy_connect_timeout 90; #nginx跟后端服務(wù)器連接超時時間(代理連接超時)
proxy_send_timeout 90; #后端服務(wù)器數(shù)據(jù)回傳時間(代理發(fā)送超時)
proxy_read_timeout 90; #連接成功后恃轩,后端服務(wù)器響應(yīng)時間(代理接收超時)
proxy_buffer_size 4k; #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小
proxy_buffers 4 32k; #proxy_buffers緩沖區(qū),網(wǎng)頁平均在32k以下的設(shè)置
proxy_busy_buffers_size 64k; #高負(fù)荷下緩沖大欣枳觥(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#設(shè)定緩存文件夾大小叉跛,大于這個值,將從upstream服務(wù)器傳
}
設(shè)定查看Nginx狀態(tài)的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
#htpasswd文件的內(nèi)容可以用apache提供的htpasswd工具來產(chǎn)生蒸殿。
}
本地動靜分離反向代理配置
所有jsp的頁面均交由tomcat或resin處理
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
所有靜態(tài)文件由nginx直接讀取不經(jīng)過tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{ expires 15d; }
location ~ .*.(js|css)?$
{ expires 1h; }
}
nginx 在thinkphp 的url 重寫
在/usr/local/nginx/conf/vhost/你的域名配置文件 中添加
location / {
if (!-e $request_filename) {
rewrite ^/(.*)/(.*)/(.*)/*$ /index.php?m=$1&c=$2&a=$3 last; # thinkphp 的配置文件中 'URL_MODEL' => 1 PATHINFO模式
#或者 rewrite ^(.*)$ /index.php?s=$1 last; # thinkphp 的配置文件中 'URL_MODEL' =>3 兼容模式
#或者 rewrite /(.*)$ /index.php/$1 last; # thinkphp 的配置文件中 'URL_MODEL' => 2 REWRITE模式
break;
}
}
路徑 pathinfo 模式[ thinkphp ] 添加
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
重寫 url +省略index.php
location / {
try_files $uri /index.php?$uri;
}
nginx -s reload 或者 /usr/local/nginx/sbin/nginx -s reload 重新加載Nginx配置文件
文章中的tp是 thinkphp 3.2.3 筷厘,5.0 的未測試