云服务器购买

云服务器购买

这部分参考博客: 记录第一次Vue项目部署到阿里云Linux服务器上线的艰难历程

借此文章记录一下自己的踩坑问题。

域名申请

域名申请

参考博客: 如何申请域名、购买证书并在Nginx服务器上实现HTTPS?

域名在阿里上买的,xyz后缀域名,首年6块钱(挺便宜)
之后需要走实名认证,很快,
但比较坑的是阿里实名认证完还得入库工信部系统,这得花2-3天的时间,
如果工信部系统没有入库域名,域名网站就无法备案,

没有备案的网站在网上挂一段时间就会被限制:

有了域名之后就可以将域名和解析记录联系在一起,通过域名直接访问到指定ip地址:

Nginx

Nginx基础配置

nginx配置

配置Nginx大多数时候都是以下2个步骤:

  • 配置nginx.conf文档
1
vim /etc/nginx/nginx.conf
  • 重启nginx
1
systemctl restart nginx

其他命令用的比较多的也就是下面这些:

  • 启动nginx
1
systemctl start nginx
  • 结束nginx
1
systemctl end nginx
  • 查看所有开启的nginx服务进程
1
ps -ef | grep nginx
  • 杀死所有nginx进程
1
killall nginx
  • 检查nginx.conf配置文件是否有语法错误
1
nginx -t

配置文件 nginx.conf

这里我在80/8091/8092三个端口上配了服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Home
server {
listen 80;
listen [::]:80;
server_name www.e-duck.xyz;
location /{
root /var/myapp/home/dist/;
index index.html;
try_files $uri $uri/ /index.html;
}
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

# ThreeJs
server {
listen 8091;
server_name www.e-duck.xyz;

location /{
root /var/myapp/three/dist/;
index index.html;
try_files $uri $uri/ /index.html;
}
}
# Lottery
server {
listen 8092;
server_name www.e-duck.xyz;

location /{
root /var/myapp/lottery/dist/;
index index.html;
try_files $uri $uri/ /index.html;
}
}

就是非常普通的配置,但是实际上,一开始我觉得后面的端口号不好看,
想用路由映射的方式映射到不同的服务上,
似乎用proxy_pass或者alias都能实现,

proxy_pass配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 80;
server_name www.e-duck.xyz;
location /{
root /var/myapp/home/dist/;
index index.html;
try_files $uri $uri/ /index.html;
}
location /lottery/{
proxy_pass: www.e-duck.xyz:8091;
}
}
server {
listen 8091;
server_name www.e-duck.xyz;

location /{
root /var/myapp/three/dist/;
index index.html;
try_files $uri $uri/ /index.html;
}
}

alias配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
server_name www.e-duck.xyz;
location /{
root /var/myapp/home/dist/;
index index.html;
try_files $uri $uri/ /index.html;
}
location /lottery/{
root /var/myapp/three/dist/;
index index.html;
try_files $uri $uri/ /index.html;
}
}

但是实际这样配置的时候却发现,静态文件无法加载出来,
打开网页控制台报错:

1
Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "text/html". Strict MIME type checking is enforced for module scripts per HTML spec.

这个问题我找了很久的解决方案,反正现在还是没有解决,
所以干脆就恢复了端口的写法。

Nginx搭建静态资源服务器

参考博客

添加虚拟主机时,将root映射到本机存储资源的目录下,
开启浏览目录权限:

1
2
3
4
5
6
7
8
server{
listen 8008;
server_name localhost;
location / {
root /root/pic_lib;
autoindex on;
}
}

Nginx代理二级域名

申请二级域名

申请二级域名(阿里)
申请二级域名(阿里)

在【阿里控制台/云解析DNS/域名解析/解析设置】中,添加记录,新增二级域名

在弹出的【添加记录】表单中,填写基础信息:

  • 记录类型:选择A- 指向IPV4类型
  • 主机记录:填写二级域名的前缀
  • 记录值:填写域名代理的IPV4地址
  • TTL:DNS域名解析的记过在LocalDNS的生存时间

给二级域名申请证书

一级域名在使用url访问时,实际上也默认加上了www前缀,
申请方式参考下面【SSL配置】部分

