最近在阿里云上申请了一台服务器,重新搭建了一遍环境,顺便记录一下过程。
安装 mysql 5.7
安装 mysql 服务
首先用 apt 安装。
sudo apt update
sudo apt install mysql-server
基本设置
然后进行安全配置。
sudo mysql_secure_installation
用户和权限设置
下面进行权限设置。
首先直接输入 mysql 连接
sudo mysql
检查一下当前的用户认证方法
SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | | auth_socket | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)
可以看到现在 root 用户认证方式是auth_socket
,具体是什么意思不知道,但现在这个方式在登陆时是不需要输入密码的。
我们把它改成用密码登陆,替换下面语句中的 password
为需要的密码,然后 flush
使设置生效。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
FLUSH PRIVILEGES;
再次查询认证方式,发现 plugin
已经变成和其他行一样了。
SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)
这时候 exit 然后重新用 mysql 连接,已经无法登陆了,需要指定用密码方式:
mysql -u root -p
下面来建立一个新用户,让他可以从远程进行连接。先用下面的语句设置用户名和密码,@
后面的 %
表示可以从任意地址发起连接。
CREATE USER 'sammy'@'%' IDENTIFIED BY 'password';
然后给他授权,这里简单粗暴把所有权限都给了,为了安全考虑生产上还是慎重一些。
GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'%' WITH GRANT OPTION;
这样用户就设置好了。
网络设置
用 navicat 试一下从远程进行连接,会报 10038 错误,提示你 Can't connect to MySQL server on xx.xx.xx.xx
,这里还需要改两个地方。
编辑下面的文件
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
其中有一行
bind-address = 127.0.0.1
表示默认只监听本机的连接。这里需要改成
bind-address = 0.0.0.0
保存文件后重启服务。
sudo systemctl restart mysql
这时候发现还是无法连接,因为防火墙还没开。需要在阿里云控制台设置防火墙。
先进到实例页面,点右边的管理。
然后左边菜单进入本实例安全组。
在操作下面点配置规则
右上角添加安全组规则,然后增加这样一条
可以顺便把8080 也给加了,一会儿 tomcat 也要用到,加好以后会多出这样两条规则。
这样就设置完成了,现在用 navicat 就可以正常从远程连接了。
安装 tomcat
升级 apt 并安装 java 环境。
sudo apt update
sudo apt install default-jdk
创建 tomcat 用户
sudo groupadd tomcat
sudo useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat
第二行的 -s /bin/false
用来阻止用户登陆该账户。这个账户只用来运行 tomcat,以后是不需要登陆操作的。
安装 tomcat
这里安装 9.0 版本的 tomcat,先要去下载页面获得下载地址,选择好镜像地址后右键点下面 tar.gz 复制链接地址即可。
切换临时目录并下载,这里把下载地址替换成最新获得的。
cd /tmp
curl -O http://mirrors.shu.edu.cn/apache/tomcat/tomcat-9/v9.0.12/bin/apache-tomcat-9.0.12.tar.gz
然后将文件解压到安装目录。
sudo mkdir /opt/tomcat
sudo tar xzvf apache-tomcat-9*tar.gz -C /opt/tomcat --strip-components=1
修改文件权限
切换目录。
cd /opt/tomcat
修改 conf
目录的用户组。
sudo chgrp -R tomcat /opt/tomcat
赋予 tomcat 用户组对整个 conf
目录的 read 权限以及该目录的执行权限
sudo chmod -R g+r conf
sudo chmod g+x conf
修改 webapps
,work
,temp
,logs
的用户
sudo chown -R tomcat webapps/ work/ temp/ logs/
文件权限设置完成,下面创建服务。
创建服务
首先要知道 JAVA_HOME
的路径,输入下面命令获得。
sudo update-java-alternatives -l
OUTPUT
java-1.11.0-openjdk-amd64 1101 /usr/lib/jvm/java-1.11.0-openjdk-amd64
后面的 /usr/lib/jvm/java-1.11.0-openjdk-amd64
就是 JAVA_HOME
的路径,记住它,后面要用。
下面在 /etc/systemd/system
目录中创建 tomcat.service
文件。
sudo vi /etc/systemd/system/tomcat.service
文件内容如下,主要要把 JAVA_HOME
后面的值改成刚才获得的路径。
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
Environment=JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
运行下面的命令使文件生效:
sudo systemctl daemon-reload
然后启动服务,看一下状态。
sudo systemctl start tomcat
sudo systemctl status tomcat
这时候访问 http://ip:8080 应该就可以打开页面了。8080 防火墙已经在上面安装 mysql 时顺便打开了。
设置自启动:
sudo systemctl enable tomcat
管理页面访问控制
现在还不能进到应用管理的页面。需要修改下面的配置文件。
sudo vi /opt/tomcat/conf/tomcat-users.xml
在里面设置一个用户名和密码,角色为 manager-gui
和 admin-gui
。
<tomcat-users . . .>
<user username="admin" password="password" roles="manager-gui,admin-gui"/>
</tomcat-users>
保存文件。
然后取消本地访问限制,需要编辑下面两个文件,分别对应两个应用:
sudo nano /opt/tomcat/webapps/manager/META-INF/context.xml
sudo nano /opt/tomcat/webapps/host-manager/META-INF/context.xml
把文件中的 <valve>
标签注释掉。
<Context antiResourceLocking="false" privileged="true" >
<!--<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />-->
</Context>
保存文件然后重启 tomcat 服务。
sudo systemctl restart tomcat
这样就可以进到应用管理添加应用了。
安装 nginx
安装
还是用 apt 安装,如果之前没有更新的话记得更新。
sudo apt update
sudo apt install nginx
这时候如果之前在新申请服务器时打开了 80 端口访问的话已经可以访问到 index 页面了。
反向代理
我在这里要部署的是一个 angular 应用和一个 spring 开发的后端应用,前端应用通过 nginx 访问,后端通过路径 /api
区分,反向代理到8080 端口,由 tomcat 处理。这里需要配置下面的文件:
sudo vi /etc/nginx/sites-enabled/default
内容:
server {
# 监听 80 端口
listen 80 default_server;
listen [::]:80 default_server;
# 根目录
root /var/www/html;
# 如果要访问的资源存在则返回资源,否则路由到 index.html,这条是由 angular 的特性决定的,除了静态文件以外的路由都交给 angular
try_files $uri $uri/ /index.html;
server_name _;
# 对 /api url 设置反向代理
location /api {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# 这里要把头部信息加上,否则在后端拿不到正确的数据
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 转发给 8080 端口
proxy_pass http://127.0.0.1:8080/api;
}
}
小结
至此整个框架就安装完成了,只要把项目打包发布即可。发布时要注意 tomcat 应用要发布到 /api context, 简单的做法是把打好的 war 包重命名为 api.war 然后用 app manager 来发布。