欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

个人博客项目部署的过程和遇到的坑

程序员文章站 2022-07-10 08:07:17
...

个人博客项目部署的过程和遇到的坑

首先插一嘴,我的个人博客项目使用的技术栈是:

  • 前端
    • React.js
    • Next.js
  • 后端
    • egg.js
    • mysql 数据库

该项目会放在我的GitHub上面。

1. 阿里云服务器

1.1 购置阿里云服务器

想要部署自己的博客,那么首先,必须购置一台属于自己的服务区,这里感谢阿里爸爸在疫情期间送给广大苦逼大学狗的半年的服务器(现在活动应该结束了,后续还可以续半年,但是怎么续我并不知道)。阿里云服务器的购买我就不给大家做示范了,网上有详细教程的,只要挑选符合自己配置要求的服务器,买买买就行了。这里我选择的操作系统是 CentOS7,如果有的小伙伴不太喜欢小黑窗操作的话,可以选择 windows server。

1.2 购置域名

想要被人看到你的博客,总不能让别人记住你的 ip 地址吧,所以我们需要购置阿里云的域名。打开 https://wanwang.aliyun.com/ 这个网址,在里面输入自己的域名的关键字,选择合适的*域名就可以了,这里我选择是 www.beginnerqian.cn(比较便宜的域名比如 .top .xyz 等,像 .com 和 .cn 等老牌的*域名比较贵)。

购买域名之后需要在阿里云域名控制台中填入信息模板,否则,该域名无法使用。

1.3 网站的备案

这里推荐直接使用阿里云的手机APP,在搜索框中搜索备案,比网站上的备案更加简洁明了。备完案之后,会有阿里云的工作人员过来核实确认。这里需要提醒一点,中国的服务器不经过备案是无法建站的,如果想要不备案建站,请购置阿里云海外或者香港的服务器。一般而言,1天的时间,备案审核足以。

1.4 绑定域名

打开阿里云域名控制台,找到域名列表,在操作中选择解析-添加记录,将自己的云服务器的 ip 地址填入即可。

1.5 开放端口

阿里云的服务器,如果小伙伴想要开放端口用来供外界访问,除了需要在CentOS中开放端口外(这个等会儿说),还需要在阿里云控制台的安全组中开放服务器的端口。下面是开放端口的步骤:

打开阿里云控制台,选择左侧菜单栏中的网络与安全-安全组:

个人博客项目部署的过程和遇到的坑

打开后选择对应的服务器并配置规则(注意小伙伴你们的云服务器所在的地址-在左上角阿里云图标的旁边)

个人博客项目部署的过程和遇到的坑

打开之后,即可配置自己想要的规则,其中几条规则是阿里云系统自动帮我们配置的,不动即可。点击左上角的添加安全组规则,选择开放的端口号,以及授权对象。如果想要所有的人都可以访问到这个端口号,设置成0.0.0.0/0 即可:

个人博客项目部署的过程和遇到的坑

在控制台中开放端口后,我们需要进入服务器开放CentOS防火墙的端口,首先提一点,阿里云的轻量级CES服务器的防火墙都是默认关闭的,这里交由各位小伙伴进行考量,我是打开防火墙的。我使用的是阿里云自带的ssh控制台连接的服务器。在连接之前,需要重置一下服务器的密码。进入实例列表:

个人博客项目部署的过程和遇到的坑

点击实例列表中实例的管理,选择更多,重置实例列表密码。

个人博客项目部署的过程和遇到的坑

重置密码即可,然后选择远程连接,输入密码和用户(一般是root),即可连接CentOs(小黑窗操作各位怕不怕):

个人博客项目部署的过程和遇到的坑

进入终端界面,首先使用 systemctl status firewalld 确认防火墙的状态:

个人博客项目部署的过程和遇到的坑

running,说明开启,stop,说明停止(我这里当然是开启的啦!)。如果停止,那么建议使用 systemctl start firewalld 开启防火墙并使用操作 systemctl enable firewalld.service 设置开机启动防火墙。开启防火墙之后,使用指令:

