可能用到的参考地址:
cURL for Windows 下载:
http://curl.haxx.se/download/
nginx ssl _module 配置英文参考:
http://auxbuss.com/blog/posts/2011_06_28_ssl_session_caching_on_nginx/
中文的配置nginx ssl _module 的参考:
http://www.cnphp.info/howto-setup-nginx-ssl-reverse-proxy.html
nginx 官方文档 httpSslModule:
http://wiki.nginx.org/HttpSslModule
购买商业 SSL 证书在 nginx 上的配置:
http://zou.lu/nginx-https-ssl-module/
红色部分均为需要根据实际情况修改的内容。
环境: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 的版本自行验证,下载地址为
http://labs.frickle.com/nginx_ngx_cache_purge/
之后,升级 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_pass https://46.21.169.60;
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 https;
add_header No_Cache "$upstream_cache_status - This page will not be cached.";
}
}
5. proxy_cache_purge 的 ACL:
由于安全考虑,一般不可能让所有人都能有权限 purge cache,而且 purge 的界面也并不友好。
例:
location ~ /purge(/.*)
{
allow 127.0.0.1;
allow 221.221.21.112;
deny all;
proxy_cache_purge CACHENAME $host$1$is_args$args;
}
至于 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 测试。