[node]:Nginx配置多站点+https & 使用pm2管理后台node进程

来源于我的博客

最近用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

chrome的小绿锁多好看

首先你得有跟你域名匹配的ssl证书,我的是腾讯云提供的TrustAsia DV SSL CA - G5(1年)证书,腾讯云主机的童鞋可以在管理->SSL证书管理中免费申请:

[node]:Nginx配置多站点+https & 使用pm2管理后台node进程_第1张图片


将证书上传至服务器,比如/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 #实时监控


[node]:Nginx配置多站点+https & 使用pm2管理后台node进程_第2张图片

至此单服务器多站点就顺利跑起来了!


常见错误:EACCES


大部分时候是没有权限引起的,比如node监听端口号小于1024时,权限可能就不够了,而pm2以及forever我还没有找到用root或者sudo使用的方法(都会报:command not found )。最好的解决方法就是换端口号,选择了大于1024的端口号,问题就解决了。

你可能感兴趣的:([node]:Nginx配置多站点+https & 使用pm2管理后台node进程)