本地项目开发完毕,如何部署到服务器却成了难题,如果不熟悉Linux那简直是遭罪

做个搭建记录,万一以后又用上了呢

这一切都建立在已经有域名并且已经解析到服务器的前提下

拷贝文件到服务器

本地写完nodejs过后,将这些后台代码和网页静态文件一并拷贝到服务器

可以使用scp、ftp、rsync等。 感觉还是rsync最方便

rsync -av --exclude 'node_modules' 本地文件 root@服务器地址:远程主机文件夹
如:
rsync -av --exclude 'node_modules' ~/blog/ root@xxx:/var/www/blog/

服务器安装mongodb并导入mongodb数据

安装mongodb

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-debian/

我用的是debian8, 所以采用的是debian8 的安装方式

依次执行下面代码就行了

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
echo "deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/3.4 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
sudo apt update
sudo apt-get install -y mongodb-org

为mongodb启用验证

创建用户

1.首先使用mongo命令进入mongodb,然后创建一个admin 用户

use admin
db.createUser({
    user: "admin",
    pwd: "password",
    roles[{
        role: "userAdminAnyDatabase",
        db: "admin"
    }]
})

2.检查创建是否生效, 如果结果是1, 则表示创建的用户能被授权成功

db.auth("admin", "password")

然后使用exit退出

3.开启授权

sudo vi /etc/mongod.conf

将security一行取消注释,并在下方添加上authorization: enable

security:
    authorization: enabled

4.重启并检查重启是否成功

[sudo] service mongod restart
[sudo] service mongod status

5.使用创建好的admin用户登录并创建新用户给blog数据库

use admin
db.auth("admin", "adminpassword")
use blog
db.createUser({ user: "blogAdmin", pwd: "xxx", roles: [{ role: "readWrite", db: "blog" }] }
db.auth("blogAdmin", "xxx")

nodejs中使用的连接方式 mongodb://youruser:yourpassword@localhost/yourdatabase

导入导出mongodb数据

本地开发完毕后,需要将mongodb数据导出,然后将数据拷贝到服务器

本地导出, 在终端输入命令([]表示可省略)

mongodump [-h IP --port 端口] -u 用户名 -p 密码 -d 数据库 -o 导出文件路径

将导出的文件夹使用rsync一并拷贝到服务器, 然后导入。 注意导入的数据库是服务器创建的某个数据库名字,不一定要和本地开发时用的数据库名字一样;导入数据时一定要先创建好数据库

mongorestore [-h IP --port 端口] -u 用户名 -p 密码 -d 数据库 --drop 导入文件路径

服务器安装nginx 对Node.js进行端口映射

通常时候一个服务器会跑很多Node.js程序,监听的端口一般都不是80,而是8888, 9999什么的,毕竟80端口只有一个,不可能随便给的。然而客户端访问网页的时候通常都是使用80或者443端口。这时候就需要端口nginx 搭配 Node.js做端口映射了

1.安装

[sudo] apt install nginx

2.编辑配置文件,向http里面添加如下配置

server {
    listen 80;
    server_name blog.linyqiang.com;
    rewrite ^(.*)$  https://$host$1 permanent;
}
server {
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/blog.linyqiang.com/fullchain.pem; # 使用letsencrypt生成的crt
    ssl_certificate_key /etc/letsencrypt/live/blog.linyqiang.com/privkey.pem; # 生成的key
    server_name blog.linyqiang.com; # 域名
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_protocols SSLv3 TLSv1;
    location / {
		proxy_pass https://127.0.0.1:8889; # Node.js服务器地址及端口
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Host $host;
		proxy_set_header X-Forward-Proto https;
		proxy_http_version 1.1;
    # for websocket
    proxy_set_header Upgrade $http_upgrade;
	    proxy_set_header Connection "upgrade";
    }
}

然后在服务端启动程序

cd /var/www/blog
pm2 start app.js --max-memory-restart 100M

这时候就可以通过服务器ip + Node.js监听port方式访问了,比如浏览器输入 http://123.123.123.123:8888

使用Let’s Encrypt 证书

毕竟小绿锁看起来还是很舒服的

可以使用certbot快速生成证书。如果觉得命令行操作起来麻烦, 可以使用一个在线网站sslforfree在线申请

使用方式:

certbot certonly --webroot -w /var/www/blog/public -d blog.linyqiang.com

注意这里-w 一定要深入到public, 因为我blog放的是整个Node.js程序, 而静态文件是在public下

证书生成完毕后会在/etc/letsencrypt/live/blog.linyqiang.com/下面生成相应的文件。将nginx的ssl_certificate和ssl_certificate_key配置好, 然后nginx -s reload就行了

letsencrypt 会访问host/.well-known/acme-challenge 来检测该域名的有效性。如果出现访问错误,开一在Node.js程序中加入相应的路由

cd /var/www/blog
vi app.js

向路由中添加一下代码即可

app.get('/.well-known/acme-challenge/:ids',function(req,res,next){
  require('fs').readFile(__dirname + '/public/.well-known/acme-challenge/'+req.params.ids,function(err,data){
    err&&console.log(err);
    res.send(data);
  });
});

最后

pm2 restart app.js

然后https://blog.linyqiang.com 就成功上线啦!蛤蛤蛤蛤