概念

应用正式运行的地方叫做生产环境。如果使用 node 开发了服务端应用,在生产环境上面需要支持运行 node 应用,要提供应用需要的数据仓库服务。应用的生产环境可以在一台服务器上搭建,也可以使用多台服务器共同创建,比如可以在一台服务器上安装配置 node,在另一台服务器上搭建数据仓库服务,还可以再找一台服务器提供反向代理服务,这些东西也可以同时在一台服务器上。

在服务器上安装 nodejs

在终端使用 root 用户登录服务器。

1
2
dnf search nodejs //在软件仓库搜索nodejs
dnf info nodejs //查看软件包的信息

安装更新版本的 node:

1
2
3
4
curl -sL https://rpm.nodesource.com/setup_12.x | bash -   //安装这个软件仓库
dnf search nodejs //再搜索一下
sudo dnf install nodejs -y //安装nodejs
npm config set registry https://registry.npm.taobao.org //配置npm为淘宝源

在服务器上安装 mysql

1
2
3
4
sudo dnf install mysql-server -y //安装mysql
sudo systemctl start mysqld //启动mysql
sudo systemctl status mysqld //查看运行状态
sudo systemctl enable mysqld // 设置开机自启动,只需执行一次

mysql 安全配置

1
mysql_secure_installation

会问几个问题:

  1. 是否要使用验证密码组件: y
  2. 三种验证密码组件使用哪个: 2,表示要使用最强的那个
  3. 请设置 root 用户密码:

如果要使用随机密码可以生成随机字符,新建终端标签

1
openssl rand -bsse64 32

将此密码作为登录密码,输入 y 确定,然后将它并保存到安全的地方。

  1. 是否要移除掉系统里的匿名用户:y
  2. 要不要禁止 root 用户远程登录:y
  3. 是否删除 test 数据仓库: y
  4. 是否现在重载权限:y

创建新用户与数据仓库

1
2
mysql -u root -p //登录到mysql系统
create user 'xb2_node_operator'@'%' identified by '123123'; // 创建xb2_node_operator用户,如果不限制用户只能在本机登录就加个%号,然后设置密码。密码可以用随机生成的字符

有了这个用户后再给它创建个数据仓库:

1
create database xb2_node;

设置新创建的用户可以去管理新创建的数据库:

1
2
grant all privileges on xb2_node.* to 'xb2_node_operator'@'%';  //将所有的权限分配给'xb2_node_operator'@'%'这个用户
exit //退出登录

查看服务器上的数据库

1
2
3
4
5
mysql -u root -p  //登录
use xb2_node; //打开这个数据仓库
show tables; //显示数据表
describe demo; //查看数据表结构
drop table demo; //删除demo这个数据表

nginx

nginx 是一种 web 服务器,比 node 更擅长接待请求。可以配置反向代理服务。

1
2
3
4
sudo dnf install nginx -y    //安装nginx
sudo systemctl enable nginx //设置自启动,每次重启服务器会自动启动nginx服务
sudo systemctl start nginx //启动nginx
sudo systemctl status nginx //查看nginx状态

nginx 配置文件

1
2
3
cd /etc/nginx  //nginx配置文件的目录
ls
cat nginx.conf //复制配置文件的内容,在vscode中打开,安装插件后可以高亮

选项解释:
user:用户 // linux 中对用户权限有非常严格的要求,当 nginx 要读取文件时,就要保证这个用户对文件拥有读取权限。nginx 在运行时会用到缓存,还有写入一些日志文件,就要保证这个用户对相应的目录和文件有相应的权限。
worker_processes:进程数量
error_log:错误日志的文件,运行时产生的错误都会记录在里面 使用:sudo tail /var/log/nginx/error.log 可以查看最近的错误日志。

http 区块:

log_format:设置日志格式,后面的 main 是给这个格式取的名字。
access_log:访问日志文件。
include:这个指令可以把一些文件的内容载入到这里,也可以自定义一些.conf 结尾的文件来进行自定义配置
default_type:默认的文件格式

server 区块

server 区块定义了一个 nginx 服务器
listen:监听端口 default_server 会把这个服务器设置为默认的服务器,只能有一个 default_server
server_name:设置服务器域名
root:服务器的根目录


配置一个 nginx 服务器

进入数据盘的目录,比如 mnt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cd /mnt
mkdir demo // 提示权限不够
sudo chown chenxunan:chenxunan /mnt //修改拥有权,拥有者和用户组为chenxunan
mkdir demo
cd demo
vi index.html //新建个index网页,按下小i编辑。输入<h1>haha</h1>,esc退出,:wq保存并退出
sudo vi /etc/nginx/conf.d/demo.conf //创建配置文件,这个目录的.conf文件都会被载入到nginx的主配置里面
//配置文件内容:输入完后esc,然后:wq
server{
listen 80;
server_name 此处设置自己的域名;
root /mnt/demo;
}

