Kiyor | Created: 09-07-15 12:12:25, Last Update: 09-07-15 12:51:52
最近朋友要把一个静态网站转成动态, 但是由于网站并非经营性质, 所以朋友不希望花太多精神, 那就只能转成需求的半动态.
就这种需求, 第一想到的是使用nginx的try功能, 动态归动态, 静态归静态. 不过以前没深入用过这个功能, 加上最近在玩docker, 就记录下成果吧.
由于想缩减开支, 于是想到了在digitalocean花一台$5/月的机器做nginx vhost, 但是又因为可能以后一台服务器会服务多个动态/静态网站, 又是不同类型, 所以全部docker化会容易生成镜像以备有交付需求.
首先就是在digitalocean的机器上安装docker以及开启最基本的两个容器, redis和mysql. 命令如下:
docker run -d -v /var/lib/mysql:/var/lib/mysql -p 3306:3306 --name mysql --hostname mysql tutum/mariadb
docker run -d -p 127.0.0.1:6379:6379 --name redis --hostname redis redis
由于redis主要只用作缓存, 所以没必要使用系统盘来加载.
然后开启主要用作服务的容器, 命令如下:
docker run -d -p 4001:22 -p 5001:80 -e AUTHORIZED_KEYS="`cat ~/key`" --name myservice1 --hostname myservice1 --link mysql:mysql --link redis:redis tutum/centos:centos6
由于对于容器的用法在这里更像是一个VM, 所以都开启了ssh.
网站全是静态所以可以通过wget -r
抓取全部网站
写好代码后把app放在端口:5001
nginx在容器中的配置如下:
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:8080;
}
location ~* .(?:ico|css|js|gif|jpe?g|png)$ {
proxy_pass http://127.0.0.1:8080;
more_set_headers "Cache-Control: public,max-age=900";
}
}
server {
listen 8080;
server_name localhost;
root /root/a.com;
index index.html index.htm;
location / {
try_files $uri @app;
}
location @app {
proxy_pass http://127.0.0.1:5001;
}
}
本来nginx本身就直接在80上try了, 后来发现想要加Cache-Control
的header必须得在应用层加, 在@location再次定义静态文件类型会使用到if, if在nginx中尽量不要使用为好, 所以就用了多一层代理来解决配置静态文件缓存策略了.
nginx在主机中的配置如下:
server {
listen 80;
server_name a.com;
keepalive_timeout 70;
location / {
proxy_pass http://127.0.0.1:5001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
可以看出vhost只在最外层的主机上配置, 而容器内部并不在意vhost的server_name. 这样容器用于交付将变得非常方便.
nginx在处理静态网站转动态网站用可以使用try, 这样可以快速满足业务需求, 也尽量减少出错可能性, 一旦完成一个动态路由就可以使用移动静态文件来开启路由.
另外docker配置确实不如直接开启服务方便, 但是确实在交付上的能力很强. 习惯之后就用docker做日常吧.