静态网站转半动态网站的经验

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做日常吧.


Category: none

Tags: nginx docker