sudo nginx -t //测试nginx配置有没有问题
sudo systemctl reload nginx //重载nginx

docker 应用容器

把应用需要的运行环境,包括应用本身,可以制作成一个镜像,基于这个镜像可以创建并且运行一个容器,这样我们的应用就会运行起来了,也就不需要手工配置服务器,然后搭建运行环境了。你可以在任何支持 docker 的环境里面,使用一行命令,去启动应用。这就是 docker 这个东西做的事。


安装:

1
2
3
4
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo  //在centOS系统中安装docker可以先去安装一个软件仓库,ce表示社区版,还有个商业版
sudo dnf install docker-ce -y //如果提升依赖问题可以用 sudo dnf install docker-ce --nobest -y
sudo systemctl start docker //启动docker服务
sudo systemctl enable docker //设置开机自启动

https

想要使用这种更安全的协议传输数据,要在 web 服务器上配置使用 ssl 证书,这种证书是权威机构颁发的,有些是付费的,而且不便宜,但也有一些免费的。

用 Certbot 命令行工具申请 Let‘s Encrypt 签发的 ssl 证书
Certbot 为不同的平台提供各自的安装方法,可以去 Certbot 官网筛选出适合申请 ssl 证书的方法。
比如在 centOS8 中申请 nginx 这种 web 服务器的 ssl 证书,这里借助了 docker:

1
2
sudo systemctl stop nginx //怕端口冲突,先停掉
sudo docker run -it --rm --name certbot -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" -p 80:80 certbot/certbot certonly //运行一个容器 ,当停止后自动删除这个容器,certonly这个命令可以签发ssl证书

第一次运行会弹出一些问题:

  1. 选择验证方法:1
  2. 域名

申请成功后的文件会放在一个目录中,有提示的。找到这个文件可以:

1
sudo ls 目录位置

证书有效期
申请的证书有三个月的有效期,在证书到期前可以重新申请,或使用命令更新一下证书。


配置 nginx 服务器支持 https

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cd /etc/letsencrypt  //进入这个目录
sudo vi options-ssl-nginx.conf //创建这个配置文件,按一下小i进入编辑模式,百度nginx配置https的文件内容,粘贴进来,esc退出编辑,输入:wq,在配置服务器的时候会用到这个配置文件。
sudo openssl dhparam -out ssl-dhparam.pem 2048 // 生成这个文件
cd /etc/nginx
cd conf.d
ls
sudo vi demo.conf //配置nginx文件,这个demo就是上面创建的,将root改为return 301 https://$host$request_uri; 这个服务器会把使用http协议的访问重定向到https。下面再添加一个server区块。

server{
listen 443 ssl http2; //443是https默认使用的端口号
server_name 这里输入域名;

ssl_certificate 证书目录地址/fullchain.pem; //设置ssl证书
ssl_certificate_key 秘钥文件地址/privkey.pem //设置秘钥文件地址
include /etc/letsencrypt/options-ssl-nginx.conf; //载入这个配置文件
ssl_dhparam /etc/letsencrypt/ssl-dhparam.pem;

root /mnt/demo; //设置这个服务器的根目录,esc, :wq

sudo nginx -t //测试nginx的配置
sudo systemctl reload nginx //重载 如果没有启动就使用 sudo systemctl start nginx
}

给应用创建反向代理服务

把收到的请求再转给别人,nginx 配置个反向代理服务器,这个服务器会把收到的请求转给 nodejs 应用,应用处理后将结果交给反向代理,反向代理再把最终的结果发给客户端。在 conf.d 这个目录中

1
2
3
4
sudo mv demo.conf demo.bak  //让demo.conf这个文件不生效
sudo vi 文件名 //创建反向代理配置文件,进入编辑模式,百度找到反向代理配置,粘贴进来,根据实际情况进行修改,比如ssl证书还有秘钥文件的位置还有server_name之类的东西。esc, :wq
sudo nginx -t //测试配置文件
sudo systemctl reload nginx //重载

用 PM2 管理运行 node 应用

在服务器如果直接用 node 命令运行应用,关掉终端的时候这个应用也会停止运行,所以需要一种方法在后台运行应用。PM2 就是一种关门管理 node 应用的进程管理器,可以帮我们在后台去运行 node 应用,应用如果意外停止它就会自动启动应用。

1
2
3
4
5
6
7
sudo npm install pm2 --global  //全局安装pm2
cd /mnt
mkdir node-app //创建目录
cd node-app
npm init -y
npm install express
vi index.js //

进入编辑模式,输入

1
2
3
4
5
6
7
8
9
10
const express = require('express');
const app = express();

app.get('/',(request,response)=>{
response.send('node应用');
});

app.listen(3000);
esc
:wq

现在可以使用 pm2 运行刚才创建的 node 应用

1
pm2 start index.js --name node-app