天天看點

Nginx 反向緩存代理外網 SSL 站點

可能用到的參考位址:

cURL for Windows 下載下傳:

<a href="http://curl.haxx.se/download/">http://curl.haxx.se/download/</a>

nginx ssl _module 配置英文參考:

<a href="http://auxbuss.com/blog/posts/2011_06_28_ssl_session_caching_on_nginx/">http://auxbuss.com/blog/posts/2011_06_28_ssl_session_caching_on_nginx/</a>

中文的配置nginx ssl _module 的參考:

<a href="http://www.cnphp.info/howto-setup-nginx-ssl-reverse-proxy.html">http://www.cnphp.info/howto-setup-nginx-ssl-reverse-proxy.html</a>

nginx 官方文檔 httpSslModule:

<a href="http://wiki.nginx.org/HttpSslModule">http://wiki.nginx.org/HttpSslModule</a>

購買商業 SSL 證書在 nginx 上的配置:

<a href="http://zou.lu/nginx-https-ssl-module/">http://zou.lu/nginx-https-ssl-module/</a>

紅色部分均為需要根據實際情況修改的内容。

環境:CentOS 5.7, Nginx 1.0.10 Stable

1. 首先編譯安裝 nginx,參照以往内容,或為了友善起見,可使用 lnmp.org 的一鍵包;

2. 修改 upgrade_nginx.sh 腳本中的編譯參數為:

./configure –user=nginx –group=nginx –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module –with-http_gzip_static_module –with-ipv6 –with-http_sub_module –add-module=../ngx_cache_purge-1.4

ngx_cache_purge 的版本自行驗證,下載下傳位址為

<a href="http://labs.frickle.com/nginx_ngx_cache_purge/">http://labs.frickle.com/nginx_ngx_cache_purge/</a>

之後,更新 nginx 版本到最新穩定版。

3. 修改源自 lnmp.org 的 nginx.conf 的預設配置檔案,在 http 段末尾添加:

ssl_session_cache shared:SSL:10m;

ssl_session_timeout 10m;

ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

proxy_cache_path /usr/local/nginx/proxy_temp levels=1:2 keys_zone=CACHENAME:10m;

4. 在 vhost 目錄下建立虛拟主機的 nginx 配置檔案。

下面是一個例子。這個例子中,将靜态内容緩存在 nginx 所在的伺服器。

server {  

listen 443 ssl;  

server_name my.ssh.so;  

ssl on;  

access_log /usr/local/nginx/logs/myssh-ssl-access.log;

error_log /usr/local/nginx/logs/myssh-ssl-error.log;

ssl_certificate /usr/local/nginx/conf/ssl/my.ssh.so.crt;  

ssl_certificate_key /usr/local/nginx/conf/ssl/my.ssh.so.key;

keepalive_timeout 60;  

if ($http_Cache_Control = "no-cache") {

       rewrite ^(.*)$ /purge$1 last;

}

location ~ /purge(/.*)

{

       proxy_cache_purge CACHENAME $host$1$is_args$args;

       # Press Ctrl+F5 to purge the proxy_cache manually;

location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {

       proxy_buffering on;

       proxy_pass https://46.21.169.60;

       # Most PHP, Python, Rails, Java App can use this header info:

       proxy_set_header X-Forwarded-Proto https;

       proxy_cache CACHENAME;

       proxy_cache_key $host$uri$is_args$args;

       proxy_cache_valid 200 302 1h;  

       proxy_cache_valid 301 1d;  

       proxy_cache_valid any 1m;  

add_header Nginx-Cache-Status "$upstream_cache_status - from nginx_cache";

location / {

       proxy_redirect off;

       proxy_set_header Host $host;

       proxy_set_header X-Real-IP $remote_addr;

       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

add_header No_Cache "$upstream_cache_status - This page will not be cached.";

}  

5. proxy_cache_purge 的 ACL:

由于安全考慮,一般不可能讓所有人都能有權限 purge cache,而且 purge 的界面也并不友好。

例:

       allow 127.0.0.1;

       allow 221.221.21.112;

       deny all;

至于 Purge 頁面的修改,可以自行修改 ngx_cache_purge 的源碼,在此不再細述,況且如果限制了一般客戶無法 purge,就根本不需要修改。

6. 附:自簽署證書的生成

生成 key:

openssl genrsa -des3 -out my.ssh.so.key 1024

生成 csr:

openssl req -new -key my.ssh.so.key -out my.ssh.so.csr

取消重新開機 nginx 時會要求輸入密鑰的提示:

cp my.ssh.so.key my.ssh.so.key.org

openssl rsa -in my.ssh.so.key.org -out my.ssh.so.key

生成最終簽署的 crt:

openssl x509 -req -days 365 -in my.ssh.so.csr -signkey my.ssh.so.key -out my.ssh.so.crt

7. 緩存是否命中的檢測

-k 參數為忽略 SSL 證書的可信性驗證。Miss/Hit 的文字說明可以參見第4部分的具體配置部分。

從上述結果可看出,第一次通路時緩存 MISS,第二次就成功 HIT 了。有興趣的話還可以在浏覽器中打開此連結,purge 之後再次用 curl -I 測試。

本文轉自 安安安安森  51CTO部落格,原文連結:http://blog.51cto.com/smallc/1230677,如需轉載請自行聯系原作者