本地项目开发完毕,如何部署到服务器却成了难题,如果不熟悉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 就成功上线啦!蛤蛤蛤蛤