资讯专栏INFORMATION COLUMN

阿里云服务器部署 nodejs + mongodb + nginx 反向代理 + https配置 s

张春雷 / 2098人阅读

摘要:感谢老师,老师的慕课网教程购买阿里云服务器及域名终端连接阿里云服务器环境输入密码购买时的密码如果出现这个问题的解决方案解决方法查看硬盘挂在情况如果有数据盘的情况下查看硬盘使用情况通过设置快捷登录权限,可以增加几个拥有权限的用户下查

感谢 Scott 老师,Scott老师的慕课网教程 https://coding.imooc.com/clas...
1. 购买阿里云服务器及域名 2. 终端连接阿里云服务器(mac环境)

ssh root@39...* 输入密码(购买时的密码)

如果出现这个问题的解决方案:root@39.106.220*.*: Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

解决方法: https://blog.csdn.net/gigijin...

查看硬盘挂在情况:fdisk -l (如果有数据盘的情况下)

查看硬盘使用情况 df -h

通过zsh设置快捷登录 alias ssh_orange="ssh root@39.106.22*.*"

root 权限,可以增加几个拥有root权限的用户

https://www.cnblogs.com/wang3...

adduser [name]

Linux下 ssh 查看用户列表

复杂:cat /etc/passwd

简化:cat /etc/passwd|grep -v nologin|grep -v halt|grep -v shutdown|awk -F":" "{ print $1"|"$3"|"$4 }"|more

删除用户: userdel orange001 直接删除就好

给新用户 orange01 设置密码 passwd orange01 根据提示填写两次密码

给新用户升级权限 gpasswd -a orange001 sudo

(centos 环境)

配置用户权限:
修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:
## Allow root to run any commands anywhere
root    ALL=(ALL)     ALL
orange01   ALL=(ALL)     ALL
修改完毕,现在可以用 orange01 帐号登录,然后用命令 su -  ,即可获得root权限进行操作。
        :wq!  保存退出

重启ssh 乌班图上 srevice ssh restart centos7 命令:systemctl restart sshd.serviceservice sshd restart

ssh 实现无密码登录

 本地操作:
 本地生成 ssh key: ssh-keygen -t rsa -b 4096 -C "326242499.@qq.com"  同 git 操作一样
 开启 ssh 代理   eval "$(ssh-agent -s)"
 把ssh key 假如到代理中     ssh-add ~/.ssh/id_rsa  (在 .ssh 目录下执行这一操作)
 
 远程主机操作:
 再把上面本地操作的步骤重复一遍

 然后生成 authorized_keys 文件:         
 vi .ssh/authorized_keys
 然后将本地的公钥的内容 (~/.ssh/id_rsa.pub)  拷贝到远程主机的 authorized_keys 文件内
 
 授权 chmod 600 authorized_keys 
 重启远程主机 
 sudo service ssh restart(乌班图) 
 systemctl restart sshd.service 或  service sshd restart (centos7)

 做完这些步骤就可以ssh免密登录远程主机了

端口安全性

ssh 默认登录端口 22

在 root 账户下修改默认登录端口号

centos7 修改默认22端口 https://www.cnblogs.com/zhuzi8849/p/6254498.html

不知道为什么我修改完之后 ssh -p 3600 root@39.**.**.* 登录连接超时 (未设置成功)

配置安全项、防火墙(iptables) --- 未做

3. 搭建nodejs环境

更新:sudo yum update 或者 sudo yum upgrade (这个会报错)

安装: sudo yum install vim openssl build-essential libssl-dev wget curl git

安装:nvm wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

安装完之后 nvm --version 检查下是否安装成功 安装 node: nvm install v8.11.3

好像下面两步都不用做了 ,自动做好了

nvm use v8.10.0 nvm 指定使用的 node 的版本

nvm alias default v8.10.0 设置 node 默认使用版本

设置淘宝镜像 npm --registry=https://registry.npm.taobao.org install -g npm

配置 cnpm npm --registry=https://registry.npm.taobao.org install -g cnpm

cnpm sync koa 同步 npm 上的模块

增加系统文件监控数目 echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p (不知道是做什么)

全局安装 pm2 npm install -g pm2

开启一个静态站点

pm2 是一个 node.js 部署和进程管理工具,通过它可以实现 node.js 后台运行(不是向上边那样关闭命令行服务就没了)和出错自动重启

pm2 运维 node 服务本身

运行 pm2 start app.js 即可运行 node 服务

pm2 list 列出当前运行的 pm2-node 服务

pm2 show [App name|id] 查看详细信息

pm2 log app 查看实时日志

退出 log ctrl + c

