0%

Ngnix+Tomcat+MySQL项目部署

前言

毕业设计做了一个签到系统的服务端,架构使用的Java栈的传统架构,也是最简单的架构。这个架构主要用Nginx做反向代理和负载均衡(我的项目没有使用到这一块),Tomcat作为Servlet的容器,MySQL作为数据库。项目也比较基础,没有太多难点,但是在项目部署过程当中还是遇到了一些问题,所以想着把部署的过程及记录下来,方便自己查看。

系统环境

操作系统:CentOS 7.4 x64
JDK: 1.8.171
MySQL: 5.7
Tomcat: 9.0.8

软件安装

MySQL数据库

MySQL由于历史原因(就是Oracle之前收购MySQL,社区担心Oracle闭源MySQL数据库,所以更改了源,默认的源是MariaDB)没有办法直接使用yum命令安装,所以需要手动下载然后添加。

1
$ wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

首先下载MySQL 5.7版本的包,然后添加到仓库。

1
$ sudo rpm -ivh mysql57-community-release-el7-9.noarch.rpm

然后直接使用yum命令安装MySQL。

1
$ sudo yum install mysql-server

安装完成后直接启动MySQL。

1
$ sudo mysql -u root

如果启动失败,可以打开配置文件,开启免密登录。

1
2
3
4
$ sudo vim /etc/my.cnf

[mysqld]
skip-grant-tables

进入MySQL后,就可以初始化配置了。首先可以修改密码和监听的地址。

1
2
3
4
5
> use mysql;
> ALTER PASSWORD PASSWORD('your password')
> UPDATE user SET host='ip or %';
> SET GOBAL max_connections=10000;
> exit

注释掉前面的那一句skip-grant-tables,然后重启mysql。

1
$ systemctl restart mysqld

然后启动mysql,创建名为sign_system的数据库,导入备份的数据。

1
2
3
4
> CREATE DATABASE sign_system;
> exit

$ mysql -u root -p < backup.sql

然后数据库部分的部署基本完成。

Java环境配置

首先下载JDK,从这个网址下载,下载完成后,解压。

1
$ tar -zxvf file.tar.gz

然后配置环境变量。

1
2
3
4
$ vim /etc/profile

JAVA_HOME='your dir';
PATH='$JAVA_HOME/bin:$PATH'

如果默认安装有open-jdk,可以使用命令卸载了它。

1
$ sudo yum remove open-jdk

Tomcat安装配置

下载Tomcat。

1
$ wget http://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.8/bin/apache-tomcat-9.0.8.tar.gz

解压。

1
$ tar -zxvf <your file>

配置tomcat环境变量,进入tomcat目录下的bin目录,创建setenv.sh文件,输入内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ CATALINA_HOME/bin touch setenv.sh

$ vim setenv.sh

#! /bin/sh

# add tomcat pid
CATALINA_PID="$CATALINA_HOME/tomcat.pid"

JAVA_HOME='your dir'

# add catalina option
CATALINA_OPTS="-Djava.rmi.server.hostname=uzpeng.top
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.password.file=$CATALINA_HOME/conf/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=$CATALINA_HOME/conf/jmxremote.access
-Dcom.sun.management.jmxremote.ssl=false"

配置CATALINA_HOME环境变量

1
2
3
$ vim /etc/profile

CATALINA_HOME='your dir'

最后配置启动脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ vim /lib/systemd/system/tomcat.service

[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking
PIDFile='your dir'/tomcat.pid
ExecStart='your dir'/bin/catalina.sh start
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

在tomcat目录下创建tomcat.pid文件。

1
$ touch tomcat.pid

上传war文件(我使用的是Xftp)到tomcat目录下的webapp,重命名为ROOT.war。然后接着编辑$CATALINA_HOME/conf/server.xml

1
2
3
4
5
6
7
<Host name="localhost"  appBase="webapps"
unpackWARs="true" autoDeploy="true">

<Context docBase="ROOT.war" path=""/>

.......
</Host>

重启tomcat

1
$ sudo systemctl restart tomcat

Nginx配置

首先直接使用yum命令安装nginx。

1
$ sudo yum install nginx

然后打开配置文件配置。

1
$ sudo vim /etc/nginx/nginx.cnf

以下是我的配置文件。

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
use epoll;
worker_connections 1024;
}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

proxy_set_header X-Real-IP $remote_addr;

server {
if ($host = <host>)
return 301 https://www.$host$request_uri;
}

server_name <host>;
}
server {
server_name api.host;

location / {
proxy_pass http://localhost:8080;
keepalive_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
proxy_http_version 1.1;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-NginX-Proxy true;

# prevents 502 bad gateway error
proxy_buffers 8 32k;
proxy_buffer_size 64k;

proxy_redirect off;

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

# managed by Certbot

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/<host>/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/<host>/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
server_name www.host;

location / {
proxy_pass http://localhost:4000;
keepalive_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
proxy_http_version 1.1;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-NginX-Proxy true;

# prevents 502 bad gateway error
proxy_buffers 8 32k;
proxy_buffer_size 64k;

proxy_redirect off;

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

# managed by Certbot

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/<host>/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/<host>/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

安装证书

证书使用的是Let’s Encrypt的泛子域名证书,安装步骤如下:

1
2
3
4
$ sudo yum install certbot
$ sudo yum install python2-certbot-nginx
$ sudo certbot --nginx
$ sudo certbot certonly --agree-tos --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory -d host -d "*.host"

总结

简单地记录了一下系统部署的过程,方便以后查阅,以后如果有遇到新的问题会在本文章继续补充。