最近想深入學習研究一下nginx相關知識,所以下以下內容總結以下。
什麼是nginx?
Nginx是一款自由的、開源的、高效能的HTTP伺服器和反向代理伺服器;同時也是一個IMAP、POP3、SMTP代理伺服器;Nginx可以作為一個HTTP伺服器進行網站的釋出處理,另外Nginx可以作為反向代理進行負載均衡的實現。
nginx優勢
1、可以高併發連線
官方測試Nginx能夠支撐5萬併發連線,實際生產環境中可以支撐2~4萬併發連線數。
原因,主要是Nginx使用了最新的epoll(Linux2.6核心)和kqueue(freeBSD)網路I/O模型,而Apache使用的是傳統的Select模型,其比較穩定的Prefork模式為多程式模式,需要經常派生子程式,所以消耗的CPU等伺服器資源,要比Nginx高很多。
2、記憶體消耗少
Nginx+PHP(FastCGI)伺服器,在3萬併發連線下,開啟10個Nginx程式消耗150MB記憶體,15MB10=150MB,開啟的64個PHP-CGI程式消耗1280記憶體,20MB64=1280MB,加上系統自身消耗的記憶體,總共消耗不到2GB的記憶體。
如果伺服器的記憶體比較小,完全可以只開啟25個PHP-CGI程式,這樣PHP-CGI消耗的總記憶體數才500MB。
3、成本低廉
購買F5BIG-IP、NetScaler等硬體負載均衡交換機,需要十多萬到幾十萬人民幣,而Nginx為開源軟體,採用的是2-clause BSD-like協議,可以免費試用,並且可用於商業用途。
BSD開源協議是一個給使用者很大自由的協議,協議指出可以自由使用、修改原始碼、也可以將修改後的程式碼作為開源或專用軟體再發布。
4、配置檔案非常簡單
網路和程式一樣通俗易懂,即使,非專用系統管理員也能看懂。
5、支援Rewrite重寫
能夠根據域名、URL的不同,將http請求分到不同的後端伺服器群組。
6、內建的健康檢查功能
如果NginxProxy後端的某臺Web伺服器當機了,不會影響前端的訪問。
7、節省頻寬
支援GZIP壓縮,可以新增瀏覽器本地快取的Header頭。
8、穩定性高
用於反向代理,當機的概率微乎其微。
9、支援熱部署
Nginx支援熱部署,它的自動特別容易,並且,幾乎可以7天*24小時不間斷的執行,即使,執行數個月也不需要重新啟動,還能夠在不間斷服務的情況下,對軟體版本進行升級。
nginx配置引數
以我檢視寶塔中的nginx.conf配置為例
## 主模組
# 配置使用者或者組
user www www;
#Nginx開啟的worker程式數,建議為CPU的核數
worker_processes auto;
#指定日誌路徑,級別。這個設定可以放入全域性塊、http塊、server塊,級別以此為:#debug|info|notice|warn|error|crit|alert|emerg
error_log /www/wwwlogs/nginx_error.log crit;
#指定nginx程式執行檔案存放地址
pid /www/server/nginx/logs/nginx.pid;
#配置Nginx worker程式最大開啟檔案數
worker_rlimit_nofile 51200;
##事件模組
events
{
#事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport,不建議設定,nginx會自行選擇
use epoll;
#最大連線數,預設為512
worker_connections 51200;
#設定一個程式是否同時接受多個網路連線,預設為off
multi_accept on;
#設定網路連線序列化,防止驚群現象發生,預設為
#on accept_mutex on;
#預設: 500ms 如果一個程式沒有互斥鎖,它將延遲至少多長時間。預設情況下,延遲是500ms。
#accept_mutex_delay 100ms;
}
#http模組
http
{
#副檔名與檔案型別對映表
include mime.types;
#include luawaf.conf;
#引入proxy.conf配置為nginx代理相關配置,配置內容如下
include proxy.conf;
# 預設檔案型別,預設為text/plain
default_type application/octet-stream;
#儲存伺服器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的
server_names_hash_bucket_size 512;
#設定請求緩衝
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
#上傳檔案的大小限制 預設1m
client_max_body_size 50m;
#允許sendfile方式傳輸檔案,預設為off
sendfile on;
#資料包不會馬上傳送出去,等到資料包最大時,一次性的傳輸出去,這樣有助於解決網路堵塞。當使用sendfile函式時,tcp_nopush才起作用
tcp_nopush on;
#連線超時時間,預設為75s
keepalive_timeout 60;
#使緩衝區中的資料立即傳送
tcp_nodelay on;
#指定連線到後端FastCGI的超時時間
fastcgi_connect_timeout 300;
#指定向FastCGI傳送請求的超時時間,這個值是已經完成兩次握手後向FastCGI傳送請求的超時時間
fastcgi_send_timeout 300;
#指定接收FastCGI應答的超時時間,這個值是已經完成兩次握手後接收FastCGI應答的超時時間
fastcgi_read_timeout 300;
#指定讀取FastCGI應答第一部分需要用多大的緩衝區
fastcgi_buffer_size 64k;
#指定本地需要用多少和多大的緩衝區來緩衝FastCGI的應答請求
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
#表示在寫入快取檔案時使用多大的資料塊,預設值是fastcgi_buffers的兩倍。
fastcgi_temp_file_write_size 256k;
#是否傳遞4xx和5xx錯誤資訊到客戶端,或者允許nginx使用error_page處理錯誤資訊
fastcgi_intercept_errors on;
##開啟gzip資源壓縮
gzip on;
#當返回內容大於此值時才會使用gzip進行壓縮,以K為單位,當值為0時,所有頁面都進行壓縮。
gzip_min_length 1k;
#設定用於處理請求壓縮的緩衝區數量和大小
gzip_buffers 4 16k;
#用於識別http協議的版本,早期的瀏覽器不支援gzip壓縮,使用者會看到亂碼,所以為了支援前期版本加了此選項。預設在http/1.0的協議下不開啟gzip壓縮。
gzip_http_version 1.1;
#設定gzip壓縮級別,級別越底壓縮速度越快檔案壓縮比越小,反之速度越慢檔案壓縮比越大
gzip_comp_level 2;
#設定需要壓縮的MIME型別,如果不在設定型別範圍內的請求不進行壓縮
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
#增加響應頭"Vary: Accept-Encoding"
gzip_vary on;
#Nginx做為反向代理的時候啟用:
#off – 關閉所有的代理結果資料壓縮
#expired – 如果header中包含”Expires”頭資訊,啟用壓縮
#no-cache – 如果header中包含”Cache-Control:no-cache”頭資訊,啟用壓縮
#no-store – 如果header中包含”Cache-Control:no-store”頭資訊,啟用壓縮
#private – 如果header中包含”Cache-Control:private”頭資訊,啟用壓縮
#no_last_modified – 啟用壓縮,如果header中包含”Last_Modified”頭資訊,啟用壓縮
#no_etag – 啟用壓縮,如果header中包含“ETag”頭資訊,啟用壓縮
#auth – 啟用壓縮,如果header中包含“Authorization”頭資訊,啟用壓縮
#any – 無條件壓縮所有結果資料
gzip_proxied expired no-cache no-store private auth;
#通過表示式,表明哪些UA頭不使用gzip壓縮
gzip_disable "MSIE [1-6]\.";
#請求限制,對單個ip、單個會話同時存在的連線數的限制。這裡定義一個儲存區conn_zone,conn_zone的容量是1m,該儲存區針對於變數$binary_remote_add生效,這裡是針對單個IP生效。
limit_conn_zone $binary_remote_addr zone=perip:10m;
#針對域名限制
limit_conn_zone $server_name zone=perserver:10m;
#隱藏版本號
server_tokens off;
#關閉access_log,即不記錄訪問日誌
access_log off;
#server{} 包含在http{}內部,每一個server{}都是一個虛擬主機(站點)
server
{
#監聽埠為888,可以自定義其他埠,也可以加上IP地址
listen 888;
#定義網站域名,可以寫多個,用空格分隔
server_name phpmyadmin;
#預設訪問檔案
index index.html index.htm index.php;
#定義網站根目錄,目錄可以是相對路徑也可以是絕對路徑
root /www/server/phpmyadmin;
#定義404頁面
#error_page 404 /404.html;
include enable-php.conf;
#匹配以gif,jpg,jpeg,png,bmp,swf結尾的請求
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
#控制頁面使用快取,快取時間為30天
expires 30d;
}
#匹配以js,cssf結尾的請求
location ~ .*\.(js|css)?$
{
#控制頁面使用快取,快取時間為12小時
expires 12h;
}
#匹配禁止訪問
location ~ /\.
{
deny all;
}
#定義訪問日誌,可以針對每一個server(即每一個站點)設定它們自己的訪問日誌
access_log /www/wwwlogs/access.log;
}
#引入該目錄下所有以.conf結尾的配置檔案
include /www/server/panel/vhost/nginx/*.conf;
}
proxy.conf內容如下
#儲存從代理伺服器接收到的資料的臨時檔案定義目錄
proxy_temp_path /www/server/nginx/proxy_temp_dir;
#表示快取檔案存放的路徑,該路徑是預先就要建立好的
#(levels=1:2 : 設定在相對於path指定目錄的第幾級hash目錄中快取資料,levels=1,表示一級hash目錄,levels=1:2,表示兩級hash目錄,目錄的名稱是基於請求URL通過雜湊演算法得到的)
#(keys_zone=cache_one:500m : 設定快取名字)
#(inactive=1d : 強制更新時間,在指定時間內沒人訪問,就刪除快取)
#(max_size=30g : 設定硬碟中快取資料的大小限制,最大快取空間)
proxy_cache_path /www/server/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:20m inactive=1d max_size=5g;
#處理客戶端請求體buffer大小,用來處理POST提交資料,上傳檔案等。client_body_buffer_size 需要足夠大以容納如果需要上傳POST資料
client_body_buffer_size 512k;
#設定與upstream server的連線超時時間,有必要記住,這個超時不能超過75秒。
proxy_connect_timeout 60;
#設定與代理伺服器的讀超時時間。它決定了nginx會等待多長時間來獲得請求的響應。
proxy_read_timeout 60;
#設定了傳送請求給upstream伺服器的超時時間。超時設定不是為了整個傳送期間,而是在兩次write操作期間。如果超時後,upstream沒有收到新的資料,nginx會關閉連線
proxy_send_timeout 60;
#Nginx使用該大小申請read_buf,即大小指定了 upstream header 最大長度,如果響應頭超過了這個長度,Nginx會報upstream sent too big header錯誤,然後client收到的是502。
proxy_buffer_size 32k;
#設定儲存被代理伺服器響應的body所佔用的buffer個數和每個buffer大小。具體的意思是說,開闢4個長度為64k大小的read_buf用來儲存body,當然不是連線建立初始化時就開闢4個,而是噹噹前buf不夠存響應body時才會新申請一個,最多申請4個buf。
proxy_buffers 4 64k;
#nginx會在沒有完全讀完後端響應就開始向客戶端傳送資料,所以它會劃出一部分busy狀態的buffer來專門向客戶端傳送資料(建議為proxy_buffers中單個緩衝區的2倍),然後它繼續從後端取資料。proxy_busy_buffer_size引數用來設定處於busy狀態的buffer有多大。
proxy_busy_buffers_size 128k;
#一次訪問能寫入的臨時檔案的大小,預設是proxy_buffer_size和proxy_buffers中設定的緩衝區大小的2倍
proxy_temp_file_write_size 128k;
#指定method在轉發到代理伺服器的請求中使用的HTTP
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
## 使用快取區 cache_one
proxy_cache cache_one;
laravel專案的nginx配置
server
{
#監聽80埠
listen 80;
#監聽443埠,使用ssl協議
listen 443 ssl http2;
#定義網站域名
server_name test.com;
#預設訪問檔案
index index.php index.html index.htm default.php default.htm default.html;
#根目錄
root /www/wwwroot/test/public;
#強制使用https,當監聽埠不為443時,重寫路由
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
#配置ssl證照
ssl_certificate /www/server/panel/vhost/cert/test.com/fullchain.pem;
#配置ssl祕鑰
ssl_certificate_key /www/server/panel/vhost/cert/test.com/privkey.pem;
#用於限制連線,使其僅包括SSL / TLS的強版本和密碼
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
#設定儲存會話引數的快取的型別和大小
ssl_session_cache shared:SSL:10m;
#指定客戶端可以重用會話引數的時間
ssl_session_timeout 10m;
# 定義497錯誤提示頁面
error_page 497 https://$host$request_uri;
#PHP-INFO-START PHP引用配置,可以註釋或修改
include enable-php.conf;
#PHP-INFO-END
#laravel的URL重寫規則
location / {
try_files $uri $uri/ /index.php$is_args$query_string;
}
#禁止訪問的檔案或目錄
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一鍵申請SSL證照驗證目錄相關設定
location ~ \.well-known{
allow all;
}
#匹配以gif,jpg,jpeg,png,bmp,swf結尾的請求並新增快取時間為30天
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log off;
access_log /dev/null;
}
#匹配以js,css結尾的請求並新增快取時間為12小時
location ~ .*\.(js|css)?$
{
expires 12h;
error_log off;
access_log /dev/null;
}
#訪問日誌
access_log /www/wwwlogs/test.com.log;
#錯誤日誌
error_log /www/wwwlogs/test.com.error.log;
}
enable-php.conf內容如下
#匹配url中包含.php的請求
location ~ [^/]\.php(/|$)
{
#查詢檔案,若檔案不存在返回404
try_files $uri =404;
#將請求轉發給fastcgi管理程式處理
fastcgi_pass unix:/tmp/php-cgi-72.sock;
#如果請求的URI是以 / 結束的, 該指令設定的檔案會被附加到URI的後面並儲存在變數$fastcig_script_name中
fastcgi_index index.php;
#設定fastcgi請求中的引數,具體設定的東西可以在$_SERVER中獲取到
#指令碼檔案請求的路徑
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#請求的引數
fastcgi_param QUERY_STRING $query_string;
#請求的動作(GET,POST)
fastcgi_param REQUEST_METHOD $request_method;
#請求頭中的Content-Type欄位
fastcgi_param CONTENT_TYPE $content_type;
#請求頭中的Content-length欄位
fastcgi_param CONTENT_LENGTH $content_length;
#指令碼名稱
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
#請求的地址不帶引數
fastcgi_param REQUEST_URI $request_uri;
#與$uri相同。
fastcgi_param DOCUMENT_URI $document_uri;
#網站的根目錄。在server配置中root指令中指定的值
fastcgi_param DOCUMENT_ROOT $document_root;
#請求使用的協議,通常是HTTP/1.0或HTTP/1.1
fastcgi_param SERVER_PROTOCOL $server_protocol;
#獲取請求協議如http或https
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
#cgi 版本
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
#nginx 版本號,可修改、隱藏
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
#客戶端IP
fastcgi_param REMOTE_ADDR $remote_addr;
#客戶端埠
fastcgi_param REMOTE_PORT $remote_port;
#伺服器IP地址
fastcgi_param SERVER_ADDR $server_addr;
#伺服器埠
fastcgi_param SERVER_PORT $server_port;
# #伺服器名,域名在server配置中指定的server_name
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
#設定指令碼名稱
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
#設定自定義變數
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}
location,rewrite語法配置
Nginx教程(四) Location配置與ReWrite語法
Nginx中的Rewrite的重定向配置與實踐
nginx常用命令
幫助命令:nginx -h
檢視程式: ps aux | grep nginx
檢查配置檔案:nginx -t
檢視nginx版本和模組:nginx -V
啟動Nginx伺服器 :sudo nginx
指定啟動配置檔案:sudo nginx -c /usr/local/nginx/conf/nginx.conf
暴力停止服務:sudo nginx -s stop
優雅停止服務:sudo nginx -s quit
重新載入配置檔案:sudo nginx -s reload
nginx變數
參考nginx的變數
Nginx 的系統變數是由每一個編譯進Nginx的模組提供的。而使用者也可以自己定義變數。
常見的nginx 變數
變數 | 作用 |
---|---|
arg_引數名 | URL 中某個具體引數的值 |
query_string | 與args變數完全相同 |
args | 全部URL引數 |
is_args | 如果請求的URL中有引數則返回?否則返回空 |
content_length | HTTP 請求中標識包體長度的Content-Length頭部的值,頭部沒有這個則為空 |
content_type | 標識請求包體型別的Content-Type 頭部的值 |
uri | 請求的URI(不包含,不包含?後的引數) |
document_uri | 與uri完全相同 |
request_uri | 請求的URL(包含?後的引數) |
scheme | 協議名 HTTP 或者 HTTPS |
request_method | 請求的方法GET 或者 POST |
request_length | 所有請求內容的大小,包括請求行,頭部,包體等 |
remote_user | 有HTTP Basic Authentication 協議傳入的使用者名稱 |
request | 原始的url請求,含有方法和協議版本 |
TCP相關的變數
變數 | 作用 |
---|---|
binary_remote_addr | 客戶端地質的整型格式,對於IPv4是4位元組 |
remote_addr | 客戶端地址 |
remote_port | 客戶端埠 |
connection | 遞增的連線序號 |
connection_requests | 當前連線上執行過的請求數,對keepalive 有意義 |
proxy_protocol_addr | 若使用了proxy_protocol 協議則返回協議中的地址 |
proxy_protocol_port | 若使用了proxy_protocol 協議則返回協議中的埠 |
server_addr | 伺服器端地址(本端地址) |
server_port | 伺服器端埠 |
TCP_INFO | tcp核心層引數($tcpinfo_rtt,$tcpinfo_rttvar,$tcpinfo_snd_cwnd,$tcpinfo_rcv_space) |
server_protocol | 服務端協議,例如 HTTP |
Nginx 處理請求過程中產生的變數
變數 | 作用 |
---|---|
request_time | 請求處理到現在的耗時 |
server_name | 匹配上的請求server_name |
request_completion | 若請求處理完則返回OK,否則為空 |
request_id | 以16禁止輸出的請求標識id,隨即生成 |
Nginx系統變數
變數 | 作用 |
---|---|
time_local | 以本地時間的標準輸出 |
pid | 所屬worker程式的id |
hostname | 與系統上輸出hostname 一致 |
虛擬主機配置
虛擬主機是一種特殊的軟硬體技術,它可以將網路上的每一臺計算機分成多個虛擬主機,每個虛擬主機可以獨立對外提供www服務,這樣就可以實現一臺主機對外提供多個web服務,每個虛擬主機之間是獨立的,互不影響
以上述在寶塔nginx配置路徑為例
基於主機多IP的方式
#在/www/server/panel/vhost/nginx目錄下建立一個ip1.conf
server
{
listen 127.0.0.1:80;
server_name www.test.com;
location / {
root html;
index index.html index.htm;
}
}
#在/www/server/panel/vhost/nginx目錄下建立一個ip2.conf
server
{
listen 127.0.0.2:80;
server_name www.test.com;
location / {
root html;
index index.html index.htm;
}
}
基於埠的配置方式
#在/www/server/panel/vhost/nginx目錄下建立一個port1.conf
server
{
listen 80;
server_name www.test.com;
location / {
root html;
index index.html index.htm;
}
}
#在/www/server/panel/vhost/nginx目錄下建立一個port2.conf
server
{
listen 81;
server_name www.test.com;
location / {
root html;
index index.html index.htm;
}
}
基於多個host名稱方式
#在/www/server/panel/vhost/nginx目錄下建立一個host1.conf
server
{
listen 80;
server_name www.test1.com;
location / {
root html;
index index.html index.htm;
}
}
#在/www/server/panel/vhost/nginx目錄下建立一個host2.conf
server
{
listen 80;
server_name www.test2.com;
location / {
root html;
index index.html index.htm;
}
}
nginx自帶模組使用
nginx可通過命令nginx -V檢視nginx已安裝的模組
–with-http_stub_status_module
用於展示了當前nginx的客戶端狀態資訊
在上述的laravel的nginx配置中的sever{}層中新增以下內容
location = /basic_status {
stub_status;
}
通過配置的域名/basic_status訪問頁面,可檢視到以下內容
Active connections: 當前活動的客戶端連線數,包含Waiting 連線數。
accepts: 接受的客戶端連線總數
handled: 已處理的連線總數,通常該引數值與 accepts 應該是一致的,除非得到某個限制(worker_connections).
requests: 客戶端請求總數。
Reading: nginx 正在讀取請求標頭的當前連線數。
Writing: nginx 正在將響應寫回到客戶端的當前連線數。
Waiting: 當前等待請求的空閒客戶端連線數。
–with-http_sub_module
通過將一個指定的字串替換為另一個字串來修改響應
模組適用於:http,server,location
server{
listen 80;
server_name test.com;
root /www/wwwroot/default;
index index.php index.html index.htm default.php default.htm default.html;
#把sub替換成SUB
sub_filter 'sub' 'SUB';
#只替換一次開關
sub_filter_once off;
}
#/www/wwwroot/default/index.html內容如下
sub sds sub sub
fastcgi相關配置
FastCGI 是一種協議,規定了FastCGI應用和支援FastCGI的Web伺服器之間的介面。FastCGI是二進位制連續傳遞的。
以下為nginx轉發最基礎的php請求轉發配置
#匹配字尾為php的請求
location ~ \.php$ {
#定義根目錄
root /usr/share/nginx/html;
#將請求轉發給fastcgi管理程式處理
fastcgi_pass 127.0.0.1:9000;
#如果請求的URI是以 / 結束的, 該指令設定的檔案會被附加到URI的後面並儲存在變數$fastcig_script_name中
fastcgi_index index.php;
#配置fastcgi引數
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
fastcgi快取核心配置
fastcgi_cache_path:設定快取的路徑和其他引數。快取資料儲存在檔案中。快取中的鍵名和檔名都是將MD5功能應用於代理URL的結果
fastcai_cache_key : 定義用於快取的金鑰
fastcgi_cache : 定義用於快取的共享記憶體區域
fastcgi_cache_valid : 設定不同響應程式碼的快取時間
更多相關fastcgi相關引數可參看官方文件
常見功能
負載均衡配置
相關配置可檢視我寫的另一篇部落格簡單實踐搭建 nginx 負載均衡
動靜分離配置
參考部落格Nginx動靜分離基本概述
動靜分離,通過中間將動靜分離和靜態請求進行分離;
通過中介軟體將動態請求和靜態請求分離,可以建上不必要的請求消耗,同時能減少請求的延時。
通過中介軟體將動態請求和靜態請求分離,邏輯圖如下 :
動靜分離只有好處:動靜分離後,即使動態服務不可用,但靜態資源不會受到影響。
不過目前常見的做法是將圖片上傳到雲端儲存,可能比較少會在自己的nginx上配置相關引數,自己去儲存圖片視訊等靜態資源
簡單例子
location / {
root /code/wordpress;
index.php;
}
location ~* \.(png|jpg|mp4)${
#指定圖片路徑
root /code/wordpress/images;
#壓縮
gzip on;
.....
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
.....
}
防盜鏈
為了防止第三方引用連結訪問我們的圖片,消耗伺服器資源和網路流量,我們可以在伺服器上做防盜鏈限制。
實現防盜鏈的方式有兩種:refer方式和簽名方式。
refer方式
工作模組:ngx_http_referer_module
作用變數:$invalid_referer,全域性變數
配置域:server, location
server
{
listen 80;
server_name nginx.sonew.shop;
root /www/wwwroot/test;
index 1.html;
default_type text/html;
location ~*\.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked nginx.sonew.shop;
if ($invalid_referer) {
return 403;
}
}
}
valid_referers: 指定資源訪問是通過以下幾種方式為合法,即白名單。
none:允許缺失的頭部訪問。
blocked:允許referer沒有對應值的請求。
server_names:若referer站點域名與server_name中本機配的域名一樣允許訪問。
簽名方式
工作模組:第三方模組HttpAccessKeyModule。
需要安裝第三方模組,還沒動手實踐。。。
server {
listen 80;
server_name www.imcati.com nginx.sonew.shop;
root /usr/share/nginx/html;
location ~*\.(gif|jpg|jpeg|png|bmp|swf)$ {
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "mypass$remote_addr";
}
}
#accesskey on | off: 模組開關
#accesskey_hashmethod md5|sha—1: 簽名加密方式
#accesskey_arg: GET引數名稱
#accesskey_sign: 加密規則
//$sign = md5('mypass' . $_SERVICE['REMOTE_ADDR']);
//img src=/test.png?key=<?=$sign?>
本作品採用《CC 協議》,轉載必須註明作者和本文連結