法規則: location [=|~|~*|^~] /uri/ { … }
=開頭表示精確匹配
^~ 開頭表示uri以某個常規字符串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規則^~ /static/ /aa匹配到(注意是空格)。
~ 開頭表示區分大小寫的正則匹配
~* 開頭表示不區分大小寫的正則匹配
!~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配 的正則
/ 通用匹配,任何請求都會匹配到。
多個location配置的情況下匹配順序為(參考資料而來,還未實際驗證,試試就知道了,不必拘泥,僅供參考):
首先匹配=,其次匹配^~, 其次是按文件中順序的正則匹配,最后是交給 / 通用匹配。當有匹配成功時候,停止匹配,按當前匹配規則處理請求。
例子,有如下匹配規則:
location=/ { #規則A } location=/login { #規則B } location ^~ /static/ { #規則C } location ~ \.(gif|jpg|png|js|css)$ { #規則D } location ~* \.png$ { #規則E } location !~ \.xhtml$ { #規則F } location !~* \.xhtml$ { #規則G } location / { #規則H }
那么產生的效果如下:
訪問根目錄/, 比如http://localhost/ 將匹配規則A
訪問 http://localhost/login 將匹配規則B,http://localhost/register 則匹配規則H
訪問 http://localhost/static/a.html 將匹配規則C
訪問 http://localhost/a.gif, http://localhost/b.jpg 將匹配規則D和規則E,但是規則D順序優先,規則E不起作用,而 http://localhost/static/c.png 則優先匹配到 規則C
訪問 http://localhost/a.PNG 則匹配規則E, 而不會匹配規則D,因為規則E不區分大小寫。
訪問 http://localhost/a.xhtml 不會匹配規則F和規則G,http://localhost/a.XHTML不會匹配規則G,因為不區分大小寫。規則F,規則G屬于排除法,符合匹配規則但是不會匹配到,所以想想看實際應用中哪里會用到。
訪問 http://localhost/category/id/1111 則最終匹配到規則H,因為以上規則都不匹配,這個時候應該是nginx轉發請求給后端應用服務器,比如FastCGI(php),tomcat(jsp),nginx作為方向代理服務器存在。
所以實際使用中,通常至少有三個匹配規則定義,如下:
#直接匹配網站根,通過域名訪問網站首頁比較頻繁,使用這個會加速處理,官網如是說。 #這里是直接轉發給后端應用服務器了,也可以是一個靜態首頁 # 第一個必選規則 location=/ { proxy_pass http://tomcat:8080/index } # 第二個必選規則是處理靜態文件請求,這是nginx作為http服務器的強項 # 有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用 location ^~ /static/ { root /webroot/static/; } location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; } #第三個規則就是通用規則,用來轉發動態請求到后端應用服務器 #非靜態文件請求就默認是動態請求,自己根據實際把握 #畢竟目前的一些框架的流行,帶.php,.jsp后綴的情況很少了 location / { proxy_pass http://tomcat:8080/ }
以下部分直接copy過來的,有點亂,可以作為參考
三、ReWrite語法
last – 基本上都用這個Flag。
break – 中止Rewirte,不在繼續匹配
redirect – 返回臨時重定向的HTTP狀態302
permanent – 返回永久重定向的HTTP狀態301
注:last和break最大的不同在于
- break是終止當前location的rewrite檢測,而且不再進行location匹配 - last是終止當前location的rewrite檢測,但會繼續重試location匹配并處理區塊中的rewrite規則
1、下面是可以用來判斷的表達式:
-f和!-f用來判斷是否存在文件
-d和!-d用來判斷是否存在目錄
-e和!-e用來判斷是否存在文件或目錄
-x和!-x用來判斷文件是否可執行
2、下面是可以用作判斷的全局變量
$args #這個變量等于請求行中的參數。
$content_length #請求頭中的Content-length字段。
$content_type #請求頭中的Content-Type字段。
$document_root #當前請求在root指令中指定的值。
$host #請求主機頭字段,否則為服務器名稱。
$http_user_agent #客戶端agent信息
$http_cookie #客戶端cookie信息
$limit_rate #這個變量可以限制連接速率。
$request_body_file #客戶端請求主體信息的臨時文件名。
$request_method #客戶端請求的動作,通常為GET或POST。
$remote_addr #客戶端的IP地址。
$remote_port #客戶端的端口。
$remote_user #已經經過Auth Basic Module驗證的用戶名。
$request_filename #當前請求的文件路徑,由root或alias指令與URI請求生成。
$query_string #與$args相同。
$scheme #HTTP方法(如http,https)。
$server_protocol #請求使用的協議,通常是HTTP/1.0或HTTP/1.1。
$server_addr #服務器地址,在完成一次系統調用后可以確定這個值。
$server_name #服務器名稱。
$server_port #請求到達服務器的端口號。
$request_uri #包含請求參數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。
$uri #不帶請求參數的當前URI,$uri不包含主機名,如”/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語法
多目錄轉成參數
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;
例如下面設定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設置過期時間;
這里為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. }
設定某個文件的過期時間;這里為600秒,并不記錄訪問日志
1. location ^~ /html/scripts/loadhead_1.js {
2. access_log off;
3. root /opt/lampp/htdocs/web;
4. expires 600;
5. break;
6. }
文件反盜鏈并設置過期時間
這里的return 412 為自定義的http狀態碼,默認為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訪問網站,并加上密碼
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;
將多級目錄下的文件轉成一個文件,增強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真實地址是/area /shanghia/list_1.html會變成/list_1.html,導至無法訪問。
那我加上自動跳轉也是不行咯
(-d $request_filename)它有個條件是必需為真實目錄,而我的rewrite不是的,所以沒有效果
1. if (-d $request_filename){
2. rewrite ^/(.*)([^/])$ http://$host// permanent;
3. }
知道原因后就好辦了,讓我手動跳轉吧
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. }
域名跳轉
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
操作系統版本: CentOS 7.9.2207 Mininal 無更新、無升級內核
無系統更新
無內核升級
關閉 SELinux
配置 NTP 時間同步
安裝 Open VM Tools
美化 CLI
# 虛擬目錄:也叫別名目錄,將任意位置的網站發布到站點根目錄下,用戶通過子目錄方式訪問
# Nginx 定義了兩種 虛擬目錄,分別為 絕對別名 和 相對別名
# 絕對別名目錄:網站數據目錄可以在任意路徑下并發布到默認站點的根目錄下,用戶通過子目錄方式訪問
# 相對別名目錄:網站數據目錄在默認站點根目錄下的多層子目錄下,并發布到默認站點的根目錄下,用戶通過子目錄方式訪問,一般不推薦使用這種方式
# 默認網站 數據目錄
/data/www/
# 創建兩個 網站數據目錄
AAA 站點 /var/www/aaa
BBB 站點 /var/www/bbb
# 設定 網站
AAA站點 /var/www/aaa 訪問路徑為 http://{URL}/a_site
BBB站點 /var/www/bbb 訪問路徑為 http://{URL}/b_site
# 創建 AAA 及 BBB 虛擬目錄
mkdir -p /var/www/aaa && mkdir -p /var/www/bbb
# 創建 虛擬目錄 AAA 主頁文件
echo "Welcom To FourLeaf Studio by A Site <br> Web Data /var/www/aaa" > /var/www/aaa/index.html
# 創建 虛擬目錄 BBB 主頁文件
echo "Welcom To FourLeaf Studio by B Site <br> Web Data /var/www/bbb" > /var/www/bbb/index.html
# 修改 Nginx 默認配置文件
nano /etc/nginx/conf.d/default.conf
# {
# 在 第 10 行,默認網站 配置之后,增加兩段內容
# 絕對別名 虛擬目錄 AAA
location /a_site {
alias /var/www/aaa/;
}
# 絕對別名 虛擬目錄 BBB
location /b_site {
alias /var/www/bbb/;
}
# }
# 重新啟動 Nginx 服務
systemctl restart nginx.service
# 絕對別名 虛擬目錄 訪問地址
http://{URL}/a_site
http://{URL}/b_site
AAA 站點 /var/www/aaa 對應 A Site 地址 虛擬目錄
BBB 站點 /var/www/bbb 對應 B Site 地址 虛擬目錄
# 默認網站 數據目錄
/data/www/
# 創建兩個 網站數據目錄
CCC 站點 /data/www/test/ccc
DDD 站點 /data/www/test/ddd
# 設定 網站
CCC 站點 /data/www/test/ccc 實際訪問路徑為 http://{URL}/test/cc
CCC 站點 /data/www/test/ccc 虛擬訪問路徑為 http://{URL}/ccc
DDD 站點 /data/www/test/ddd 實際訪問路徑為 http://{URL}/test/ddd
DDD 站點 /data/www/test/ddd 虛擬訪問路徑為 http://{URL}/ddd
# 創建 CCC 及 DDD 虛擬目錄
mkdir -p /data/www/test/ccc && mkdir -p /data/www/test/ddd
# 創建 虛擬目錄 CCC 主頁文件
echo "Welcom To FourLeaf Studio by A Site <br> Web Data /data/www/test/ccc" > /data/www/test/ccc/index.html
# 創建 虛擬目錄 DDD 主頁文件
echo "Welcom To FourLeaf Studio by B Site <br> Web Data /data/www/test/ddd" > /data/www/test/ddd/index.html
# 相對別名,一般用于網站根目錄,進行路徑的虛擬,一般不推薦使用
nano /etc/nginx/conf.d/default.conf
# 相對別名,地址設置,僅需要設置到絕對路徑的上一級路徑,并標識完整目錄名稱,不需要定義到完整路徑
# {
# 在 第 10 行,默認網站 配置之后,增加兩段內容
# 相對別名 虛擬目錄 CCC
location /ccc {
root /data/www/test/;
}
# 相對別名 虛擬目錄 DDD
location /ddd {
root /data/www/test/;
}
# }
奇葩的設定方式
# 重新啟動 Nginx 服務
systemctl restart nginx.service
# 實際訪問路徑 地址
http://{Server_IP}/test/ccc
http://{Server_IP}/test/ddd
# 虛擬訪問路徑 地址
http://{Server_IP}/ccc
http://{Server_IP}/ddd
CCC Site 實際訪問路徑及虛擬目錄訪問路徑
DDD Site 實際訪問路徑及虛擬目錄訪問路徑
、概述
今天來詳解一下Nginx的配置文件,以及給出一些配置建議,希望能對大家有所幫助。
2、nginx.conf
1)配置文件位置
nginx 安裝目錄的 conf 文件夾下,例如:/usr/local/nginx/conf/nginx.conf 。
也可以將配置文件放置在任意位置,在啟動Nginx時指定配置文件的位置,例如:./nginx -c /home/nginx.conf
2)worker_processes
設置 worker 的數量,Nginx的進程模型采用的是master、worker模式,一個master負責協調,多個worker負責與客戶端交互。
此處設置為 auto 即可。
3)events
設置使用的模型和每個 worker 的連接數。
Linux操作系統中模型建議使用 epoll。
worker 的連接數通常設置為 10240 即可,當然如果硬件資源非常好,也可以適當加大。
4)include
包含另一個文件的內容,將另一個文件的內容放在標記處。
多個文件可以寫多個 include,也可以使用通配符匹配多個文件。
5)sendfile 和 tcp_nopush
sendfile: 設置文件高效傳輸是否開啟,默認開啟。
tcp_nopush:必須是 sendfile 值為 on 時才有效,當 tcp_nopush 設置為 on 代表當數據包累計到一定大小時再發送,有助于提升文件傳輸效率。
建議都設置為 on。
6)keepalive_timeout
客戶端連接服務器的超時時間,在連接斷開前,客戶端再次與服務器進行交互,可復用此連接,不需要重新建立一個連接,減少了資源的開銷。
設置為 0,則表示交互完立即斷開連接。此值保持默認即可。
7)gzip
設置為 on,代表會先將數據壓縮再進行傳輸,這樣做會增加傳輸的效率,節省帶寬,但會影響服務器CPU的性能。
開啟此配置,還需要配置一些額外的屬性。
此處可以權衡是節省帶寬還是提高CPU性能,建議開啟,根據實際情況配置。
gzip on;
gzip_min_length 512; # 限制最小壓縮,單位字節,小于該值則不會壓縮
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塊就是一個虛擬的服務。
在server塊中可以指定虛擬服務的 端口、服務名、路由規則等信息。
server可以有多個。
一個server下,location也可以有多個。
server {
listen 90; # 端口
server_name localhost; # 服務名,可以是IP地址或者域名,當端口相同時,會根據服務名選擇走哪個路由規則
location / { # 根路徑路由規則
root html; # 對應nginx安裝目標下的html文件夾,也可以設置為絕對路徑,例如:root /home/html;
index hello.html; # 指定默認首頁為 hello.html
}
location /hello { root /home/hello; # index 省略,代表沒有默認頁 }
error_page 500 502 503 504 /50x.html; # 指定這些狀態碼跳轉的錯誤頁
location=/50x.html {
root html;
}
}
9)location的匹配規則詳解
server塊中包含了location塊,location塊在一個server下可以有多個,主要是配置請求的路由規則。
nginx根據請求的資源路徑,與location塊進行匹配,然后根據location的配置對路由進行轉發。
location支撐多種匹配規則,下面就具體說一說。
精確匹配
location / { # 根路徑路由規則
root html; # 對應nginx安裝目標下的html文件夾,也可以設置為絕對路徑,例如:root /home/html;
index hello.html; # 指定默認首頁為 hello.html
}
location /hello {
root /home/hello;
# index 省略,代表沒有默認頁
}
正則表達式匹配
location ~* \.(GIF|PNG|jpg|bmp|jpeg) { # *代表不區分大小寫
root /home/img;
}
匹配以某個路徑開頭的請求
location ^~ /server/page/ {
root /home/page;
}
3、綜述
今天對Nginx配置做了詳細講解,一些Nginx的高級應用,會在后面單獨介紹。希望大家多多溝通交流,共同成長。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。