感谢 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.service
或service 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 上的模块
- 配置 cnpm
- 增加系统文件监控数目
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
-
- 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 配置