顶级域名和二级域名

  • 顶级域名(TLD):xxx.com
    • 不带www
    • 直接以定义域名结尾的网址
    • 注册和管理由国际互联网名称与数字地址分配机构负责
  • 二级域名:www.xxx.com
    • 依附于一级域名
    • 在一级域名前加上一个特定前缀
    • 由各个国家和地区的注册服务商和机构负责

配置Nginx代理

参考配置:

注意点:

  • 在listen的端口后加上http2表示开启http2传输
  • 在80端口处进行拦截重定向
  • 主域名和二级域名的关键在于server_name的设置

e-duck.xyz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
############## 主域名站点 ##################
server {
listen 80;
server_name e-duck.xyz;
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
listen 443 ssl http2;
#域名
server_name e-duck.xyz;
#ssl证书的pem文件路径
ssl_certificate /etc/nginx/cert.pem;
#ssl证书的key文件路径
ssl_certificate_key /etc/nginx/key.pem;
location /{
root /var/myapp/home/dist/;
index index.html;
}
error_page 404 /404.html;
location = /404.html{
}
error_page 500 502 503 504 /50x.html;
location = /50x.html{
}
}

next-lab.e-duck.xyz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
################ Next-Three-Lab ################
server {
listen 443 ssl http2;
# 关键部分:设置服务器域名
server_name next-lab.e-duck.xyz;
#ssl证书的pem文件路径
ssl_certificate /home/key_cert/next_lab_e_duck_xyz/cert.pem;
#ssl证书的key文件路径
ssl_certificate_key /home/key_cert/next_lab_e_duck_xyz/key.pem;

ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;

# 使用的加密套件
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
# 使用的TLS协议类型,自行评估是否配置TLSv1.1协议
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

location /{
root /var/myapp/next_react_lab/out/;
index index.html;
}
}
server {
listen 80;
server_name next-lab.e-duck.xyz;
return 301 https://$host$request_uri;
}

端口配置

端口配置

参考博客: 阿里云服务器开放端口的正确方式

需要外界访问的端口服务需要再云服务器中进行开放,
这个可以在阿里云服务器上配置,
也可以通过命令行配置:

  • 开放指定端口
1
firewall-cmd --zone=public --add-port=80/tcp --permanent
  • 重启防火墙
1
systemctl restart firewalld.service

Tomcat

浅配一下

  • 操作系统 CentOS 7.9 64位
  • Java 1.7.0
  • tomcat 8.5.99

配置Java

参考博客: CentOS 7 安装和配置java环境 | tomcat启动“成功”,但是浏览器无法访问

需要注意的是TomCat的版本和Java的版本一定要匹配
否则tomcat运行不起来,
我是报缺包错误:

1
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/catalina/startup/Bootstrap 

检测Tomcat是否开启的方式:

1
ps -ef | grep tomcat

SSL配置

流程简述

  1. 配置ACME
  2. 使用ACME安装证书
  3. nginx配置ssl服务

配置ACME

参考内容:

acme.sh的安装

安装acme.ch,顺便注册邮箱

1
curl https://get.acme.sh | sh -s email=my@example.com

安装到root目录下:

1
~/.acme.sh/

在root目录下创建一个.bashrc:

1
vim .bashrc

在bash中配置一个shell的alias:

1
alias acme.sh=~/.acme.sh/acme.sh

这样使用acme.sh命令更加方便:

1
acme.sh -h

安装证书

使用acme.sh安装证书

一共有2种生成证书的方式:

  • http
  • dns

这里使用的是http方式生成证书

需要将ca服务器修改为letsencrypt,默认是zerossl:

1
acme.sh --set-default-ca --server letsencrypt

指定域名和网站根目录,就可以生成证书了:

1
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/

指定证书的安装位置:

Apache

1
2
3
4
5
acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"

Nginx

1
2
3
4
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"

检查已安装证书信息:

1
acme.sh --info -d example.com

Nginx配置Https

参考博客

检查nginx是否存在ssl模块:

1
2
cd /usr/sbin
./nginx -V

如果configure arguments存在–with-https_ssl_module,说明存在ssl模块,
可以直接进行配置
注意要检查服务器的443端口是否开放

配置模版
配置模版
将80端口重定向到443端口
将80端口重定向到443端口

jenkins的安装和配置

jenkins的安装