firewall-cmd --zone=public --add-port=3006/tcp --permanent 开启端口即可,需要注意的是,这时候需要使用 firewall-cmd --reload 重新加载防火墙,才能生效。当然,可以使用 firewall-cmd --list-ports 来查看自己开放的端口,与此同时,可以使用 firewall-cmd --remove-port=3006/tcp --permanent 关闭已经开放的端口,这个时候,还需要重启。(如果成功,终端会显示 success 说明操作成功)

端口开放完成,即可将自己的博客的前后端部署在服务器上了!

2. 后端部署

2.1 安装 node

我的后端使用的是阿里爸爸的 egg.js,也就是说,我使用的是 node,那么,首先,我们得先部署一下我们的环境。

去 node.js 的官网找到合适的 node 版本,这里我用的是 node-12.16.1(更新得真快!),这里直接贴出下载的网址:https://npm.taobao.org/mirrors/node/v12.16.1/node-v12.16.1.tar.gz。

然后在终端中使用 wget 命令,下载这个node.js:

wget https://npm.taobao.org/mirrors/node/v12.16.1/node-v12.16.1.tar.gz

它会下载在你终端进入的当前目录里面,所以,先 cd 进一个好地方。

然后,由于使用的是 tar.gz 格式的压缩包,我们使用

tar zxvf /usr/local/node-v12.16.1 -C /usr/local/node

将其解压到 /usr/local/node 下。然后,我们需要一些软件包来支持 node 源码的编译,打开终端,下载 gcc 和 gcc++

yum install gcc gcc-c++

下载好 gcc 和 gcc-c++后,(这里需要注意,如果我记得没错的话,编译该版本 node 需要 gcc7.5 及以上,如果 yum 下来的版本不够,需要手动编译安装对应或者更高版本的 gcc,网上有,这里不做演示,实际上是忘记当时我怎么升级的了)进入到解压好的文件夹中,使用

..configure 命令进行配置,

然后使用

make 命令进行编译(等吧,小伙子!)

编译完成之后,使用

make install 进行安装(等吧,小伙子!)

安装完成之后,使用 node --version 查看版本来确认是否安装成功。

2.2 安装 mysql8.x

安装完 node 之后,我们需要去安装 mysql,mysql的安装需要去 msyql 官网下载,我下载的是 8。

这里给出网址:https://dev.mysql.com/downloads/repo/yum/,具体的需要根据自己的系统的版本进行选择,这里给出的都是 CentOs 的。

使用 wget 指令下载对应系统版本的 mysql,比如 CentOS 8:

wget https://dev.mysql.com/downloads/file/?id=489467

然后就可以直接使用 yum 安装了

yum -y intall mysql80-community-release-el8-1.noarch.rpm

这步可能会花些时间,安装完成之后会覆盖掉之前的 mariadb。

在安装的过程中,应该会给出密码,但是没有记住,没有关系,我们可以通过以下命令:

grep "password" /var/log/mysqld.log

mysql 的日志中找到密码

然后登入数据库,使用一下命令修改密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';

可能会出现

Error 1819:Your password does not satisfy the current policy requirements 这样的错误。原因是因为 Mysql 有密码保护设置,我们可以将 validate_password_policy 设置成 low:

set global validate_password_policy=0

这里还有一个问题,一些后端框架,可能在设置正确的用户名和密码的情况也不能进入数据库,会报出:

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

这是由于 mysql8 使用了新型的密码模式,叫做强密码模式,我们可以通过指令

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newrootpassword';

来设置成 mysql5 的密码验证模式。

到此为止,mysql8 便安装完成。

2.3 Nginx 的安装

首先,去Nginx的官网上下载最新的稳定版本,这里给我下载的版本的地址:

http://nginx.org/download/nginx-1.16.1.tar.gz

使用 wget 命令进行下载:

wget http://nginx.org/download/nginx-1.16.1.tar.gz

下载会下载在当前目录,所以 cd 到一个合适的目录中哦。

然后进行解压

tar zxvf /usr/local/nginx-1.16.1.tar.gz -C /usr/local/

这里会解压到 /usr/local/nginx-1.16.1.tar.gz

然后,需要安装相关的依赖包,之前安装 node 已经安装过 gcc -c++了,这里就再列出来

yum install gcc -c++

yum install -y pcre pcre-devel

yum install -y zlib zlib-devel

yum install -y openssl openssl-devel

