標籤:

nginx配置、反向代理緩存、負載均衡

一、nginx基本配置

nginx開啟文件目錄瀏覽功能(web上顯示目錄)

1location / {
2 root /data/www/file //指定實際目錄絕對路徑;
3 autoindex on; //開啟目錄瀏覽功能;
4 autoindex_exact_size off; //關閉詳細文件大小統計,讓文件大小顯示MB,GB單位,默認為b;
5 autoindex_localtime on; //開啟以伺服器本地時區顯示文件修改日期!
6}

php-fpm配置

1 location ~ .php(.*)$ {
2 fastcgi_pass 127.0.0.1:9000;
3 fastcgi_read_timeout 7200;
4 fastcgi_index index.php;
5 fastcgi_split_path_info ^((?U).+.php)(/?.+)$;
6 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
7 fastcgi_param PATH_INFO $fastcgi_path_info;
8 fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
9 include fastcgi_params;
10 }

靜態資源讀取

1 location ~ .*.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
2 #所有靜態文件直接讀取硬碟
3 root /var/lib/tomcat7/webapps/JieLiERP/WEB-INF ;
4 expires 30d; #緩存30天
5 }

gzip 壓縮

1gzip on; #是否開啟gzip
2gzip_buffers 32 4k; #內存中緩衝幾塊
3gzip_min_length 1000; #最小壓縮長度
4gzip_comp_level 6; #壓縮級別[1-9](級別越高壓縮的越小,但是越浪費cpu)
5gzip_disable; #正則匹配UA什麼樣的uri不進行壓縮
6gzip_http_version 1.1|2.0; 開始壓縮htpp協議版本
7gzip_proxied #設置請求者代理伺服器,該如何緩存內容
8gzip_types text/plain application/xml; #對哪些類型的文件用壓縮(圖片,mp3這類2進位文件壓縮率不高沒必要壓縮)
9gzip_vary on|off #是否傳輸壓縮標誌


二、nginx配置https

1.激活所需要的網站的https獲取crt和key證書

2.在nginx配置文件中配置https證書

將http訪問域名重定向為https安全訪問

1server {
2 listen 80;
3 server_name www.shangbee.com shangbee.com;
4 #重定向shangbee.com到 www.shangbee.com
5 # if ( $host != www.shangbee.com ) {
6 # rewrite ^/(.*)$ https://www.shangbee.com permanent;
7 # }
8 rewrite ^ https://$http_host$request_uri? permanent;#強制將HTTP重定向到HTTPS permanent永久重定向
9
10}

1server {
2 listen 443 ssl;
3 ssl_certificate /etc/nginx/ssl/nginx.crt;
4 ssl_certificate_key /etc/nginx/ssl/nginx.key;
5 keepalive_timeout 70;
6 server_name www.shangbee.com;
7 server_tokens off;
8 #add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
9 fastcgi_param HTTPS on;
10 fastcgi_param HTTP_SCHEME https;
11 #access_log /app/logs/nginx/mydomain_access.log;
12 #error_log /app/logs/nginx/mydomain_error.log;
13 set $root /data/htdocs/ether/public;
14 location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
15 {
16 root $root;
17 }
18 location / {
19 root $root;
20 index index.html index.php;
21 if ( -f $request_filename) {
22 break;
23 }
24 if ( !-e $request_filename) {
25 rewrite ^(.*)$ /index.php/$1 last;
26 break;
27 }
28 }
29 location ~ .+.php($|/) {
30 fastcgi_pass unix:/run/php/php7.0-fpm.sock;
31 fastcgi_split_path_info ^((?U).+.php)(/?.+)$;
32 fastcgi_param PATH_INFO $fastcgi_path_info;
33 fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
34 fastcgi_param SCRIPT_FILENAME $root$fastcgi_script_name;
35 include fastcgi_params;
36 }
37}

永久重定向與臨時重定向的區別

臨時重定向redirect,永久重定向permanent

301重定向是永久的重定向,搜索引擎在抓取新內容的同時也將舊的網址替換為重定向之後的網址。

302跳轉是暫時的跳轉,搜索引擎會抓取新的內容而保留舊的網址。因為伺服器返回302代碼,搜索引擎認為新的網址只是暫時的。

實施301後,新網址完全繼承舊網址,舊網址的排名等完全清零。

實施302後,對舊網址沒有影響,但新網址不會有排名。

302每次用戶請求都會訪問一次伺服器,並返回給用戶,301用戶請求後將永久重定向緩存,再次請求直接在本地重定向不會經過伺服器。