环境版本

  • 操作系统:CentOS 7
  • jdk:21.0.5
  • maven: 3.8.8
  • jenkins: 2.463

参考资料

安装jdk和maven

安装jdk

安装地址

  • 下载tar.gz压缩包,传输到/opt文件夹中,
1
2
3
-bash-4.2# cd /opt   # 进入存放tar包的文件夹内
-bash-4.2# mkdir /usr/java # 创建/usr下的java文件夹
-bash-4.2# tar -zxvf jdk-21_linux-x64_bin.tar.gz -C /usr/java #解压文件到/usr/java内
  • 配置环境变量
1
-bash-4.2# vim /etc/profile   # 编辑环境变量配置文件

插入环境变量:

1
2
export JAVA_HOME=/usr/local/jdk-21.0.5
export PATH=$PATH:$JAVA_HOME/bin

编辑结束后esc退出编辑器输入:wq保存修改

  • 重启并检查java版本
1
2
-bash-4.2# source /etc/profile   # 使配置文件生效
-bash-4.2# java --version # 查询java版本

安装maven

下载地址

将安装压缩包移动到/opt目录下
安装结束后基本和jdk的安装相同的步骤:

  1. 解压文件到/usr/local下
1
2
-base-4.2# cd /opt
-base-4.2# tar -zxvf apache-maven-3.8.8-bin.tar.gz -C /usr/local
  1. 配置maven环境变量

编辑配置文件/etc/profile

1
vim /etc/profile

添加环境变量

1
2
export MAVEN_HOME=/usr/local/apache-maven-3.8.8 
export PATH=$MAVEN_HOME/bin:$PATH

刷新配置文件,检测是否成功

1
2
source /etc/profile
mvn -v

安装jenkins

直接照搬官方的教程:

  1. 安装jenkins

拉取安装包:

1
2
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io-2023.key

还要安装jenkins中用到的字体:

1
sudo yum install fontconfig

安装jenkins:

1
yum install jenkins
  1. 配置及运行jenkins:

如果需要修改jenkins的端口,需要修改jenkins.service文件:

1
vim /usr/lib/systemd/system/jenkins.service

修改其中的环境变量JENKINS_PORT:

1
Environment=“JENKINS_PORT=8888

修改完之后需要重新加载系统配置:

1
systemctl daemon-reload

启动jenkins:

1
systemctl start jenkins

问题以及解决方法

配置的时候遇到了很多坑,
大部分时候都是由于jdk和jenkins版本不兼容导致的各种报错。

java版本切换时,java命令刷新失败

因为一开始安装的是1.8低版本的jdk,jenkins的很多插件都无法运行,
于是要把旧版本的jdk删除掉,换新版本的,
删除方式如下:

  1. 删除所有名为java的文件
1
find / -iname java | xargs -n 1000 rm -rf
  1. 删除/etc/profile中旧的jdk环境变量

  2. 清除bash shell内部的哈希表缓存的命令(重要)

如果不执行这一步,即便是删除了usr/bin/java,执行java命令时还是会软链接到原先的文件夹

1
hash -r

运行java命令时报错:libjli.so not found

把旧版本的java删除干净之后,重新安装java

运行jenkins报错:/usr/share/java/jenkins.war not installed

报错发生在切换java版本之后,
把jenkins删除后重新安装应该可以

运行jenkins报错:WARNING: An illegal reflective access operation has occurred

高版本java配低版本jenkins导致的错误,
换高版本jenkins

运行jenkins报错:Caused by: java.io.IOException: Failed to bind to 0.0.0.0/0.0.0.0:8080

8080端口已经被人占用了,现用lsof命令检查一下端口状态:
首先安装lsof命令(如果没有该命令的话):

1
sudo yum install lsof

用lsof命令检查8080端口情况:

1
2
3
sudo lsof -i 8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 6056 root 108u IPv6 6181134 0t0 TCP *:webcache (LISTEN)

如果端口被占用,杀死占用端口的服务:

1
sudo kill -9 6056

卸载jenkins

1
2
3
4
5
6
7
8
# rpm 卸载
rpm -e jenkins

# 检查是否卸载成功
rpm -ql jenkins

# 彻底删除残留文件
find / -iname jenkins | xargs -n 1000 rm -rf

jenkins的配置