Nginx 實用配置技巧,99- 用過的是老司機?
文章列舉了幾個 Nginx 常見的,實用的,有趣的配置,希望看過之後能說一句:學到了!
一個站點配置多個域名
server_name 後跟多個域名即可,多個域名之間用空格分隔。
一個服務配置多個站點
server {
listen 80;
server_name a.ops-coffee.cn;
location / {
root /home/project/pa;
index index.html;
}
}
server {
listen 80;
server_name ops-coffee.cn b.ops-coffee.cn;
location / {
root /home/project/pb;
index index.html;
}
}
server {
listen 80;
server_name c.ops-coffee.cn;
location / {
root /home/project/pc;
index index.html;
}
}
基於 Nginx 虛擬主機配置實現,Nginx 有三種類型的虛擬主機:
-
基於 IP 的虛擬主機: 需要你的服務器上有多個地址,每個站點對應不同的地址,這種方式使用的比較少
-
基於端口的虛擬主機: 每個站點對應不同的端口,訪問的時候使用 ip:port 的方式訪問,可以修改 listen 的端口來使用
-
基於域名的虛擬主機: 使用最廣的方式,上邊例子中就是用了基於域名的虛擬主機,前提條件是你有多個域名分別對應每個站點,server_name 填寫不同的域名即可
nginx 添加賬號密碼驗證
server {
location / {
auth_basic "please input user&passwd";
auth_basic_user_file key/auth.key;
}
}
有很多服務通過 nginx 訪問,但本身沒有提供賬號認證的功能,就可以通過 nginx 提供的 authbase 賬號密碼認證來實現,可以用以下腳本來生成賬號的密碼
# cat pwd.pl
#!/usr/bin/perl
use strict;
my $pw=$ARGV[0] ;
print crypt($pw,$pw)."
";
使用方法:
# perl pwd.pl ops-coffee.cn
opf8BImqCAXww
# echo "admin:opf8BImqCAXww" > key/auth.key
nginx 開啓列目錄
當你想讓 nginx 作爲文件下載服務器存在時,需要開啓 nginx 列目錄
server {
location download {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
autoindex_exact_size: 爲 on(默認)時顯示文件的確切大小,單位是 byte;改爲 off 顯示文件大概大小,單位 KB 或 MB 或 GB
autoindex_localtime: 爲 off(默認)時顯示的文件時間爲 GMT 時間;改爲 on 後,顯示的文件時間爲服務器時間
默認當訪問列出的 txt 等文件時會在瀏覽器上顯示文件的內容,如果你想讓瀏覽器直接下載,加上下邊的配置
if ($request_filename ~* ^.*?.(txt|pdf|jpg|png)$) {
add_header Content-Disposition 'attachment';
}
配置默認站點
server {
listen 80 default;
}
當一個 nginx 服務上創建了多個虛擬主機時默認會從上到下查找,如果匹配不到虛擬主機則會返回第一個虛擬主機的內容,如果你想指定一個默認站點時,可以將這個站點的虛擬主機放在配置文件中第一個虛擬主機的位置,或者在這個站點的虛擬主機上配置 listen default。
不允許通過 IP 訪問
server {
listen 80 default;
server_name _;
return 404;
}
可能有一些未備案的域名或者你不希望的域名將服務器地址指向了你的服務器,這時候就會對你的站點造成一定的影響,需要禁止 IP 或未配置的域名訪問,我們利用上邊所說的 default 規則,將默認流量都轉到 404 去。
上邊這個方法比較粗暴,當然你也可以配置下所有未配置的地址訪問時直接 301 重定向到你的網站去,也能爲你的網站帶來一定的流量。
server {
rewrite ^/(.*)$ https://ops-coffee.cn/$1 permanent;
}
直接返回驗證文件
location = /XDFyle6tNA.txt {
default_type text/plain;
return 200 'd6296a84657eb275c05c31b10924f6ea';
}
很多時候微信等程序都需要我們放一個 txt 的文件到項目裏以驗證項目歸屬,我們可以直接通過上邊這種方式修改 nginx 即可,無需真正的把文件給放到服務器上。
nginx 配置 upstream 反向代理
http {
...
upstream tomcats {
server 192.168.106.176 weight=1;
server 192.168.106.177 weight=1;
}
server {
location /ops-coffee/ {
proxy_pass http://tomcats;
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_set_header X-Forwarded-Proto $scheme;
}
}
}
稍不注意可能會落入一個proxy_pass
加槓不加槓的陷阱,這裏詳細說下proxy_pass http://tomcats
與proxy_pass http://tomcats/
的區別:
雖然只是一個 / 的區別但結果確千差萬別。分爲以下兩種情況:
1. 目標地址中不帶 uri(proxy_pass http://tomcats
)。此時新的目標 url 中,匹配的 uri 部分不做修改,原來是什麼就是什麼。
location /ops-coffee/ {
proxy_pass http://192.168.106.135:8181;
}
http://domain/ops-coffee/ --> http://192.168.106.135:8181/ops-coffee/
http://domain/ops-coffee/action/abc --> http://192.168.106.135:8181/ops-coffee/action/abc
2. 目標地址中帶 uri(proxy_pass http://tomcats/
,/ 也是 uri), 此時新的目標 url 中,匹配的 uri 部分將會被修改爲該參數中的 uri。
location /ops-coffee/ {
proxy_pass http://192.168.106.135:8181/;
}
http://domain/ops-coffee/ --> http://192.168.106.135:8181
http://domain/ops-coffee/action/abc --> http://192.168.106.135:8181/action/abc
nginx upstream 開啓 keepalive
upstream tomcat {
server ops-coffee.cn:8080;
keepalive 1024;
}
server {
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://tomcat;
}
}
nginx 在項目中大多數情況下會作爲反向代理使用,例如 nginx 後接 tomcat,nginx 後接 php 等,這時我們開啓 nginx 和後端服務之間的 keepalive 能夠減少頻繁創建 TCP 連接造成的資源消耗,配置如上
keepalive: 指定每個 nginxworker 可以保持的最大連接數量爲 1024,默認不設置,即 nginx 作爲 client 時 keepalive 未生效
proxy_http_version 1.1: 開啓 keepalive 要求 HTTP 協議版本爲 HTTP 1.1
proxy_set_header Connection "": 爲了兼容老的協議以及防止 http 頭中有Connection close
導致的 keepalive 失效,這裏需要及時清掉 HTTP 頭部的 Connection
404 自動跳轉到首頁
server {
location / {
error_page 404 = @ops-coffee;
}
location @ops-coffee {
rewrite .* / permanent;
}
}
網站出現 404 頁面不是特別友好,我們可以通過上邊的配置在出現 404 之後給自動跳轉到首頁去。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/wt2uohsuWSqwG3vIEIpEZA