Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
法規(guī)則: location [=|~|~*|^~] /uri/ { … }
=開頭表示精確匹配
^~ 開頭表示uri以某個常規(guī)字符串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規(guī)則^~ /static/ /aa匹配到(注意是空格)。
~ 開頭表示區(qū)分大小寫的正則匹配
~* 開頭表示不區(qū)分大小寫的正則匹配
!~和!~*分別為區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配 的正則
/ 通用匹配,任何請求都會匹配到。
多個location配置的情況下匹配順序?yàn)椋▍⒖假Y料而來,還未實(shí)際驗(yàn)證,試試就知道了,不必拘泥,僅供參考):
首先匹配=,其次匹配^~, 其次是按文件中順序的正則匹配,最后是交給 / 通用匹配。當(dāng)有匹配成功時候,停止匹配,按當(dāng)前匹配規(guī)則處理請求。
例子,有如下匹配規(guī)則:
location=/ { #規(guī)則A } location=/login { #規(guī)則B } location ^~ /static/ { #規(guī)則C } location ~ \.(gif|jpg|png|js|css)$ { #規(guī)則D } location ~* \.png$ { #規(guī)則E } location !~ \.xhtml$ { #規(guī)則F } location !~* \.xhtml$ { #規(guī)則G } location / { #規(guī)則H }
那么產(chǎn)生的效果如下:
訪問根目錄/, 比如http://localhost/ 將匹配規(guī)則A
訪問 http://localhost/login 將匹配規(guī)則B,http://localhost/register 則匹配規(guī)則H
訪問 http://localhost/static/a.html 將匹配規(guī)則C
訪問 http://localhost/a.gif, http://localhost/b.jpg 將匹配規(guī)則D和規(guī)則E,但是規(guī)則D順序優(yōu)先,規(guī)則E不起作用,而 http://localhost/static/c.png 則優(yōu)先匹配到 規(guī)則C
訪問 http://localhost/a.PNG 則匹配規(guī)則E, 而不會匹配規(guī)則D,因?yàn)橐?guī)則E不區(qū)分大小寫。
訪問 http://localhost/a.xhtml 不會匹配規(guī)則F和規(guī)則G,http://localhost/a.XHTML不會匹配規(guī)則G,因?yàn)椴粎^(qū)分大小寫。規(guī)則F,規(guī)則G屬于排除法,符合匹配規(guī)則但是不會匹配到,所以想想看實(shí)際應(yīng)用中哪里會用到。
訪問 http://localhost/category/id/1111 則最終匹配到規(guī)則H,因?yàn)橐陨弦?guī)則都不匹配,這個時候應(yīng)該是nginx轉(zhuǎn)發(fā)請求給后端應(yīng)用服務(wù)器,比如FastCGI(php),tomcat(jsp),nginx作為方向代理服務(wù)器存在。
所以實(shí)際使用中,通常至少有三個匹配規(guī)則定義,如下:
#直接匹配網(wǎng)站根,通過域名訪問網(wǎng)站首頁比較頻繁,使用這個會加速處理,官網(wǎng)如是說。 #這里是直接轉(zhuǎn)發(fā)給后端應(yīng)用服務(wù)器了,也可以是一個靜態(tài)首頁 # 第一個必選規(guī)則 location=/ { proxy_pass http://tomcat:8080/index } # 第二個必選規(guī)則是處理靜態(tài)文件請求,這是nginx作為http服務(wù)器的強(qiáng)項(xiàng) # 有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用 location ^~ /static/ { root /webroot/static/; } location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; } #第三個規(guī)則就是通用規(guī)則,用來轉(zhuǎn)發(fā)動態(tài)請求到后端應(yīng)用服務(wù)器 #非靜態(tài)文件請求就默認(rèn)是動態(tài)請求,自己根據(jù)實(shí)際把握 #畢竟目前的一些框架的流行,帶.php,.jsp后綴的情況很少了 location / { proxy_pass http://tomcat:8080/ }
以下部分直接copy過來的,有點(diǎn)亂,可以作為參考
三、ReWrite語法
last – 基本上都用這個Flag。
break – 中止Rewirte,不在繼續(xù)匹配
redirect – 返回臨時重定向的HTTP狀態(tài)302
permanent – 返回永久重定向的HTTP狀態(tài)301
注:last和break最大的不同在于
- break是終止當(dāng)前l(fā)ocation的rewrite檢測,而且不再進(jìn)行l(wèi)ocation匹配 - last是終止當(dāng)前l(fā)ocation的rewrite檢測,但會繼續(xù)重試location匹配并處理區(qū)塊中的rewrite規(guī)則
1、下面是可以用來判斷的表達(dá)式:
-f和!-f用來判斷是否存在文件
-d和!-d用來判斷是否存在目錄
-e和!-e用來判斷是否存在文件或目錄
-x和!-x用來判斷文件是否可執(zhí)行
2、下面是可以用作判斷的全局變量
$args #這個變量等于請求行中的參數(shù)。
$content_length #請求頭中的Content-length字段。
$content_type #請求頭中的Content-Type字段。
$document_root #當(dāng)前請求在root指令中指定的值。
$host #請求主機(jī)頭字段,否則為服務(wù)器名稱。
$http_user_agent #客戶端agent信息
$http_cookie #客戶端cookie信息
$limit_rate #這個變量可以限制連接速率。
$request_body_file #客戶端請求主體信息的臨時文件名。
$request_method #客戶端請求的動作,通常為GET或POST。
$remote_addr #客戶端的IP地址。
$remote_port #客戶端的端口。
$remote_user #已經(jīng)經(jīng)過Auth Basic Module驗(yàn)證的用戶名。
$request_filename #當(dāng)前請求的文件路徑,由root或alias指令與URI請求生成。
$query_string #與$args相同。
$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ù)器的端口號。
$request_uri #包含請求參數(shù)的原始URI,不包含主機(jī)名,如:”/foo/bar.php?arg=baz”。
$uri #不帶請求參數(shù)的當(dāng)前URI,$uri不包含主機(jī)名,如”/foo/bar.html”。
$document_uri #與$uri相同。
例:http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:D:\nginx/html
$request_filename:D:\nginx/html/test1/test2/test.php
四、Redirect語法
多目錄轉(zhuǎn)成參數(shù)
abc.domian.com/sort/2=> abc.domian.com/index.php?act=sort&name=abc&id=2
1. if ($host ~* (.*)\.domain\.com) {
2. set $sub_name ;
3. rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=last;
4. }
目錄對換
/123456/xxxx -> /xxxx?id=123456
1. rewrite ^/(\d+)/(.+)/ /?id=last;
例如下面設(shè)定nginx在用戶使用ie的使用重定向到/nginx-ie目錄下:
1. if ($http_user_agent ~ MSIE) {
2. rewrite ^(.*)$ /nginx-ie/ break;
3. }
目錄自動加“/”
1. if (-d $request_filename){
2. rewrite ^/(.*)([^/])$ http://$host// permanent;
3. }
禁止htaccess
1. location ~/\.ht {
2. deny all;
3. }
禁止多個目錄
1. location ~ ^/(cron|templates)/ {
2. deny all;
3. break;
4. }
禁止以/data開頭的文件
可以禁止/data/下多級目錄下.log.txt等請求;
1. location ~ ^/data {
2. deny all;
3. }
禁止單個目錄
不能禁止.log.txt能請求
1. location /searchword/cron/ {
2. deny all;
3. }
禁止單個文件
1. location ~ /data/sql/data.sql {
2. deny all;
3. }
給favicon.ico和robots.txt設(shè)置過期時間;
這里為favicon.ico為99 天,robots.txt為7天并不記錄404錯誤日志
1. location ~(favicon.ico) {
2. log_not_found off;
3. expires 99d;
4. break;
5. }
6.
7. location ~(robots.txt) {
8. log_not_found off;
9. expires 7d;
10. break;
11. }
設(shè)定某個文件的過期時間;這里為600秒,并不記錄訪問日志
1. location ^~ /html/scripts/loadhead_1.js {
2. access_log off;
3. root /opt/lampp/htdocs/web;
4. expires 600;
5. break;
6. }
文件反盜鏈并設(shè)置過期時間
這里的return 412 為自定義的http狀態(tài)碼,默認(rèn)為403,方便找出正確的盜鏈的請求
“rewrite ^/ http://leech.c1gstudio.com/leech.gif;”顯示一張防盜鏈圖片
“access_log off;”不記錄訪問日志,減輕壓力
“expires 3d”所有文件3天的瀏覽器緩存
1. location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
2. valid_referers none blocked *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194;
3. if ($invalid_referer) {
4. rewrite ^/ http://leech.c1gstudio.com/leech.gif;
5. return 412;
6. break;
7. }
8. access_log off;
9. root /opt/lampp/htdocs/web;
10. expires 3d;
11. break;
12. }
只充許固定ip訪問網(wǎng)站,并加上密碼
1. root /opt/htdocs/www;
2. allow 208.97.167.194;
3. allow 222.33.1.2;
4. allow 231.152.49.4;
5. deny all;
6. auth_basic "C1G_ADMIN";
7. auth_basic_user_file htpasswd;
將多級目錄下的文件轉(zhuǎn)成一個文件,增強(qiáng)seo效果
/job-123-456-789.html 指向/job/123/456/789.html
1. rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job///jobshow_.html last;
將根目錄下某個文件夾指向2級目錄
如/shanghaijob/ 指向 /area/shanghai/
如果你將last改成permanent,那么瀏覽器地址欄顯是 /location/shanghai/
1. rewrite ^/([0-9a-z]+)job/(.*)$ /area// last;
上面例子有個問題是訪問/shanghai 時將不會匹配
1. rewrite ^/([0-9a-z]+)job$ /area// last;
2. rewrite ^/([0-9a-z]+)job/(.*)$ /area// last;
這樣/shanghai 也可以訪問了,但頁面中的相對鏈接無法使用,
如./list_1.html真實(shí)地址是/area /shanghia/list_1.html會變成/list_1.html,導(dǎo)至無法訪問。
那我加上自動跳轉(zhuǎn)也是不行咯
(-d $request_filename)它有個條件是必需為真實(shí)目錄,而我的rewrite不是的,所以沒有效果
1. if (-d $request_filename){
2. rewrite ^/(.*)([^/])$ http://$host// permanent;
3. }
知道原因后就好辦了,讓我手動跳轉(zhuǎn)吧
1. rewrite ^/([0-9a-z]+)job$ /job/ permanent;
2. rewrite ^/([0-9a-z]+)job/(.*)$ /area// last;
文件和目錄不存在的時候重定向:
1. if (!-e $request_filename) {
2. proxy_pass http://127.0.0.1;
3. }
域名跳轉(zhuǎn)
1. server
2. {
3. listen 80;
4. server_name jump.c1gstudio.com;
5. index index.html index.htm index.php;
6. root /opt/lampp/htdocs/www;
7. rewrite ^/ http://www.c1gstudio.com/;
8. access_log off;
9. }
底層: Windows 11 x64
虛擬化層:VMWare Workstation 17.0.2
虛擬化兼容性:ESXi 6.7
虛擬硬件:
CPU: 4 Core
RAM: 16 GB
HDD: 128 GB SCSI
NetWork: NAT
操作系統(tǒng)版本: CentOS 7.9.2207 Mininal 無更新、無升級內(nèi)核
無系統(tǒng)更新
無內(nèi)核升級
關(guān)閉 SELinux
配置 NTP 時間同步
安裝 Open VM Tools
美化 CLI
# 虛擬目錄:也叫別名目錄,將任意位置的網(wǎng)站發(fā)布到站點(diǎn)根目錄下,用戶通過子目錄方式訪問
# Nginx 定義了兩種 虛擬目錄,分別為 絕對別名 和 相對別名
# 絕對別名目錄:網(wǎng)站數(shù)據(jù)目錄可以在任意路徑下并發(fā)布到默認(rèn)站點(diǎn)的根目錄下,用戶通過子目錄方式訪問
# 相對別名目錄:網(wǎng)站數(shù)據(jù)目錄在默認(rèn)站點(diǎn)根目錄下的多層子目錄下,并發(fā)布到默認(rèn)站點(diǎn)的根目錄下,用戶通過子目錄方式訪問,一般不推薦使用這種方式
# 默認(rèn)網(wǎng)站 數(shù)據(jù)目錄
/data/www/
# 創(chuàng)建兩個 網(wǎng)站數(shù)據(jù)目錄
AAA 站點(diǎn) /var/www/aaa
BBB 站點(diǎn) /var/www/bbb
# 設(shè)定 網(wǎng)站
AAA站點(diǎn) /var/www/aaa 訪問路徑為 http://{URL}/a_site
BBB站點(diǎn) /var/www/bbb 訪問路徑為 http://{URL}/b_site
# 創(chuàng)建 AAA 及 BBB 虛擬目錄
mkdir -p /var/www/aaa && mkdir -p /var/www/bbb
# 創(chuàng)建 虛擬目錄 AAA 主頁文件
echo "Welcom To FourLeaf Studio by A Site <br> Web Data /var/www/aaa" > /var/www/aaa/index.html
# 創(chuàng)建 虛擬目錄 BBB 主頁文件
echo "Welcom To FourLeaf Studio by B Site <br> Web Data /var/www/bbb" > /var/www/bbb/index.html
# 修改 Nginx 默認(rèn)配置文件
nano /etc/nginx/conf.d/default.conf
# {
# 在 第 10 行,默認(rèn)網(wǎng)站 配置之后,增加兩段內(nèi)容
# 絕對別名 虛擬目錄 AAA
location /a_site {
alias /var/www/aaa/;
}
# 絕對別名 虛擬目錄 BBB
location /b_site {
alias /var/www/bbb/;
}
# }
# 重新啟動 Nginx 服務(wù)
systemctl restart nginx.service
# 絕對別名 虛擬目錄 訪問地址
http://{URL}/a_site
http://{URL}/b_site
AAA 站點(diǎn) /var/www/aaa 對應(yīng) A Site 地址 虛擬目錄
BBB 站點(diǎn) /var/www/bbb 對應(yīng) B Site 地址 虛擬目錄
# 默認(rèn)網(wǎng)站 數(shù)據(jù)目錄
/data/www/
# 創(chuàng)建兩個 網(wǎng)站數(shù)據(jù)目錄
CCC 站點(diǎn) /data/www/test/ccc
DDD 站點(diǎn) /data/www/test/ddd
# 設(shè)定 網(wǎng)站
CCC 站點(diǎn) /data/www/test/ccc 實(shí)際訪問路徑為 http://{URL}/test/cc
CCC 站點(diǎn) /data/www/test/ccc 虛擬訪問路徑為 http://{URL}/ccc
DDD 站點(diǎn) /data/www/test/ddd 實(shí)際訪問路徑為 http://{URL}/test/ddd
DDD 站點(diǎn) /data/www/test/ddd 虛擬訪問路徑為 http://{URL}/ddd
# 創(chuàng)建 CCC 及 DDD 虛擬目錄
mkdir -p /data/www/test/ccc && mkdir -p /data/www/test/ddd
# 創(chuàng)建 虛擬目錄 CCC 主頁文件
echo "Welcom To FourLeaf Studio by A Site <br> Web Data /data/www/test/ccc" > /data/www/test/ccc/index.html
# 創(chuàng)建 虛擬目錄 DDD 主頁文件
echo "Welcom To FourLeaf Studio by B Site <br> Web Data /data/www/test/ddd" > /data/www/test/ddd/index.html
# 相對別名,一般用于網(wǎng)站根目錄,進(jìn)行路徑的虛擬,一般不推薦使用
nano /etc/nginx/conf.d/default.conf
# 相對別名,地址設(shè)置,僅需要設(shè)置到絕對路徑的上一級路徑,并標(biāo)識完整目錄名稱,不需要定義到完整路徑
# {
# 在 第 10 行,默認(rèn)網(wǎng)站 配置之后,增加兩段內(nèi)容
# 相對別名 虛擬目錄 CCC
location /ccc {
root /data/www/test/;
}
# 相對別名 虛擬目錄 DDD
location /ddd {
root /data/www/test/;
}
# }
奇葩的設(shè)定方式
# 重新啟動 Nginx 服務(wù)
systemctl restart nginx.service
# 實(shí)際訪問路徑 地址
http://{Server_IP}/test/ccc
http://{Server_IP}/test/ddd
# 虛擬訪問路徑 地址
http://{Server_IP}/ccc
http://{Server_IP}/ddd
CCC Site 實(shí)際訪問路徑及虛擬目錄訪問路徑
DDD Site 實(shí)際訪問路徑及虛擬目錄訪問路徑
、概述
今天來詳解一下Nginx的配置文件,以及給出一些配置建議,希望能對大家有所幫助。
2、nginx.conf
1)配置文件位置
nginx 安裝目錄的 conf 文件夾下,例如:/usr/local/nginx/conf/nginx.conf 。
也可以將配置文件放置在任意位置,在啟動Nginx時指定配置文件的位置,例如:./nginx -c /home/nginx.conf
2)worker_processes
設(shè)置 worker 的數(shù)量,Nginx的進(jìn)程模型采用的是master、worker模式,一個master負(fù)責(zé)協(xié)調(diào),多個worker負(fù)責(zé)與客戶端交互。
此處設(shè)置為 auto 即可。
3)events
設(shè)置使用的模型和每個 worker 的連接數(shù)。
Linux操作系統(tǒng)中模型建議使用 epoll。
worker 的連接數(shù)通常設(shè)置為 10240 即可,當(dāng)然如果硬件資源非常好,也可以適當(dāng)加大。
4)include
包含另一個文件的內(nèi)容,將另一個文件的內(nèi)容放在標(biāo)記處。
多個文件可以寫多個 include,也可以使用通配符匹配多個文件。
5)sendfile 和 tcp_nopush
sendfile: 設(shè)置文件高效傳輸是否開啟,默認(rèn)開啟。
tcp_nopush:必須是 sendfile 值為 on 時才有效,當(dāng) tcp_nopush 設(shè)置為 on 代表當(dāng)數(shù)據(jù)包累計到一定大小時再發(fā)送,有助于提升文件傳輸效率。
建議都設(shè)置為 on。
6)keepalive_timeout
客戶端連接服務(wù)器的超時時間,在連接斷開前,客戶端再次與服務(wù)器進(jìn)行交互,可復(fù)用此連接,不需要重新建立一個連接,減少了資源的開銷。
設(shè)置為 0,則表示交互完立即斷開連接。此值保持默認(rèn)即可。
7)gzip
設(shè)置為 on,代表會先將數(shù)據(jù)壓縮再進(jìn)行傳輸,這樣做會增加傳輸?shù)男剩?jié)省帶寬,但會影響服務(wù)器CPU的性能。
開啟此配置,還需要配置一些額外的屬性。
此處可以權(quán)衡是節(jié)省帶寬還是提高CPU性能,建議開啟,根據(jù)實(shí)際情況配置。
gzip on;
gzip_min_length 512; # 限制最小壓縮,單位字節(jié),小于該值則不會壓縮
gzip_comp_level 5; # 壓縮的級別,值為1到9,級別越高壓縮的比例越大,cpu消耗越多
gzip_types text/plain application/javascript text/css image/jpeg image/gif image/png application/json; # 需要壓縮的文件類型
8)server
一個server塊就是一個虛擬的服務(wù)。
在server塊中可以指定虛擬服務(wù)的 端口、服務(wù)名、路由規(guī)則等信息。
server可以有多個。
一個server下,location也可以有多個。
server {
listen 90; # 端口
server_name localhost; # 服務(wù)名,可以是IP地址或者域名,當(dāng)端口相同時,會根據(jù)服務(wù)名選擇走哪個路由規(guī)則
location / { # 根路徑路由規(guī)則
root html; # 對應(yīng)nginx安裝目標(biāo)下的html文件夾,也可以設(shè)置為絕對路徑,例如:root /home/html;
index hello.html; # 指定默認(rèn)首頁為 hello.html
}
location /hello { root /home/hello; # index 省略,代表沒有默認(rèn)頁 }
error_page 500 502 503 504 /50x.html; # 指定這些狀態(tài)碼跳轉(zhuǎn)的錯誤頁
location=/50x.html {
root html;
}
}
9)location的匹配規(guī)則詳解
server塊中包含了location塊,location塊在一個server下可以有多個,主要是配置請求的路由規(guī)則。
nginx根據(jù)請求的資源路徑,與location塊進(jìn)行匹配,然后根據(jù)location的配置對路由進(jìn)行轉(zhuǎn)發(fā)。
location支撐多種匹配規(guī)則,下面就具體說一說。
精確匹配
location / { # 根路徑路由規(guī)則
root html; # 對應(yīng)nginx安裝目標(biāo)下的html文件夾,也可以設(shè)置為絕對路徑,例如:root /home/html;
index hello.html; # 指定默認(rèn)首頁為 hello.html
}
location /hello {
root /home/hello;
# index 省略,代表沒有默認(rèn)頁
}
正則表達(dá)式匹配
location ~* \.(GIF|PNG|jpg|bmp|jpeg) { # *代表不區(qū)分大小寫
root /home/img;
}
匹配以某個路徑開頭的請求
location ^~ /server/page/ {
root /home/page;
}
3、綜述
今天對Nginx配置做了詳細(xì)講解,一些Nginx的高級應(yīng)用,會在后面單獨(dú)介紹。希望大家多多溝通交流,共同成長。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。