Nginx榮獲2012年度雲計算開發獎,全球第二大Web服務器;開源、高性能、高併發、簡單配置,解決了C10k問題。
但在穩定性方面交老道的Apache稍差一點。
Apache穩定、開源、跨平臺,配置稍微複雜,存在C10k問題。
一、Nginx特性:
1、基本功能:
(1)、靜態資源的web服務,能自動緩存打開的文件描述符。
(2)、反向代理服務器,負載均衡、緩存。
(3)、支持FastCGI協議,因此能夠實現LNMP(Linux Nginx Mysql Php)。
(4)、高度模塊化,但非DSO機制。支持多種過濾器(如gzip),SSI和圖像大小調整等。
(5)、支持SSL.
2、擴展功能:
(1)、基於名稱和IP做虛擬主機。
(2)、支持keepalive
(3)、支持平滑配置文件更新或程序版本升級。
(4)、定製訪問日誌,以及日誌緩存以提高性能。
(5)、支持url rewrite
(6)、支持路徑別名。
(7)、支持基於IP以及用戶的認證。
(8)、支持速率限制,併發數限制等。
二、Nginx基本架構:
1、一個master,生成一個或者多個worker,一般而言worker數要小於物理cpu數量。
2、事件驅動,kqueue,epoll
3、支持非阻塞如mmap,AIO
4、支持sendfile,sendfile64
三、Nginx模塊類別:
1、核心模塊
2、標準http模塊
3、可選的http模塊
4、郵件模塊
5、第三方擴展模塊
四、Nginx的安裝以及配置:
1、編譯安裝:
安裝前確保Development Tools和Server Platform Development,
如未安裝請執行#yum -y groupinstall "Development Tools" "Server Platform Development"
(1)、#yum -y install pcre-devel 爲了解決依賴關係要裝。
(2)、首先添加用戶nginx,實現以此用戶運行nginx服務進程。
#groupadd -r nginx
#useradd -r -g nginx nginx
(3)、#tar xf nginx1.4.7.tar gz
#cd nginx1.4.7
# ./configure --prefix=/usr
--sbin-path=/usr/sbin/nginx
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx/nginx.pid
--lock-path=/var/lock/nginx.lock
--user=nginx
--group=nginx
--with-http_ssl_module
--with-http_flv_module
--with-http_stub_status_module
--with-http_gzip_static_module
--with-client-body-temp-path=/var/tmp/nginx/client
--with-proxy-temp-path=/var/tmp/nginx/proxy
--with-fastcgi-temp-path=/var/tmp/nginx/fcgi
--with-uwsgi-temp-path=/var/tmp/nginx/uwsgi
--with-scgi-temp-path=/var/tmp/nginx/scgi
--with-pcre
#make && make install
然後啓動#/usr/sbin/nginx ,並執行#ss -tnl 看下80端口。
(4)、開機啓動加腳本:
#vi /etc/rc.d/initd./nginx 內容如下:
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
而後爲此腳本賦予執行權限:
# chmod +x /etc/rc.d/init.d/nginx
添加至服務管理列表,並讓其開機自動啓動:
# chkconfig --add nginx
# chkconfig nginx on
而後就可以啓動服務並測試了:
# service nginx start
2、nginx配置 /etc/nginx/nginx.conf:
注意:配置參數需要以分號結尾,否則就語法錯誤,語法格式:參數名 值1 [值2...];
分爲兩段:核心段和http段,重要參數如下:
參數配置請參考http://nginx.org/en/docs/http/ngx_http_core_module.html
(1)、核心配置段{
A、正常運行必備的配置:
a、user username [groupname];
指定運行worker進程的用戶和組
b、pid /path/to/pidfile_name;
指定nginx的pid文件
c、worker_rlimit_nofile #;
指定一個worker進程所能夠打開的最大文件句柄數
d、worker_rlimit_sigpending #;
指定每個用戶能夠發往worker進程的信號的數量
B、優化性能相關的配置:
a、worker_processes #;
worker進程的個數,通常其值爲CPU的物理核心數減1,即1個留給系統內核用。
b、worker_cpu_affinity cpumask ...;
如共6個cpu,啓動四個cpu,則配置爲
worker_processes 4;
worker_cpu_affinity 00000001 00000010 00000100 00001000;
c、worker_priority nice;
worker進程的優先級, nice的值爲[-20,19],nice越小優先級越高。
d、ssl_engine device;
在存在ssl硬件加速器的服務器上,指定所使用的ssl硬件加速設備。
e、timer_resolution T;
每次內核事件調用返回時,都會調用系統的gettimeofday()來更新nginx緩存時鐘,timer_relolution用於定義每隔多久更新一次緩存時鐘;X86_64系統上,調用gettimeofday()代價較小,可以忽略此項;X86_32系統上代價較大。
C、事件相關的配置:
a、accept_mutex [on|off];
是否打開nginx負載均衡鎖;此鎖能夠讓多個worker輪流地與客戶端建立連接;即實現worker間負載均衡。
b、lock_file /path/to/lock_file;
lock文件;如果accept_mutex爲off,那麼lock_file 失效。
c、accept_mutex_delay #ms;
accept鎖模式中,一個worker進程爲取得accept鎖的等待時長。默認爲 500ms。如果某worker進程在每次師徒取得鎖時失敗,至少要等待#ms才能再次請求鎖。
d、multi_accept{on|off};
是否允許一次性地響應多個用戶請求;默認爲off,默認一個一個請求被響應處理。
e、use [epoll|rtsig|select|poll];
定義使用的事件模型,建議讓nginx自動選擇,在linux一般選擇epoll;
f、worker_connections #;
每個worker能夠併發響應的最大請求數;
D、用於調試、定位問題:只在調試nginx時使用。
a、daemon [on|off];
是否讓nginx運行於後臺;默認爲on,調試時爲off,使得所有信息輸出到控制檯,方便查看信息。
b、master_process [on|off];
是否讓master管理多個worker運行,默認爲on;調試時爲off,以方便追蹤問題。
c、error_log /path/to/error_log level;
錯誤日誌文件以及級別,默認爲error級別;調試時可以使用debug級別,
但要求在編譯時必須使用--with_debug啓動debug功能。
}
(2)http配置段{
說明:Nginx必須使用虛擬主機配置站點;
每個虛擬主機使用一個server{}段配置;
非虛擬主機的配置或者公共配置,需要配置在server{}外。
具體格式如下:
directive value;
...
server{
listen 80;
server_name localhost;
location{
}
}
server{
}
...
A、重要配置詳情:
a、server{}:
定義一個虛擬主機,支持基於主機名或者IP的虛擬主機。
b、listen:
listen address[:port]
listen port
default_server:定義此server爲http中默認的server;如果所有的server中沒有任何一
個listen使用此參數,那麼第一個server爲默認server。
rcvbuf=SIZE:接收緩衝大小;
sndbuf=SIZE:發送緩衝大小;
ssl:https server
c、server_name相關:
server_name NAME...;可以跟多個主機名;當nginx收到一個請求時,會取出其首部的server的值,而後跟衆server_name進行比較。
server_name_hash_bucket_size 32|64|128;爲了實現快速查找主機名,nginx使用hash表保存主機名;
d、location相關:
根據用戶請求的URI,匹配指定的各location,匹配到時將被location來處理。
location定義在server或者location中,location可以出現多次,但不能放在http上下文中。
location [ =|~|~*|^~ ] uri { ... }
location @name {...}
=:精確匹配
~:正則表達式模式匹配,匹配時區分字符大小寫。
~*:正則表達式模式匹配,匹配時忽略字符大小寫。
^~:uri前半部分匹配,不檢查正則表達式。
e、文件路徑定義:
root path:設置web資源路徑,用於指定請求的根文件目錄,通常定義在location中。
如:location / {
root /www/html;
index index.html index.htm
}
location ^~ /images/ {
root /web;
}
http://www.a.org/images/b.html
b.html放置用於/web/images/下
alias path:用於配置路徑別名,只能用於location中。
如:location / {
root /www/html;
index index.html index.htm
}
location ^~ /images/ {
alias /web;
}
http://www.a.org/images/b.html
b.html放置用於/web/下
注意:root path和alias path配置時,b.html的放置路徑。
index file...:定義默認頁,自左而右匹配。
如:location / {
root /www/html;
index index.html index.htm
}
error_page code ...[=[reponse]] uri;當對於某個請求返回錯誤是,如果匹配上了error_page指令中設定的code,則重定向指定的頁面。如error_page 404 /404.html,error_page可以定義在server或者location中。
如:location / {
root /www/html;
index index.html index.htm
error_page 404 /404.html
}
try_files path1 [path2] uri;錯誤重定向。
如:location /tryfile {
root /www/html;
index index.html index.htm
try_files $uri /tryfile.html
}
f、網絡連接相關的配置:
keepalive_timeout time;設置保持連接的超時時長,默認爲75s中。
keepalive_request n;在一次長連接上允許承載的最大請求數;
keepalive_disable [msie6|safari|none];對指定的瀏覽器禁止使用長連接。
tcp_nodelay {on|off} ;對keepalive連接是否使用tcp_nodelay選項。
client_header_timeout time;讀取http請求首部的超時時長。
send_timeout time;發送響應的超時時長。
g、對客戶端請求的限制:
limit_except method...{...};排除請求方法。
Please note that this will limit access to all methods except GET and HEAD.
client_max_body_size SIZE;http請求的包體的最大值,常用於限定客戶所能請求的最大包體;
根據請求首部中的Content-length來檢測,以免無用的傳輸。如:上傳附件的限制。
limit_rate speed;限制客戶端每秒傳輸的字節數,默認爲0,表示沒有限制。
limit_rate_after time;nginx向客戶發送響應報文時,如果時長超出此處制定的時長,則後續的發送過程開始限速;如:下載網站需要限速,web站點一般就不需要限速了 哈哈...
h、文件操作的優化:
sendfile {on|off};是否啓用sendfile功能。
aio {on|off};是否啓用aio功能。
open_file_cache max=N [inactive=time]|off;
是否打開文件緩存功能:
max:緩存條目的最大值,當滿了以後將根據LRU算法進行置換。
inactive:某緩存條目在指定時長內沒被訪問時,將自動被刪除,默認爲60s。
緩存的信息包括:
文件句柄、文件大小和上次修改時間。
已經打開的目錄結構。
沒有找到或者沒有訪問權限的信息。
open_file_cache_errors on|off;是否緩存文件找不到或者沒有權限訪問等相關信息。
open_file_cache_valid time;多長時間檢查一次緩存中的條目是否超出非活動時長,默認60s
open_file_cache_min_use #;在inactive指定的時長內被訪問超出此處指定的次數,纔不會被刪除
i、對客戶端請求的特殊處理:
ignore_invalid_heads on|off;是否忽略不合法的http首部;on爲默認,忽略不合法的http首部;off意味着請求首部中出現不合規的首部拒絕響應。
log_not_found on|off;是否將文件找不到的信息記錄到錯誤日誌中。
resolver address;指定nginx使用的dns服務器地址。
resover_timeout time;指定DNS解析超時時長,默認30s;
server_tokens on|off;是否在錯誤頁面中顯示nginx的版本號。
j、內存以及磁盤資源分配:
client_body_in_file_only
on
|clean
|off
;
http的包體是否存儲磁盤文件中;非off表示存儲,默認爲off
on|clean:clean請求結束後包體文件會被刪除,on請求結束後包體文件不會被刪除。
client_body_in_single_buffer on | off;
http的包體是否存儲在內存buffer中,默認爲off。
client_body_buffer_size size;nginx接收http包體的內存緩衝區大小,和client_body_in_single_buffer配合使用。client_body_temp_path dir_path [level1 [level2 [level3]]];定義http包體存放的臨時目錄,可以多級目錄;和client_body_in_file_only配合使用。client_header_buffer_size size;正常情況下接收用戶請求的http報文header部分時分配的buffer大小,默認爲1k。large_client_header_buffers number size;定義存儲超大http請求首部的內存buffer大小以及個數。connection_pool_size size;nginx對於每個建立成功的tcp練級誒都會預先分配一個內存池,此處即用於設定此內存池的初始大小,默認爲256。
}
3、重要的內置變量:
$uri :當前請求的uri,不帶參數;
$host:http請求報文中的host首部,不過請求中沒有host,則以處理此請求的虛擬主機的主機名替代。
$request_uri:當前請求的uri,帶完整參數;
$hostname:nginx服務器運行在的主機的主機名;
$remote_addr:客戶端IP
$remote_port:客戶端port
$remote_user:使用用戶認證時,客戶端用戶輸入的用戶名;
$request_method:請求方法
$server_addr:服務器地址
$server_name:服務器名稱
$server_port:服務器端口
$server_protocol:服務器想客戶端發送響應時的協議,如http/1.1,http/1.0
五、配置使用Nginx:
1、Nginx虛擬主機的使用:
例如:配置兩個虛擬主機:www.a.com和www.b.org
則需要在nginx.conf中配置兩個server,具體配置如下:
server{
listen 80;
server_name www.a.com;
location /{
root /www/a.com;
index index.html index.htm index.php index.jsp;
}
error_page 500 502 503 504 /50x.html;
location =/50x.html{
root html;
}
}
server{
listen 80 default_server;
server_name www.b.org;
root /www/b.org;
}
2、基於IP的訪問控制:
access{
allow
deny
}
或者在server中直接寫
allow
deny
例如僅允許 172.16.0.0/16這個網段訪問,配置如下:
allow 172.16.0.0/16
deny all
3、基於用戶做訪問控制:
location /admin/ {
root /www/b.org;
auth_basic "admin_area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
4、autoindex模塊:站點未配置主頁時,將站點的所有頁面以列表形式顯示輸出。
通常不打開,非常危險,只有建立下載站點時纔打開。
location /download/ {
root /www/b.org;
autoindex on;
}
5、圖片防盜鏈:
(1)、定義防盜鏈的步驟:
A、定義合規的引用:
valid_referers none|blocked|server_names|string ...;
B、拒絕不合規的引用:
if($invalid_referer){
rewrite ^/.*$ http://www.b.org/403.html 或者 return 404
}
(2)、例如:
location ~* \.(jpg|png|gif|jpeg)$ {
root /www/b.org;
valid_referers none blocked www.b.org *.b.org ~\.google\. ~\.baidu\.;
if($invalid_referer){
rewrite ^/.*$ http://www.b.org/403.html 或者 return 404
}
}
注意:~\.google\.允許google的爬蟲
6、URL rewrite相關:
URL rewrite使用場景如京東早期的網址爲www.360buy.com,現在網址www.jd.com,那麼訪問www.360buy.com必須自動跳轉到www.jd.com;還有服務器升級,文件路徑變更,也需要重定向;以及將url跳轉等等;
(1)、rewrite regex replacement [flag];
A、flag的值:
last:一旦被當前規則匹配並重寫後立即停止檢查後續的其他rewrite的規則,而重寫後的規則會重新發起請求。
break:一旦被當前規則匹配並重寫後立即停止檢查後續的其他rewrite的規則,而重寫後的規則不會重新發起請求。
redirect:返回302臨時重定向。
permanent:返回301永久重定向。
B、注意:如果出現死循環,nginx最多循環10次,超出之後會返回500錯誤。
一般將rewrite寫在location中時都使用break,或者將rewrite寫在if上下文中。
如:
location / {
root /www/b.org;
rewrite ^/images/(.*)$ /imgs/$1 break;
}
(2)、rewrite_log on|off :
是否把重寫過程記錄在錯誤日誌中;默認爲off。一般爲off,繁忙的服務器一定爲off。
(3)、return code:
用於結束rewrite規則,並且爲客戶返回狀態碼,可以使用的狀態碼有204 400 402-406,500-504等。
如:if($invalid_referer){
rewrite ^/.*$ return 404
}
7、gzip 壓縮:
nginx將響應報文發送至客戶端之前可以啓用壓縮功能,這樣能夠有效節約帶寬,並提高響應至客戶端的速度。通常編譯nginx時默認會附帶gzip壓縮的功能,因此可以直接啓用之。
http {
gzip on;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain text/css text/xml text/javascript
application/x-javascript application/xml application/xml+ress application/javascript application/json;
gzip_disable msie6;
}
六、Nginx反向代理及負載均衡:Nginx比LVS好用,並易於配置。
1、正向代理:
幫一個網絡內的多個客戶端訪問公網的服務叫正向代理,正向代理簡言之就是代表客戶端。
2、反向代理:
幫助服務器接收請求的服務叫反向代理,反向代理簡言之就是代表服務器端。
3、nginx的兩種常用用途:
(1)、靜態內容的web服務器。
(2)、反向代理,處理併發連接處理能力很強,因爲nginx是先緩存請求,然後一併發到後端服務器。
4、Nginx的proxy模塊:Nginx通過proxy模塊實現反向代理功能。
(1)、Nginx通過proxy模塊實現反向代理功能。
Nginx在作爲web反向代理服務器時,nginx負責接收客戶請求,並能夠根據URI、客戶端參數或者其 他的處理邏輯將用戶請求調度至上游服務器上。nginx在實現反向代理功能時的最重要的指令爲 proxy_pass,它能夠將location定義的某URI代理至指定的上游
服務器(組)上。如下面的示例中,location的/uri將被替換爲上游服務器上的/newuri.
location /uri {
proxy_pass http://www.b.org:8080/newuri;
}
不過,這種處理機制中有兩個例外。
第一個例外是,如果location的URI是通過模式匹配定義的,其URI將直接被傳遞到上游服務器,而 不能爲其指定轉換的另一個URI。例如:/bbs將被代理爲http://www.b.org:8080/bbs
,即newuri就不要寫了。
location ~^/bbs {
proxy_pass http://www.b.org:8080;
}
第二個例外是,如果location中使用的是URL重定向,那麼nginx將使用重定向後的URI處理請求, 而不再考慮上游服務器上第一的URI。如下例,傳遞給上游服務器的URI爲/index.php?page= <match>,而不是/index
location / {
rewrite /(.*)$ /index.php?page=$1 break;
proxy_pass http://www.b.org:8080/index;
}
(2)、proxy模塊指令:
proxy模塊可配置的指令參數非常多,它們分別用於定義proxy模塊工作時的諸多屬性,如連接超時 時長、代理時使用http協議版本等。
proxy_connect_timeout:nginx將一個請求發送至上游服務器(upstream server)之前等待的最大時長。默認60s
proxy_cookie_domain ;
將upstream server通過set-cookie首部設定爲domain屬性修改爲指定的值,其值可以爲一個字符、串、正則表達式的模式或一個引用變量。
proxy_cookie_path ;將upstream server通過set_cookie首部設定的path屬性修改爲指定的值,其值可以爲一個字符串、、正則表達式的模式或一個引用變量。
proxy_hide_header ;設定發送給客戶端的報文中需要隱藏的首部。
proxy_pass ;指定將請求代理至upstream server的url路徑。
proxy_set_header ;將發送至upstream server的報文的某首部進行重寫。
proxy_redirect ;重寫location並刷新從upstream server收到的報文首部。
proxy_send_timeout;在連接斷開之前兩次發送至upstream server的寫操作的最大間隔時長。
proxy_read_timeout;在連接斷開之前兩次發送至upstream server接收讀操作的最大間隔時長。
5、Upstream 模塊實現負載均衡。
http://nginx.org/en/docs/http/ngx_http_upstream_module.html
(1)、upstream name {
server address [parameters];
},只能放在http段中,各server只能直接使用IP或者主機名,不要加協議。
示例如下:
http{
.....
upstream webservers {
server 172.16.1.8 weight=1 max_fails=2 fail_timeout=5;
server 172.16.1.18 weight=2 max_fails=2 fail_timeout=5;
server 127.0.0.1:8080 backup;
}
......
server {
listen 80;
server_name www.b.org;
location / {
proxy_pass http://webservers;
proxy_set_header X_Real_IP $remote_addr;
}
}
server {
listen 8080;
server_name 127.0.0.1;
root /www/backup;
}
......
}
server address [parameters];的parameters如下:
weight=#;設置權重
max_fails=#;最大失敗嘗試次數,默認爲1
fail_timeout=#;失敗嘗試超時時長,默認爲10s。
backup:當轉發失敗,轉發至本機。
health_check:健康狀態監測。
health_check [interval=time] [fails=number] [passes=number] [uri=uri] [match=name];
定義在location中。
interval:多長時間監測一次
fails:嘗試失敗次數,如果超過此次數,則認爲失敗。
passes:重新上線次數。
uri:監測是uri.
match:自定義狀態監測。
緩存區設定:
nginx在默認情況下在將其響應給客戶端之前會儘可能接收來自於upstream服務器的響應報文,它會將這些響應報文暫存於本機並儘量一次性地響應給客戶端,然而在來自於客戶端的請求或來自upstream服務器的響應過多時,nginx會試圖將之存儲於本地磁盤中,這將大大降低nginx的性能。因此在有着更多可用內存的場景中,應該將用於暫存這些報文的緩衝區調大至一個合理值。
proxy_buffer_size size:設定用於暫存來自於upstream服務器的第一個響應報文的緩衝區大小。
proxy_buffering on|off:啓用緩衝upstream服務器的響應報文,否則,如果proxy_max_temp_file_size指令的值爲0,來自upstream服務器的響應報文在接收到的那一刻
將同步發送至客戶端;一般情況下,啓用proxy_buffering並將proxy_max_temp_file_size設定爲0能夠啓用緩存響應報文的功能,並能夠避免將其緩存至磁盤中。
proxy_buffers 8 4k|8k:用於緩存來自upstream服務器的響應報文的緩衝區大小。8爲8個緩衝區個數,4k|8k爲緩衝區大小。
緩存:
nginx作爲反向代理時,能夠將來自upstream的響應緩存至本地(一般緩存到磁盤),並在後續的客戶端請求同樣內容時直接從本地構造響應報文。
proxy_cache zone|off:定義一個用於緩存的共享內存區域,其可被多個地方調用;緩存將遵從upstream服務器的響應報文首部中關於緩存的設定,如"Expires"、"Cache-Control:no-cache"、"Cache-control:max-age=XXX" 、"private"和"no-store"等,但nginx在緩存時不會考慮響應報文的"Vary"首部。爲了確保私有信息不被緩存,所有關於用戶的私有信息可以在upstream上通過"no-cache" or "max-age=0"來實現,也可在nginx設定proxy_cache_key必須包含用戶特有數據如$cookie_xxx的方式實現,單最後這種方式在公共緩存上使用可能會有風險。因此,在響應報文中含有以下首部或者指定標誌的報文將不會被緩存。
Set-Cookie
Cache-Control containing "no-cache","no-store","private",or a "max-age" with a non-numeric or 0 value
Expires with a time in the past
X-Accel-Expires:0