最近用ghost又搭建了个博客(blog.tonlyshy.cn),想用这个写偏技术的内容,本站就偏生活一点。
期间试过‘全世界最好的语言’的WordPress以及typecho,接着又试了‘2016热门开源项目’的Grav,但是都太复杂了,配置上又有很多问题。ghost跟Spruche都是基于nodejs的,很轻量化。感觉Djiango和它有些类似。这样就有两个站点,穷学生没钱拿两个ECS来跑。渣渣博客又没有访问量。。负载很小,所以就想一个服务器多个站点(岂不是可以省掉备案?)。Google了一下,大致就是用Nginx或者Apache来代理了,顺便将站点全https化,从Nginx的配置,再到node后台管理,好多的坑。。
比如Nginx版本不同,配置文件存放的位置也不同,各种教程杂七杂八的,我用的Ubuntu 14.04 apt-get能安装的Nginx版本就只到1.6。
Nginx 1.6 配置文件地址:/etc/nginx/sites-available/default
Nginx多站点配置:
安装
sudo apt-get install nginx
apt-get安装的好处就是不用手动添加全局变量。。
修改配置文件
以我的为例:
blog.tonlyshy.cn使用ghost,后台地址是127.0.0.1:9802
www.tonlyshy.cn使用Spruche,后台地址是127.0.0.1:9801
所以一个服务器多站点其实就是根据不同url匹配不同端口号来实现的
修改server{}字段,Nginx根据server{}内的内容顺序匹配,可以有多个server{}
server{ listen 80; server_name blog.tonlyshy.cn; #绑定副站域名 return 301 #强制301跳转至https, 没有ssl请删除此行 location / { proxy_pass http://127.0.0.1:9802; #ghost监听的ip和端口号 proxy_set_header Host $http_host; # required for docker client's sake proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 900; } location /assets { proxy_pass http://127.0.0.1:9802; proxy_set_header Host $http_host; # required for docker client's sake proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 900; } } server{ listen 80; server_name www.tonlyshy.cn tonlyshy.cn; #绑定主站域名 return 301 #强制301跳转至https, 没有ssl请删除此行 location / { proxy_pass #Spruche监听的ip和端口号 proxy_set_header Host $http_host; # required for docker client's sake proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 900; } }
若想从tonlyshy.cn这样的域名强制跳转到www,请用:
return 301 http://www.tonlyshy.cn$request_uri;
配置完重启即可
sudo service nginx reload
重启完显示[OK]
若没有正常重启,可以用下面的命令检测配置的问题
sudo nginx -t
大部分时候都是拼写问题,确保Successful之后再重启即可。
启用HTTPS
首先你得有跟你域名匹配的ssl证书,我的是腾讯云提供的TrustAsia DV SSL CA - G5(1年)证书,腾讯云主机的童鞋可以在管理->SSL证书管理中免费申请:
将证书上传至服务器,比如/home/ssl/Nginx/
继续配置Nginx,添加443端口的server{},依然是两个站点各一个
server { listen 443 ssl; server_name blog.tonlyshy.cn; ssl_certificate /home/ssl/Nginx/*.crt; #填写证书地址(crt是CA认证后的证书文) ssl_certificate_key /home/ssl/Nginx/*.key; #填写私钥地址 location / { proxy_pass http://127.0.0.1:9802; proxy_set_header Host $http_host; # required for docker client's sake proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 900; } location /assets { proxy_pass http://127.0.0.1:9802; proxy_set_header Host $http_host; # required for docker client's sake proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 900; } } server { listen 443 ssl; server_name www.tonlyshy.cn; ssl_certificate /home/ssl/Nginx/* #填写证书地址(crt是CA认证后的证书文) ssl_certificate_key /home/ssl/Nginx/* #填写私钥地址 location / { proxy_pass proxy_set_header Host $http_host; # required for docker client's sake proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 900; } }
之后再重启Nginx服务即可,至此HTTPS化完成。
PM2后台管理
要将nodejs程序跑在后台,有几种方法:
1. npm run public 2. 使用forever守护nodejs进程 3. 使用pm2守护nodejs进程
安装forever/pm2
npm install -g forever npm install -g pm2
forever使用:
forever start ___ forever stopall #停止所有forever管理的后台node程序
pm2使用
pm2 start pm2 stop pm2 delete # 删除列表中的node程序 pm2 list #查看进程列表 pm2 monit #实时监控
至此单服务器多站点就顺利跑起来了!
常见错误:EACCES
大部分时候是没有权限引起的,比如node监听端口号小于1024时,权限可能就不够了,而pm2以及forever我还没有找到用root或者sudo使用的方法(都会报:command not found )。最好的解决方法就是换端口号,选择了大于1024的端口号,问题就解决了。