淺析Nginx常用配置:如何根據user-agent適配PC/移動裝置、如何配置https、如何開啟靜態服務、如何設定圖片防盜鏈、如何配置請求過濾、如何配置靜態檔案的快取時間、如何配置http轉發到https、如何配置泛域名路徑分離及泛域名轉發
一、適配 PC 或移動裝置
根據使用者裝置不同返回不同樣式的站點,以前經常使用的是純前端的自適應佈局,但無論是複雜性和易用性上面還是不如分開編寫的好,比如我們常見的淘寶、京東......這些大型網站就都沒有采用自適應,而是用分開製作的方式,根據使用者請求的user-agent
來判斷是返回 PC 還是 H5 站點。
首先在/usr/share/nginx/html
資料夾下mkdir
分別新建兩個資料夾PC
和mobile
,vim
編輯兩個index.html
隨便寫點內容。
然後和設定二級域名虛擬主機時候一樣,去/etc/nginx/conf.d
資料夾下新建一個配置檔案fe.sherlocked93.club.conf
# /etc/nginx/conf.d/fe.sherlocked93.club.conf
server {
listen 80;
server_name fe.sherlocked93.club;
location / {
root /usr/share/nginx/html/pc;
if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
root /usr/share/nginx/html/mobile;
}
index index.html;
}
}
配置基本沒什麼不一樣的,主要多了一個if
語句,然後使用 $http_user_agent
全域性變數來判斷使用者請求的user-agent
,指向不同的 root 路徑,返回對應站點。
二、配置 HTTPS
具體配置過程網上挺多的了,也可以使用你購買的某某雲,一般都會有免費申請的伺服器證書,安裝直接看所在雲的操作指南即可。
我購買的騰訊雲提供的亞洲誠信機構頒發的免費證書只能一個域名使用,二級域名什麼的需要另外申請,但是申請審批比較快,一般幾分鐘就能成功,然後下載證書的壓縮檔案,裡面有個 nginx 資料夾,把xxx.crt
和xxx.key
檔案拷貝到伺服器目錄,再配置下:
server {
listen 443 ssl http2 default_server; # SSL 訪問埠號為 443
server_name sherlocked93.club; # 填寫繫結證書的域名
ssl_certificate /etc/nginx/https/1_sherlocked93.club_bundle.crt; # 證書檔案地址
ssl_certificate_key /etc/nginx/https/2_sherlocked93.club.key; # 私鑰檔案地址
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #請按照以下協議配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
寫完nginx -t -q
校驗一下,沒問題就nginx -s reload
,現在去訪問https://sherlocked93.club/
就能訪問 HTTPS 版的網站了。一般還可以加上幾個增強安全性的命令:
add_header X-Frame-Options DENY; # 減少點選劫持
add_header X-Content-Type-Options nosniff; # 禁止伺服器自動解析資源型別
add_header X-Xss-Protection 1; # 防XSS攻擊
三、常用技巧
1、靜態服務
server {
listen 80;
server_name static.sherlocked93.club;
charset utf-8; # 防止中文檔名亂碼
location /download {
alias /usr/share/nginx/html/static; # 靜態資源目錄
autoindex on; # 開啟靜態資源列目錄
autoindex_exact_size off; # on(預設)顯示檔案的確切大小,單位是byte;off顯示檔案大概大小,單位KB、MB、GB
autoindex_localtime off; # off(預設)時顯示的檔案時間為GMT時間;on顯示的檔案時間為伺服器時間
}
}
2、圖片防盜鏈
server {
listen 80;
server_name *.sherlocked93.club;
# 圖片防盜鏈
location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked 192.168.0.2; # 只允許本機 IP 外鏈引用
if ($invalid_referer){
return 403;
}
}
}
3、請求過濾
# 非指定請求全返回 403
if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
return 403;
}
location / {
# IP訪問限制(只允許IP是 192.168.0.2 機器訪問)
allow 192.168.0.2;
deny all;
root html;
index index.html index.htm;
}
4、配置圖片、字型等靜態檔案快取
由於圖片、字型、音訊、視訊等靜態檔案在打包的時候通常會增加了 hash,所以快取可以設定的長一點,先設定強制快取,再設定協商快取;如果存在沒有 hash 值的靜態檔案,建議不設定強制快取,僅通過協商快取判斷是否需要使用快取。
# 圖片快取時間設定
location ~ .*\.(css|js|jpg|png|gif|swf|woff|woff2|eot|svg|ttf|otf|mp3|m4a|aac|txt)$ {
expires 10d;
}
# 如果不希望快取
expires -1;
5、單頁面專案 history 路由配置
server {
listen 80;
server_name fe.sherlocked93.club;
location / {
root /usr/share/nginx/html/dist; # vue 打包後的資料夾
index index.html index.htm;
try_files $uri $uri/ /index.html @rewrites;
expires -1; # 首頁一般沒有強制快取
add_header Cache-Control no-cache;
}
# 介面轉發,如果需要的話
#location ~ ^/api {
# proxy_pass http://be.sherlocked93.club;
#}
location @rewrites {
rewrite ^(.+)$ /index.html break;
}
}
6、HTTP 請求轉發到 HTTPS
配置完 HTTPS 後,瀏覽器還是可以訪問 HTTP 的地址http://sherlocked93.club/
的,可以做一個 301 跳轉,把對應域名的 HTTP 請求重定向到 HTTPS 上
server {
listen 80;
server_name www.sherlocked93.club;
# 單域名重定向
if ($host = 'www.sherlocked93.club'){
return 301 https://www.sherlocked93.club$request_uri;
}
# 全域性非 https 協議時重定向
if ($scheme != 'https') {
return 301 https://$server_name$request_uri;
}
# 或者全部重定向
return 301 https://$server_name$request_uri;
# 以上配置選擇自己需要的即可,不用全部加
}
7、泛域名路徑分離
這是一個非常實用的技能,經常有時候我們可能需要配置一些二級或者三級域名,希望通過 Nginx 自動指向對應目錄,比如:
test1.doc.sherlocked93.club
自動指向/usr/share/nginx/html/doc/test1
伺服器地址;test2.doc.sherlocked93.club
自動指向/usr/share/nginx/html/doc/test2
伺服器地址;
server {
listen 80;
server_name ~^([\w-]+)\.doc\.sherlocked93\.club$;
root /usr/share/nginx/html/doc/$1;
}
8、泛域名轉發
有時候我們希望把二級或者三級域名連結重寫到我們希望的路徑,讓後端就可以根據路由解析不同的規則:
test1.serv.sherlocked93.club/api?name=a
自動轉發到127.0.0.1:8080/test1/api?name=a
;test2.serv.sherlocked93.club/api?name=a
自動轉發到127.0.0.1:8080/test2/api?name=a
;
server {
listen 80;
server_name ~^([\w-]+)\.serv\.sherlocked93\.club$;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:8080/$1$request_uri;
}
}