出现的问题: 无法使用 80 端口以外的端口开启服务(会不会centos默认只对外暴露 80 端口)

4. nginx 实现反向代理
通过对80端口的监听,将80端口的流量转发到其他端口
让web通过 80 端口被外网访问
只有 root 权限的用户才能使用 80 端口
服务器有多个网站 可以通过 nginx 代理 80端口,转发给 特定的端口,实现负载均衡

删除自带的 阿帕奇服务,我的阿里云轻量服务器上好像并没有找到 httpd

安装 nginx下载好就行,不要再往下进行

进入 /etc/nginx/conf.d 目录下,然后创建配置文件

配置文件:一个服务一个配置文件microblog-yao-3002.conf 命名规则:域名 + 端口

# 考虑负载均衡策略
    upstream microblog {
        server 127.0.0.1:3002; // 本地node服务
    }

    server {
        listen 80;
        server_name code-sky.cn; // 域名

        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Nginx-Proxy true;

            proxy_pass http://microblog; // 把域名代理到应用上
            proxy_redirect off;
        }
    }

    检查 nginx/nginx.conf 配置文件 去掉 include 注释 
    include /etc/nginx/conf.d/*.conf;  这句在 nginx.conf 必须要在 http 里面 server 外面
    sudo nginx -t 检查 nginx 配置文件是否正确
    nginx 重启  sudo nginx -s reload
    隐藏 nginx 版本  nginx.conf   http  设置  server_tokens off;

nginx 对 css,js 静态资源的处理(可让浏览器缓存静态资源)

# 在多带带应用的nginx配置里,放在server里面同 location同级
# 对静态资源的处理
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|js|pdf|txt) {
    root /www/blog/production/current/admin/dist/;
}

# 开启gizp压缩
# new config lines for gzip
gzip on;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_http_version 1.1;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css;

nginx 转发配置(用 80端口代理,然后分发到不同的服务上)学习连接

5. 域名备案与DNS解析

一个域名只能指向一个 ip 地址,一个 ip地址可以被多个域名指向

域名记录:A记录 将一个域名指向到一个服务器的 ip地址

CNAME 将一个域名指向另一个域名

解析域名:阿里云域名控制台-云解析DNS-添加记录 根据提示设置域名及二级域名

6. 安装 mongoDB 数据库
在服务器上搭建 MongoDB数据库(一般情况下,数据应该与应用分开,自己学习就无所谓了)
homebrew 本地安装 MongoDB数据库

安装 homebrew

brew 安装本地mongoDB数据库 brew install mongodb brew安装MongoDB

启动mongodb服务:终端执行: brew services start mongodb

使用brew 默认下载地址为 /usr/local/Cellar/ 下的 mongodb文件夹。

To have launchd start mongodb now and restart at login:
brew services start mongodb
Or, if you don"t want/need a background service you can just run:
mongod --config /usr/local/etc/mongod.conf
服务器安装 MongoDB数据库(centos环境)

安装mongodb-1

安装mongodb-2

mongoDB操作

启动报错处理       mongod -repair

启动mongodb 
systemctl start mongod.service  or  
service mongod start

重启mongodb     
systemctl restart mongod.service   or     
service mongod restart

停止mongodb     
systemctl stop mongod.service       or      
service mongod stop

查看mongodb状态 systemctl status mongod.service

登录         mongo
查看数据库    show dbs

修改 mongodb 默认连接端口号

sudo vi /etc/mongod.conf
# port: 27017
# 将端口号修改为 19999
port: 19999
bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.
修改完端口   重启mongodb  sudo service mongod  restart

指定端口连接  指定端口连接 mongodb  mongo --port 19999
注意:如果设置了防火墙,要将防火墙更新

备份本地MongoDB数据库

mongodump -h 127.0.0.1:27017 -d test2 -o microblog

test2 数据库名称 microblog 备份文件夹名称

将备份文件scp上传至服务器

打包 tar zcvf microblog.tar.gz microblog

前面:打包后的文件名称 后面:打包前的文件夹

上传 scp -p 80 ./microblog.tar.gz root@39.106.220.6:/root/dbmicroblog

-p 服务器端口 本地tar包位置 服务器地址 服务器存放 tar 包的位置

对服务器上的 tar 包进行解压缩 tar -xzvf microblog.tar.gz

tar 命令:
压缩文件:tar -czvf test.tar.gz a.c    // 压缩 a.c 文件为 test.tar.gz
解压文件:tar -xzvf test.tar.gz a.c    // 解压 test.tar.gz 为 a.c

将这个 test2 数据库导入到线上刚刚配置完端口的数据库

mongorestore --host 127.0.0.1:19999 -d test2 ./test2

前面test2 线上数据库的名称

后面 ./ test2 线上备份数据库存储的位置

查看是否导入成功

mongo --port 19999
show dbs    查看数据库
use test2    进入test2数据库
show tables 查看test2数据库中的表
db.user.find({})    查看表中的数据 

导入到线上已有的数据库,导入一张或多张单表

本地导出单表
mongoexport -d immoc-movie -c users -q "{"name": {$ne: null}}" -o ./movie-users.json

-d immoc-movie   数据库名称
-c users 要导出的表
-q 可选  查询条件
-o 导出文件在本地存放的位置

将该单表 scp 上传到服务器

将该单表导入到 线上数据库 
mongoimport --host 127.0.0.1:19999 -d immoc-movie -c users ./movie-users.json

建议导入初始化数据时在配置数据库权限之前,不然输入的命令会麻烦很多,输入各种命令

删掉数据库 mongo --host 127.0.0.1:19999 immoc-movie --eval "db.dropDatabase()"

mongod 打开mongoDB 服务

mongo 打开 mongoDB客户端

brew services start mongodb

为数据库配置权限
为数据库设置用户权限
设置  添加mongoDB管理员

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

每次对不同数据库创建管理员都需要到 admin 去认证
对用户进行登录授权
use admin
db.auth("orange", "yao1024")

切换到 test2
use test2

创建读写权限用户
db.createUser({user: "microblog", pwd: "microblog", roles: [{role: "readWrite", db: "test2"}]})

创建备份角色
db.createUser({user: "wheel", pwd: "wheel", roles: [{role: "read", db: "test2"}]})
 

修改配置文件开启mongoDB验证模式
sudo vi /etc/mongod.conf

# security:  将 #去掉
authorization: "enable"  (两个空格)

重启 mongoDB 让配置生效
sudo service mongod restart

重新登录 mongo --port 19999
show dbs  就会报错

use admin
db.auth("orange", "yao1024") 

直接登录某个数据库
mongo 127.0.0.1:19999/test2 -u microblog -p microblog
数据库名  用户名  密码
向线上运行的数据库导入数据表
迁移数据库、迁移数据库的一张单表

先将 库或单表导出到服务器的某个目录里,然后 tar 打包
用 scp -P 80 root@xx.xx.xx:/root/db/microblog.tar.gz
然后再把这个包上传到另一台服务器上

线上生产数据库定时备份(上传到云平台)
7. 代码部署

pm2,git仓库 自动部署项目

创建一个新项目第一次时: pm2 deploy ecosystem.json production setup

接下来部署代码部署代码 pm2 deploy ecosystem.json production

pm2文档

1. 服务器安装 git,(和本地安装git一样,配置 rsa_pub 等文件,可以实现免密)
2. 本地代码上传到代码仓库
3. 服务器拉取代码仓库代码

4. 在项目根目录创建 pm2 自动部署文件  ecosystem.json,编辑部署文件内容

5. 在服务器根目录上新建 /www   目录,与 pm2 配置文件映射起来

6. 在本地执行  pm2 deploy ecosystem.json production setup  即可成功部署

7.  可能部署失败的原因:账号权限不够,服务器 www 文件不存在  部署的 user 用户必须要有创建文件夹的权限
    原理:通过本地 pm2 登录远程服务器,通知远程服务器从代码仓库拉取代码到部署目录

8. pm2 在服务器上使用的是 非交互 ssh 连接方式,需要注释 .bashec 文件内容  (我的centos 没找到那两句,所以什么也没做)

9. 将 代码仓库更新,确保 ecosystem.json 存在于 /www/production/current 目录里

10. 执行 pm2 deploy ecosystem.json production   部署成功,即发布成功

11. 修改 nginx 配置文件  创建3000端口的 conf      
    问题:如何开启两个端口共存,防火墙允许3000端口访问,还是申请个域名吧

12. 代码更新 pm2 deploy 的 HEAD 指向不了最新的提交,还是指向上次的提交
    解决方法:需要在 pm2 配置文件中多加一行配置
    "post-deploy": "git pull && npm install && pm2 startOrRestart ecosystem.json --env production",

13. 如果数据库设置了用户权限:代码里连接数据库要以

14.  如果没有域名,怎么在 nginx 配置映射二级域名,有 二级 ip地址之说吗? 不要搞了,还是备案域名吧
8. 配置HTTPS 协议

腾讯云申请免费 SSL 证书(亚洲诚信DV SSL证书)

SSL证书管理页面 -> 申请证书 -> 填入信息 -> 手动DNS 验证 -> 验证成功之后会得到一条记录包括(主机记录 记录类型(CNAME) 记录值)-> 在阿里云域名管理后台新添加一条记录(将刚才得到验证记录填写进去)-> 填写生效后,证书就颁发好了 参考链接

将下载好的 SSL 证书上(Nginx目录下)传到 服务器上 scp -p 80 ./admin.code-sky.cn/Nginx/2_admin.code-sky.cn.key root@39.106.220.6:/root scp -p 80 ./admin.code-sky.cn/Nginx/1_admin.code-sky.cn_bundle.crt root@39.106.220.6:/root

将上传好的文件放到 一个名为 ssl 的文件夹,然后将 ssl 文件夹移动到 /www 目录下

修改 nginx 配置文件

    upstream admin {
        server 127.0.0.1:3003;
    }

    server {
        listen 80;
        server_name admin.code-sky.cn;
        # rewrite ^(.*) https://$host$1 permanent;
        return 301 https://admin.code-sky.cn$request_uri;
    }

    server {
        listen 443;
        server_name admin.code-sky.cn; #填写绑定证书的域名
        ssl on;
        ssl_certificate /www/ssl/1_admin.code-sky.cn_bundle.crt;
        ssl_certificate_key /www/ssl/2_admin.code-sky.cn.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
        ssl_prefer_server_ciphers on;

        if ($ssl_protocol = "") {
        rewrite ^(.*) https://$host$1 permanent;
        }

        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Nginx-Proxy true;

            proxy_pass http://admin;
            proxy_redirect off;
        }
        location ~* ^.+.(jpg|jpeg|gif|png|ico|css|js|pdf|txt) {
            root /www/blog/production/current/admin/dist/;
        }

        # new config lines for gzip
        gzip on;
        gzip_min_length 1k;
        gzip_buffers 4 8k;
        gzip_http_version 1.1;
        gzip_types text/plain application/javascript application/x-javascript text/javascript text/css;
    }

检查 nginx 文件配置是否正确 sudo nginx -t

重启nginx sudo nginx -s reload 即完成 https 配置

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/19428.html

相关文章

  • 阿里务器部署 nodejs + mongodb + nginx 反向代理 + https配置 s

    摘要:感谢老师,老师的慕课网教程购买阿里云服务器及域名终端连接阿里云服务器环境输入密码购买时的密码如果出现这个问题的解决方案解决方法查看硬盘挂在情况如果有数据盘的情况下查看硬盘使用情况通过设置快捷登录权限,可以增加几个拥有权限的用户下查 感谢 Scott 老师,Scott老师的慕课网教程 https://coding.imooc.com/clas... 1. 购买阿里云服务器及域名 2. ...

    jerryloveemily 评论0 收藏0
  • 阿里务器之项目线上部署过程

    摘要:还有需要配置安全组,在阿里云控制台中进行配置,添加和端口,才能够访问到线上服务器。 在搭建web全栈的过程中,最令我头疼的就是项目的部署与上线,这个过程虽然简单,但是对于全栈菜鸟的我来说真的是个大坑,但是我还是去尝试,终于通过各种文档、请教与实践中完成了线上部署,在此做一下记录与总结 一、购买服务器 服务器选择:服务器的品牌有很多,如亚马逊、阿里云、腾讯等等,各大厂商之间的产品、服务...

    sevi_stuo 评论0 收藏0
  • NodeJS项目迁移兼Ubuntu下NodeJS环境部署

    摘要:前言之前做的几个项目都托管在阿里云服务器,但是最近要到期了。环境部署折腾了一天,其中也遇到几个坑。项目迁移历时一天,两台服务器的系统都是位。 前言 之前做的几个项目都托管在阿里云服务器,但是最近要到期了。想着到底要不要续期,毕竟100/月。后面看着阿里云有个活动,800/三年。果断买下。环境部署折腾了一天,其中也遇到几个坑。 目录 一、安装环境 1.1 安装NodeJS环境 ...

    jlanglang 评论0 收藏0
  • 务器小白的我,是如何成功将 node+mongodb 项目部署务器上并进行性能优化的

    摘要:前言本文讲解的是做为前端开发人员,对服务器的了解还是小白的我,是如何一步步将项目部署在阿里云的服务器上,并进行性能优化,达到页面秒内看到,秒内看到首屏内容的。搭建的项目是采用了主流的前后端分离思想的,这里只讲服务器环境搭建与性能优化。 showImg(https://segmentfault.com/img/remote/1460000017143281); 前言 本文讲解的是:做为前...

    zsy888 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<