接着,cd 进解压的包,进行自定义配置

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

这里的 --with-http_ssl_module 是开启 ssl 模块。还可以添加 nginx 的压缩模块,不过我没有配置,有兴趣的可以去看看 nginx 的文档。

然后使用

make 进行编译(这个没有多长时间)

make install 安装

安装完成,进入 nginx/sbin 使用命令

./nginx -V 查看已配置的参数。

这样,后端的环境,大致算是配置完成了。

3. 前端环境的部署

前端环境其实安装完 nodenginx 就已经没有很多需要安装的了,这里我习惯使用 yarn,同时由于我们前端页面使用的是 React.jsSSR(服务器端渲染)框架的 Next.js。我们需要安装 pm2Next.js 进程作为守护进程。

3.1 安装 yarn

首先,添加 yarn 源:

curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo

然后使用

yum install yarn

3.2 安装 pm2

yarn global add pm2

到此前端环境部署完成

4. ftp 的安装与配置

4.1 安装 vsftpd

首先,去阿里云控制台开放 21 端口,然后在终端中,使用命令

firewall-cmd --zone=public --add-port=21 --permanent 开放 21 端口

然后,安装 vsftpd

yum istall -y vsftpd

设置成开机启动

systemctl enable vsftpd.service

启动

systemctl start vsftpd.service

4.2 配置

#打开配置文件
vim /etc/vsftpd/vsftpd.conf

#显示行号
:set number

#修改配置 12 行
anonymous_enable=NO

#修改配置 33 行
anon_mkdir_write_enable=YES

#修改配置48行
chown_uploads=YES

#修改配置72行
async_abor_enable=YES

#修改配置82行
ascii_upload_enable=YES

#修改配置83行
ascii_download_enable=YES

#修改配置86行
ftpd_banner=Welcome to blah FTP service.#修改配置100行chroot_local_user=YES

#添加下列内容到vsftpd.conf末尾
use_localtime=YES
listen_port=21
idle_session_timeout=300
guest_enable=YES
guest_username=vsftpd
user_config_dir=/etc/vsftpd/vconf
data_connection_timeout=1
virtual_use_local_privs=YES
pasv_min_port=40000
pasv_max_port=40010
accept_timeout=5
connect_timeout=1allow_writeable_chroot=YES

4.3 新增用户

adduser username;
passwd password

新建用户只有在 /home/ 文件夹下有权限。由于只是上传文件,所以这里就不添加更多的新权限了。

4.4 修改 /etc/pam.d/vsftpd 文件

# 修改前先备份 

cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak

vi /etc/pam.d/vsftpd
#先将配置文件中原有的 auth 及 account 的所有配置行均注释掉
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers 
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers 

# 如果系统为32位,上面改为lib

4.5 重启 vsftpd 服务器

systemctl restart vsftpd.service

4.6 关闭 SELINUX

阿里云的轻量级ESC其实是默认关闭的(和防火墙一样)

#打开SELINUX配置文件
vim /etc/selinux/config


#修改配置参数
#注释  
SELINUX=enforcing

#增加  
SELINUX=disabled


#修改完成后,需要重启!

5. 部署 React.js 项目

5.1 打包 React.js 项目

在部署项目之前,需要将你的 React 项目中的所有的 api 接口换成你阿里云服务器上的接口,比如阿里云服务器后端的接口是:

www.jdlsaifjefadls/api

那么你就需要改成这个。

然后,确认你的 React 项目的主页,在 package.json 中,写入

homepage:"www.xxx.cn"

来确认你的主页。否则,很可能出现打开之后是一片空白的情况。

在 windows 上打开命令控制行,进入 React.js 项目的目录,使用

yarn build 或者 npm run build

进行打包

把打包好 build 文件夹通过 ftp 工具上传至阿里云服务器。然后使用

tar zxvf 目标文件 -C 解压到

命令解压到 nginx/html 文件夹下即可。

5.2 nginx 服务器的设置

这里,如果想要直接输入域名 + uri 即可访问页面的话,我们需要使用 nginx 的代理端口的功能。当然,首先是将我们的 React 项目进行配置:

http {
	server {
		listen 3006;
		server_name localhost;
		location /management {
			root html;
			try_file $uri /management/index.html;
		}
	}
}