三、負載均衡與反向代理

  • 反向代理是負載均衡的一種方式
  • 反向代理可以實現負載均衡 但是負載均衡不一定通過反向代理的方式來實現
  • 反向代理也可以不做負載均衡 可以做客戶端與web伺服器之間的緩存伺服器
  • squid varnish這些反向代理一般做緩存
  • nginx反向代理一般做負載均衡
  • 負載均衡也可以通過LVS非反向代理的方式來實現 通過ip和埠實現負載均衡

NGINX反向代理緩存

反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連接請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連接的客戶端,此時代理伺服器對外就表現為一個伺服器。

反向代理的作用

①保護網站安全:任何來自Internet的請求都必須先經過代理伺服器。

簡單來說,就是我們網站的所有的請求都要經過反向代理伺服器,對反向代理伺服器進行安全加固就能解決很大一部分的安全問題。

②通過配置緩存功能加速Web請求:可以緩存真實Web伺服器上的某些靜態資源,減輕真實Web伺服器的負載壓力;

可以在反向代理的伺服器上緩存某些靜態資源,這樣的話在反向代理伺服器上存在的資源就不用去web伺服器上獲取,以減輕web伺服器的壓力。

③實現負載均衡:充當負載均衡伺服器均衡地分發請求,平衡集群中各個伺服器的負載壓力;

可以通過反向代理伺服器把請求分發到不同伺服器,減輕伺服器的壓力,還能防止網站某一台伺服器掛掉之後,網站就無法訪問的問題,做到網站的高可用,減少事故的發生。

反向代理緩存設置

一、在反向代理伺服器的配置文件中加入:

位置:

http段內

1proxy_temp_path /data/nginx-temp; #緩存臨時文件路徑
2proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m
3max_size=50m inactive=1m; #緩存保存的路徑

  • levels指定該緩存空間有兩層hash目錄,第一層目錄為1個數字或者字母,第二層為2個數字或者字母
  • keys_zone指的是緩存空間名稱。 20m 為內存緩存空間大小
  • max_size指的是緩存文件可以佔用的最大空間。
  • inactive指的是如果一個緩存文件多長時間不被訪問,就會被刪除。(天:d、秒:s、分:m)

?配置的demo

//設置動態伺服器的代理 【處理PHP任務】

1upstream test {
2 #ip_hash; #[ 使用ip_hash分發 ]
3 server 192.168.1.254:81 weight=2 ; #[ 設置這個伺服器的權重為2 ]
4 server 192.168.1.254:82;
5}

//設置獲取靜態文件的代理

1upstream static{
2 server 192.168.1.254:81 ; #[ 靜態伺服器 ]
3}

設置緩存目錄

1proxy_temp_path /data/nginx-temp; #[temp的目錄]
2proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m max_size=50m inactive=1m;

[ 設置緩存的路徑為 /data/nginx-cache 層級為2級,第一級為1個字幕第二個為2個字母 緩存的空間名為 nginx-cache,緩存的內存空間為20M 最大空間為50M 1分鐘內沒有訪問刪除這個緩存 ]

END

1server {
2 listen 80;
3 server_name _;
4 access_log logs/likang.default.access.log main;
5 error_log logs/error.log error;
6 root /var/www/html/likang/default;

設置反向代理

1location /{
2 proxy_pass http://test;
3 proxy_set_header Host $host;
4 proxy_set_header X-Real-IP $remote_addr;
5 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
6 }

設置靜態圖片

1location ~.*.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {
2 #root /data/nginx-cache; #[ 圖片的根目錄 ]
3 proxy_redirect off; #[關閉跳轉]
4 proxy_set_header Host $host; #[ 設置header ]
5 proxy_cache nginx-cache; #[ 緩存的空間 -- 上邊定義的 ]
6 proxy_cache_valid 200 302 1h; #[ 不同http狀態緩存時間不同 ]
7 proxy_cache_valid 301 1d;
8 proxy_cache_valid any 1m;
9 proxy_ignore_headers Set-Cookie Cache-Control;
10 proxy_hide_header Cache-Control;
11 proxy_hide_header Set-Cookie;
12 expires 30d; #[告訴瀏覽器緩存有效期 -- 30天內可以直接訪問瀏覽器緩存 ]
13 proxy_pass http://static; #[文件不存在去那裡獲取]
14 }
15}

解決不緩存的問題:

  1. nginx不緩存原因

默認情況下,nginx是否緩存是由nginx緩存伺服器與源伺服器共同決定的, 緩存伺服器需要嚴格遵守源伺服器響應的header來決定是否緩存以及緩存的時常。header主要有如下:

Cache-control:no-cache、no-store

如果出現這兩值,nginx緩存伺服器是絕對不會緩存的

