部署环境:静态服务器+应用服务器,静态服务器网络环境为固定的公网IP,应用服务器网络环境为动态公网IP(通常1~3天更改,通过DNSPod的API进行域名绑定)。
这样的环境下通常会有几个问题:
1. 每次应用服务器IP更改后,访问nginx就会报502;
2. 加载数据缓慢,通常一个页面的加载速度为6-10s;
解决问题1:
- 最开先采用crontab定时任务对nginx进行每2小时的重启,但这会导致中途IP变更时无法刷新ip导致502,而定时任务设置频繁会导致小则性能损耗,严重会导致nginx重启报错(DNS ttl还未刷新,导致域名未绑定ip);
- 通过设置nginx dns缓存配置来进行解决:
# resolver 为dns地址, valid 是 dns ttl 时间,不填写 valid 默认 300s
resolver 114.114.114.114 valid=300s;
# 把域名写到变量, 变量后面不要带 "/", 会导致静态样式加载问题
set $my_host "http://example.com:8080";
location / {
proxy_pass $my_host;
}
解决问题2:
可将应用服务器传输的数据都缓存在静态服务器中,可使用nginx的缓存功能:
proxy_cache_path /opt/nginx/proxy_cache levels=1:2 keys_zone=my_project:500m inactive=3d max_size=10g;
location / {
proxy_cache my_project;
proxy_cache_valid 200 206 304 301 302 10d;
proxy_cache_key $uri;
}
proxy_cache_path:缓存文件路径(需提前建立目录);
levels:设置缓存文件目录层次;
keys_zone:缓存名字和共享内存大小;
inactive:缓存时间;
max_size:最大缓存空间;
Proxy_cache :使用对应缓存配置(对应keys_zone参数);
proxy_cache_valid :对应的httpcode为200、304等指定缓存时间;
proxy_cache_key $uri :定义缓存唯一key,通过唯一key来进行hash存取;
通过对问题2的解决还能保证问题1的IP变更后的正常访问。优化后目前没有出现502问题。
参考文档