这里监听 3006 端口,将这个端口作为 React 项目部署的端口,其中 location 后面跟着的 /management 便是需要在 react 项目 package.json 中配置的主页。

这里的 try_file 的含义是尝试寻找文件,去尝试到网站目录读取用户访问的文件,如果第一个变量存在,就直接返回;不存在继续读取第二个变量,如果存在,直接返回;不存在直接跳转到第三个参数上。

我这里所配置的意思是,寻找 $uri 这个文件,如果找不到 $uri 这个文件,那么发起一个内部“子请求”,也就是相当于 nginx 发起一个 HTTP 请求到 http://localhost/management/index.html。所以,我们 react 项目的主页,必须是 /management。

为了使直接输入 www.域名/management.cn 可以直接看到 react 项目,我们需要监听 80 端口,将 3006 端口进行代理。

server {
	listen 80;
	server_name 你所购买的域名;
	location /management {
		proxy_pass http://127.0.0.1:3006;
	}
}

这样,输入 www.域名/managemt 便可以看到我们的react项目了。

6. 为 nginx 的配置

6.1 配置 ssl,打开 https

这里推荐直接去阿里云上面获取个人免费版本的ssl证书,因为这份证书由 ca 保证。一般是 1 年份的。

然后,去控制台中下载

个人博客项目部署的过程和遇到的坑

个人博客项目部署的过程和遇到的坑

下载完成之后,将文件使用ftp工具上传到阿里云服务器上。

然后解压值 /cert 文件夹下,

然后对其进行配置,由于之前我已经打开 nginx 了 ssl 功能,所以按一下进行配置:

server {
        listen 443 ssl;
        listen 80;
        server_name www.beginnerqian.cn;
        ssl_certificate 名字.pem; # 这是下载的文件里面的.pem
        ssl_certificate_key 名字.key; # 这是 .key 文件
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 使用的加密
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 使用的协议
        ssl_prefer_server_ciphers on;
    }

这里开启ssl需要监听 443 端口,默认。为了在打开 ssl 时可以直接通过 80 端口进行访问,这里我同时监听 80 端口。因为之前使用这样的配置:

server {
        listen       80;
        server_name  www.beginnerqian.cn;
        return 301 https://www.beginnerqian.cn$request_uri;

        charset koi8-r;

        access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://127.0.0.1:3000;
        }

        location /img {
            alias /usr/local/react_blog/service;
            autoindex on;
        }

        location /management {
           proxy_pass http://127.0.0.1:3006;
        }
  	}

导致进行访问时会出现 404,如果有知晓的同志劳烦告诉我一下。

这样 ssl 证书便已经配置完成。

6.2 配置图片路径

在 server 中直接使用 location 进行配置

location /img {
    alias /usr/local/react_blog/service;
    autoindex on;
}

这里提一嘴 alias 和 root 的区别。

如果使用 root,

location /request_path/img {
	root /local_path/img ;
}

在客户端请求 /request_path/img/cat.jpg 时,nginx 会把请求映射为

/loca_path/img/request_path/img/cat/jpg

如果使用 alias,nginx 会把请求映射为

/local_path/img/cat.jpg

7. 部分 CentOS 指令参考

7.1 防火墙指令

查看已开放端口

firewall-cmd --list-port


开放端口

firewall-cmd --permanent --zone=public --add-port=端口号/tcp

指令含义

zone #作用域

add-port=端口号/tcp #添加端口,格式为:端口/通讯协议

permanent #永久生效,没有此参数重启后失效

例子

firewall-cmd --permanent --zone=public --add-port=3306/tcp


批量开放端口

firewall-cmd --permanent --zone=public --add-port=端口号-端口号/tcp


关闭端口

firewall-cmd --permanent --remove-port=端口号/tcp


批量关闭

irewall-cmd --permanent --remove-port=8300-8399/tcp


防火墙启动

systemctl start firewalld.service


防火墙重启

firewalld-cmd --reload


防火墙关闭

systemctl stop firewalld.service

7.2 解压命令

tar.gz

tar zxvf /路径/文件名.tar.gz -C /目标文件夹/

7.3 重命名

mv /文件夹/原名称 /文件夹/目标名称

相关标签: Linux