Expires:1980-01-01

如果出現日期比當前時間早,也不會緩存。

  1. 解決不緩存方案

2.1 方法一:

修改程序或者源伺服器web程序響應的header

2.2 方法二:

nginx代理直接加上如下一句:

1proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;

或者:

1proxy_ignore_headers Set-Cookie Cache-Control;
2proxy_hide_header Cache-Control;
3proxy_hide_header Set-Cookie;

擴展:學習nginx的Proxy Cache指令

1 proxy_cache

語法:proxy_cache zone_name;

默認值:None

使用欄位:http, server, location

設置一個緩存區域的名稱,一個相同的區域可以在不同的地方使用。

在0.7.48後,緩存遵循後端的」Expires」, 「Cache-Control: no-cache」, 「Cache-Control: max-age=XXX」以及其他等。然而,目前nginx會忽略一些緩存控制指令,如:」private」和」no-store」,同樣,nginx在緩存過程中不會處理」Vary」頭,為了確保一些私有數據不被所有的用戶看到,後端必須設置 「no-cache」或者」max-age=0″頭,或者proxy_cache_key包含用戶指定的數據如

2 proxy_cache_key

語法:proxy_cache_key line;

默認值:httpcookiexxx,在proxycachekey中使用一部分cookie的值可以防止緩存私有數據,所以可以分別指定location以便分開私有數據和公有數據。緩存指令依賴代理緩衝區(buffers),如果proxybuffers設置為off,緩存不會生效。¨K40K語法:¨C2C默認值:schemeproxyostrequest_uri;

使用欄位:http, server, location

指令指定了包含在緩存中的緩存關鍵字。

複製代碼 代碼如下:

1proxy_cache_key "$host$request_uri$cookie_user";
2
3proxy_cache_key "$scheme$host$request_uri";

3 proxy_cache_path

語法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];

默認值:None

使用欄位:http

指令指定緩存的路徑和一些其他參數,緩存的數據存儲在文件中。緩存的文件名和key為代理URL的MD5 碼。levels參數指定緩存的子目錄數,例如:

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;

文件名類似於:

/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c

所有活動的key和元數據存儲在共享的內存區域中,這個區域用keys_zone參數指定,如果在inactive參數指定的時間內緩存的數據沒有被請求則被刪除,默認inactive為10分鐘。

cache manager進程式控制制磁碟的緩存大小,在max_size參數中定義,超過其大小後最少使用數據將被刪除。

區域的大小按照緩存頁面數的比例進行設置,一個頁面(文件)的元數據大小按照操作系統來定,FreeBSD/i386下為64位元組,FreeBSD/amd64下為128位元組,當區域滿了以後key將按照LRU(最近最少使用演算法)進行處理。

proxy_cache_path和proxy_temp_path應該使用在相同的文件系統上。

4 proxy_cache_methods

語法:proxy_cache_methods [GET HEAD POST];

默認值:proxy_cache_methods GET HEAD;

使用欄位:http, server, location

GET/HEAD用來裝飾語句,即你無法禁用GET/HEAD即使你只使用下列語句設置:

proxy_cache_methods POST;

5 proxy_cache_min_uses

語法:proxy_cache_min_uses the_number;

默認值:proxy_cache_min_uses 1;

使用欄位:http, server, location

多少次的查詢後應答將被緩存,默認1。

6 proxy_cache_valid

語法:proxy_cache_valid reply_code [reply_code ...] time;

默認值:None

使用欄位:http, server, location

為不同的應答設置不同的緩存時間,例如:

複製代碼 代碼如下:

1 proxy_cache_valid 200 302 10m;
2 proxy_cache_valid 404 1m;
3 proxy_cache_valid 5m;
4 proxy_cache_valid 200 302 10m;
5 proxy_cache_valid 301 1h;
6 proxy_cache_valid any 1m;

7 proxy_cache_use_stale

為了防止緩存失效(在多個線程同時更新本地緩存時),你可以指定』updating』參數,它將保證只有一個線程去更新緩存,並且在這個線程更新緩存的過程中其他的線程只會響應當前緩存中的過期版本。

代碼及configure配置:

在ngx_http_proxy_module.c裡面定義了每個指令的鉤子(即callback),它們在讀取配置文件時會被調用。在configure的時候只需要把「HTTP_CACHE」設置為YES(可以找到auto/options裡面HTTP_CACHE那行)。「proxy_cache_purge」指令需要下載nginx add-ons裡面的「Cache Purge」模塊,並在configure的時候用"--add-module="來載入代碼。

推薦閱讀:

TAG:Nginx |