【LINUX】在Ubuntu服务器部署网页系统
【LINUX】在Ubuntu服务器部署网页系统
前言
本文档旨在详细介绍如何在Ubuntu服务器上部署一个典型的网页系统。部署过程涵盖了从环境准备、所需软件(如MySQL、Nginx、JDK、MongoDB、Redis等)的安装与配置,到前端和后端应用的打包、部署及最终的调试验证。笔者将以第一人称视角,结合实际操作经验,提供清晰、可执行的步骤指导,希望能帮助读者顺利完成部署任务。无论是初次接触服务器部署的新手,还是有一定经验的开发者,都可以从本文中获取有价值的信息。
一、准备环境
查看服务器信息
1
2
3
4uname -a # 查看系统内核信息
lsb_release -a # 如果是 Linux 系统,查看发行版本
df -h # 查看磁盘空间
free -m # 查看内存使用情况检查软件安装状态:
1
2
3mysql --version # 检查 MySQL 是否已安装
nginx -v # 检查 Nginx 是否已安装
java -version # 检查 Java 是否已安装
二、安装部署所需的软件
(一)MYSQL
更新软件包列表
1
sudo apt update
安装MySQL服务器
1 2 4 1
sudo apt install mysql-server
离线安装
5 当服务器无法连接互联网时,可按照以下步骤进行离线安装:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 在有网络的机器上下载deb包
wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb
# 将deb包传输到服务器
scp mysql-apt-config_0.8.24-1_all.deb user@server:/tmp
# 在服务器上配置本地源
sudo dpkg -i /tmp/mysql-apt-config_0.8.24-1_all.deb
sudo apt update
# 安装依赖(需提前下载传输)
sudo dpkg -i libaio1_*.deb libmecab2_*.deb
# 安装MySQL服务
sudo apt install mysql-server验证安装
1 4 1
mysql --version
或者查看服务状态:
1
sudo systemctl status mysql
安全配置
2 4 运行安全脚本以提高MySQL安装的安全性:
1
sudo mysql_secure_installation
根据提示进行设置,例如设置root密码、删除匿名用户、禁止root远程登录、删除测试数据库等。
(可选)配置远程访问
1 如果需要允许远程连接,需要修改MySQL配置文件。通常是
/etc/mysql/mysql.conf.d/mysqld.cnf
文件。
找到bind-address
配置项,将其值从127.0.0.1
修改为0.0.0.0
或者服务器的IP地址。1
bind-address = 0.0.0.0
修改后重启MySQL服务:
1
sudo systemctl restart mysql.service
登录MySQL
4 1
sudo mysql -u root -p
然后输入之前设置的root密码。
(二)NGINX
更新软件包列表
1
sudo apt update
安装Nginx
1 2 3 1
sudo apt install nginx
离线安装
6 离线环境安装步骤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 在有网络的设备下载安装包
wget http://nginx.org/packages/ubuntu/pool/nginx/n/nginx/nginx_1.18.0-0ubuntu1_amd64.deb
# 传输deb包到服务器
scp nginx_1.18.0-0ubuntu1_amd64.deb user@server:/tmp
# 安装依赖(需提前下载)
sudo dpkg -i libpcre3_*.deb zlib1g_*.deb openssl_*.deb
# 安装Nginx
sudo dpkg -i /tmp/nginx_1.18.0-0ubuntu1_amd64.deb
# 修复依赖关系
sudo apt --fix-broken install验证安装
检查Nginx服务状态:
1
sudo systemctl status nginx
或者通过访问服务器IP地址在浏览器中查看Nginx欢迎页面。
配置防火墙
2 如果启用了UFW防火墙,需要允许Nginx的HTTP和HTTPS流量:
1
2
3sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'Nginx HTTPS'
sudo ufw statusNginx常用命令
1
2
3
4
5
6
7sudo systemctl stop nginx # 停止Nginx服务
sudo systemctl start nginx # 启动Nginx服务
sudo systemctl restart nginx # 重启Nginx服务
sudo systemctl reload nginx # 重新加载配置(不中断服务)
sudo systemctl enable nginx # 设置开机自启动
sudo systemctl disable nginx # 禁止开机自启动
nginx -t # 测试Nginx配置文件语法Nginx配置文件
主要的Nginx配置文件位于
/etc/nginx/nginx.conf
。
服务器块(虚拟主机)配置文件通常位于/etc/nginx/sites-available/
目录下,并通过软链接到/etc/nginx/sites-enabled/
目录来启用。
默认的服务器块配置文件是/etc/nginx/sites-available/default
。
(三)JDK
在Ubuntu上安装JDK,推荐使用OpenJDK,它是Java的开源实现,并且Ubuntu的官方仓库中提供了易于安装的包。
更新软件包列表
1
sudo apt update
安装默认的JDK (OpenJDK)
2 4 这将安装一个推荐的LTS(长期支持)版本的OpenJDK。
1
sudo apt install default-jdk
离线安装
7 离线环境安装步骤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 在有网络的机器下载deb包
wget https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.deb
# 传输文件到服务器
scp openjdk-11+28_linux-x64_bin.deb user@server:/tmp
# 安装依赖(需提前下载)
sudo dpkg -i libc6_*.deb libstdc++6_*.deb
# 安装JDK
sudo dpkg -i /tmp/openjdk-11+28_linux-x64_bin.deb
# 配置环境变量
sudo update-alternatives --config java如果你需要安装特定版本的OpenJDK,例如OpenJDK 11,可以使用:
1
sudo apt install openjdk-11-jdk
或者OpenJDK 17:
1
sudo apt install openjdk-17-jdk
验证安装
1 2 检查Java编译器版本:
1
javac -version
检查Java运行时版本:
1
java -version
(可选)配置JAVA_HOME环境变量
4 虽然许多现代Java应用程序不需要显式设置
JAVA_HOME
,但某些旧版应用程序或构建工具可能仍需要它。首先,找到Java的安装路径。对于
default-jdk
,它通常是一个指向具体OpenJDK版本的符号链接。可以通过以下命令找到实际路径:1
update-alternatives --config java
输出会列出可用的Java版本及其路径。例如,路径可能是
/usr/lib/jvm/java-11-openjdk-amd64/bin/java
。那么JAVA_HOME
应该是/usr/lib/jvm/java-11-openjdk-amd64
。编辑
/etc/environment
文件来全局设置环境变量:1
sudo nano /etc/environment
在文件末尾添加以下行(根据你的实际路径修改):
1
JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"
保存并关闭文件。然后,重新加载环境变量:
1
source /etc/environment
验证
JAVA_HOME
是否设置成功:1
echo $JAVA_HOME
(可选)管理多个Java版本
2 如果安装了多个Java版本,可以使用
update-alternatives
命令来切换默认版本:1
2sudo update-alternatives --config java
sudo update-alternatives --config javac根据提示选择你想要设置为默认的版本号。
(四)MongoDB(如有必要)
MongoDB是一个基于分布式文件存储的NoSQL数据库。以下是在Ubuntu上安装MongoDB Community Edition的步骤。
导入MongoDB的GPG密钥
1 5 1
2
3
4sudo apt-get install gnupg
curl -fsSL https://pgp.mongodb.com/server-8.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg \
--dearmor注意:请根据MongoDB官方文档检查最新的GPG密钥和版本。
创建MongoDB的apt源列表文件
1 根据你的Ubuntu版本选择对应的命令。例如,对于Ubuntu 22.04 (Jammy Jellyfish):
1
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list
对于其他Ubuntu版本,请参考MongoDB官方文档替换
jammy
部分。更新软件包列表并安装MongoDB
1 2 1
2sudo apt-get update
sudo apt-get install -y mongodb-org启动并验证MongoDB服务
1 2 启动MongoDB服务:
1
sudo systemctl start mongod
验证服务状态:
1
sudo systemctl status mongod
如果服务未启动,可以尝试:
1
2sudo systemctl enable mongod # 设置开机自启动
sudo systemctl restart mongod连接到MongoDB Shell
1 1
mongosh
(可选)配置MongoDB
MongoDB的配置文件位于
/etc/mongod.conf
。你可以根据需要修改配置,例如绑定IP地址以允许远程连接、配置认证等。2
例如,要允许所有IP连接,可以将net.bindIp
修改为0.0.0.0
:1
2
3
4# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # Listen to all interfaces修改配置后,需要重启MongoDB服务:
1
sudo systemctl restart mongod
强烈建议在生产环境中启用认证并配置防火墙规则。
(五)Redis(如有必要)
Redis是一个开源的内存数据结构存储系统,可用作数据库、缓存和消息代理。
更新软件包列表
1
sudo apt update
安装Redis服务器
1 2 1
sudo apt install redis-server
验证安装
检查Redis服务状态:
1
sudo systemctl status redis-server
或者连接到Redis CLI:
1
2redis-cli
ping如果返回
PONG
,则表示连接成功。(可选)配置Redis
2 3 Redis的配置文件位于
/etc/redis/redis.conf
。
一个重要的配置是supervised
指令。由于Ubuntu使用systemd,建议将其设置为systemd
:1
supervised systemd
修改配置后,重启Redis服务:
1
sudo systemctl restart redis-server
你还可以配置密码、绑定IP等以增强安全性。
Redis常用命令
1
2
3
4
5sudo systemctl stop redis-server # 停止Redis服务
sudo systemctl start redis-server # 启动Redis服务
sudo systemctl restart redis-server # 重启Redis服务
sudo systemctl enable redis-server # 设置开机自启动
sudo systemctl disable redis-server # 禁止开机自启动
三、准备部署所必需的资源
(一)数据库
- 在部署前,需要准备好数据库脚本,包括建库、建表和初始数据。
准备SQL脚本文件
1
2# 创建存放SQL脚本的目录 (可自定义)
sudo mkdir -p /opt/deploy/sql上传SQL脚本文件
使用SFTP工具(如FileZilla、WinSCP等)将本地的SQL脚本上传到服务器的
/opt/deploy/sql
目录。导入数据库脚本
1
2
3
4
5
6
7# 登录MySQL
sudo mysql -u用户名 -p密码
# 在MySQL命令行中执行 (假设数据库已创建,如果未创建,请先创建)
USE 数据库名;
SOURCE /opt/deploy/sql/create_tables.sql; # 假设这是建表脚本
SOURCE /opt/deploy/sql/init_data.sql; # 假设这是初始化数据脚本如果需要创建数据库:
1
CREATE DATABASE 数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
(二)前端打包
- 前端项目通常需要打包后部署到Nginx服务器上。
准备前端打包文件
在本地开发环境中,使用构建工具(如npm、yarn等)打包前端项目:
1
2# 在前端项目目录中执行
npm run build # 或 yarn build,具体命令根据项目配置上传打包文件
使用SFTP工具将打包生成的文件(通常在
dist
或build
目录)上传到服务器。1
2# 在服务器上创建存放前端文件的目录 (可自定义,需与Nginx配置对应)
sudo mkdir -p /var/www/html/mywebsite解压前端文件(如果是压缩包)
1
2
3# 假设上传的是 frontend.zip
sudo apt install unzip # 如果没有unzip命令,先安装
sudo unzip frontend.zip -d /var/www/html/mywebsite如果直接上传的是文件夹内容,则跳过解压步骤。
(三)后端打包
- 后端Java项目通常打包为JAR或WAR文件部署。
准备后端打包文件
在本地开发环境中,使用Maven或Gradle打包后端项目:
1
2
3
4
5# Maven打包
mvn clean package -Dmaven.test.skip=true
# 或Gradle打包
gradle build -x test上传后端JAR/WAR文件
1
2# 在服务器上创建存放后端文件的目录 (可自定义)
sudo mkdir -p /opt/deploy/backend使用SFTP工具将JAR或WAR文件上传到服务器的
/opt/deploy/backend
目录。准备配置文件
1
2
3
4
5# 创建配置文件目录
sudo mkdir -p /opt/deploy/backend/config
# 创建应用配置文件 (例如 application.yml 或 application.properties)
sudo nano /opt/deploy/backend/config/application.yml配置文件示例 (
application.yml
):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
29server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: dbuser
password: dbpassword
driver-class-name: com.mysql.cj.jdbc.Driver
# Redis配置(如果使用)
redis:
host: localhost
port: 6379
# password: your_redis_password # 如果设置了密码
database: 0
# MongoDB配置(如果使用)
data:
mongodb:
uri: mongodb://user:password@localhost:27017/mydb
# RabbitMQ配置(如果使用,请先安装)
# rabbitmq:
# host: localhost
# port: 5672
# username: admin
# password: password
# virtual-host: /
四、部署资源并调试
(一)数据库
验证数据库连接
1
2
3
4
5
6
7
8# 连接MySQL数据库
sudo mysql -u用户名 -p密码 -h数据库主机(通常是localhost) 数据库名
# 查看数据库表
SHOW TABLES;
# 查看表数据
SELECT * FROM 表名 LIMIT 10;检查数据库字符集
1
2
3# 在MySQL命令行中执行
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';确保字符集设置正确(例如
utf8mb4
),以避免乱码问题。
(二)前端
配置Nginx虚拟主机
确保Nginx配置文件已正确设置(参考前面的Nginx安装与配置部分)。
一个简单的Nginx配置示例,用于托管静态前端资源 (例如在/etc/nginx/sites-available/mywebsite
):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23server {
listen 80;
server_name your_domain_or_ip; # 替换为你的域名或IP
root /var/www/html/mywebsite; # 前端文件存放路径
index index.html index.htm;
location / {
try_files $uri $uri/ /index.html;
}
# 可选:配置API反向代理 (如果后端服务在不同端口或主机)
# location /api/ {
# proxy_pass http://localhost:8080/api/; # 后端API地址
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto $scheme;
# }
access_log /var/log/nginx/mywebsite.access.log;
error_log /var/log/nginx/mywebsite.error.log;
}创建软链接以启用配置:
1
2sudo ln -s /etc/nginx/sites-available/mywebsite /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置是否正确检查文件权限
1
2
3# 确保Nginx运行用户(通常是www-data)有权限访问前端文件
sudo chown -R www-data:www-data /var/www/html/mywebsite
sudo chmod -R 755 /var/www/html/mywebsite重启Nginx服务
1
sudo systemctl restart nginx
测试前端访问
在浏览器中访问服务器IP或域名,检查前端页面是否正常显示。
(三)后端 (以Java Spring Boot应用为例)
创建启动脚本
1
2# 创建启动脚本 (例如 /opt/deploy/backend/start.sh)
sudo nano /opt/deploy/backend/start.sh添加以下内容 (根据实际情况修改
APP_NAME
和路径):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#!/bin/bash
JAVA_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
APP_NAME="your-app-name.jar" # 替换为你的JAR文件名
APP_PATH="/opt/deploy/backend"
CONFIG_PATH="$APP_PATH/config/application.yml" # 配置文件路径
LOG_FILE="$APP_PATH/app.log"
PID_FILE="$APP_PATH/app.pid"
cd $APP_PATH
if [ -f $PID_FILE ]; then
PID=$(cat $PID_FILE)
if ps -p $PID > /dev/null; then
echo "Application is already running with PID: $PID"
exit 1
else
echo "PID file exists but process is not running. Removing PID file."
rm -f $PID_FILE
fi
fi
echo "Starting application $APP_NAME..."
nohup java $JAVA_OPTS -jar $APP_NAME --spring.config.location=file:$CONFIG_PATH > $LOG_FILE 2>&1 &
echo $! > $PID_FILE
echo "Application started. PID: $(cat $PID_FILE). Log: $LOG_FILE"创建停止脚本
1
2# 创建停止脚本 (例如 /opt/deploy/backend/stop.sh)
sudo nano /opt/deploy/backend/stop.sh添加以下内容:
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#!/bin/bash
APP_PATH="/opt/deploy/backend"
PID_FILE="$APP_PATH/app.pid"
if [ ! -f "$PID_FILE" ]; then
echo "PID file not found. Application may not be running."
exit 1
fi
PID=$(cat $PID_FILE)
if ! ps -p $PID > /dev/null; then
echo "Process with PID $PID not found. Removing stale PID file."
rm -f $PID_FILE
exit 1
fi
echo "Stopping application with PID: $PID..."
kill $PID
# 等待进程停止
count=0
while ps -p $PID > /dev/null; do
sleep 1
count=$((count + 1))
if [ $count -gt 10 ]; then # 最多等待10秒
echo "Application did not stop gracefully after 10 seconds. Forcing kill..."
kill -9 $PID
break
fi
done
if ! ps -p $PID > /dev/null; then
echo "Application stopped successfully."
else
echo "Failed to stop application."
fi
rm -f $PID_FILE设置脚本权限
1
2sudo chmod +x /opt/deploy/backend/start.sh
sudo chmod +x /opt/deploy/backend/stop.sh启动后端应用
1
2
3
4
5# 启动应用
sudo /opt/deploy/backend/start.sh
# 查看启动日志
tail -f /opt/deploy/backend/app.log
(四)调试
检查应用状态
1
2
3
4
5
6
7
8
9
10
11# 检查后端应用进程
ps -ef | grep java
# 检查端口监听情况 (例如后端应用监听8080端口)
sudo netstat -tulnp | grep 8080
# 检查Nginx进程
ps -ef | grep nginx
# 检查Nginx端口 (通常是80或443)
sudo netstat -tulnp | grep 80检查日志
1
2
3
4
5
6
7
8
9
10# 查看后端应用日志
tail -f /opt/deploy/backend/app.log
# 查看Nginx访问日志 (路径可能因配置而异)
tail -f /var/log/nginx/mywebsite.access.log
tail -f /var/log/nginx/access.log
# 查看Nginx错误日志 (路径可能因配置而异)
tail -f /var/log/nginx/mywebsite.error.log
tail -f /var/log/nginx/error.log测试API接口
1
2
3
4
5# 使用curl测试后端API (假设后端运行在localhost:8080)
curl -X GET http://localhost:8080/api/test
# 带参数的POST请求
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' http://localhost:8080/api/data如果Nginx配置了反向代理,可以通过Nginx访问API:
1
curl -X GET http://your_domain_or_ip/api/test
常见问题排查
- 前端访问404/50x:检查Nginx配置、前端文件路径、文件权限、Nginx日志。
- 后端无法启动:检查Java版本、内存设置 (
JAVA_OPTS
)、配置文件路径和内容、后端应用日志。 - 数据库连接失败:检查后端配置文件中的数据库连接信息(地址、端口、用户名、密码、数据库名)、MySQL用户权限、MySQL服务是否运行、防火墙设置(如
ufw
是否允许3306端口)。 - API请求失败/无响应:检查后端应用是否正常运行、端口是否监听、Nginx反向代理配置是否正确、后端日志是否有错误信息。
- **跨域问题 (CORS)**:如果前端和后端部署在不同源(域名、端口),后端需要配置CORS策略,或者通过Nginx反向代理解决。
- 防火墙:确保服务器防火墙(如
ufw
)允许了Nginx (80, 443)、后端应用 (如8080)、数据库 (如3306) 等所需服务的端口。1
2
3
4
5
6sudo ufw status # 查看防火墙状态和规则
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080/tcp # 示例后端端口
sudo ufw enable # 启用防火墙 (如果未启用)
sudo ufw reload # 重载规则
五、总结
本文详细介绍了在Ubuntu服务器上部署一个完整网页系统的主要步骤,从最初的环境准备,到核心软件MySQL、Nginx、JDK的安装与配置,再到可选的MongoDB和Redis的安装,最后覆盖了前后端资源的准备、部署和基础调试方法。笔者力求提供一套清晰、实用的操作指南。
部署过程中,务必注意各个软件版本之间的兼容性,以及配置文件中路径、端口、用户凭据的准确性。日志文件是排查问题的最重要工具,无论是Nginx的访问/错误日志,还是后端应用的运行日志,都能提供关键线索。
此外,安全是生产环境部署中不可忽视的一环。建议进一步配置防火墙规则、数据库安全策略、定期备份数据,并对应用进行安全加固。希望本笔记能为您的部署工作带来帮助。
六、参考链接
检查应用状态
1
2
3
4
5
6
7
8
9
10
11# 检查后端应用进程
ps -ef | grep java
# 检查端口监听情况 (例如后端应用监听8080端口)
sudo netstat -tulnp | grep 8080
# 检查Nginx进程
ps -ef | grep nginx
# 检查Nginx端口 (通常是80或443)
sudo netstat -tulnp | grep 80检查日志
1
2
3
4
5
6
7
8
9
10# 查看后端应用日志
tail -f /opt/deploy/backend/app.log
# 查看Nginx访问日志 (路径可能因配置而异)
tail -f /var/log/nginx/mywebsite.access.log
tail -f /var/log/nginx/access.log
# 查看Nginx错误日志 (路径可能因配置而异)
tail -f /var/log/nginx/mywebsite.error.log
tail -f /var/log/nginx/error.log测试API接口
1
2
3
4
5# 使用curl测试后端API (假设后端运行在localhost:8080)
curl -X GET http://localhost:8080/api/test
# 带参数的POST请求
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' http://localhost:8080/api/data如果Nginx配置了反向代理,可以通过Nginx访问API:
1
curl -X GET http://your_domain_or_ip/api/test
常见问题排查
- 前端访问404/50x:检查Nginx配置、前端文件路径、文件权限、Nginx日志。
- 后端无法启动:检查Java版本、内存设置 (
JAVA_OPTS
)、配置文件路径和内容、后端应用日志。 - 数据库连接失败:检查后端配置文件中的数据库连接信息(地址、端口、用户名、密码、数据库名)、MySQL用户权限、MySQL服务是否运行、防火墙设置(如
ufw
是否允许3306端口)。 - API请求失败/无响应:检查后端应用是否正常运行、端口是否监听、Nginx反向代理配置是否正确、后端日志是否有错误信息。
- **跨域问题 (CORS)**:如果前端和后端部署在不同源(域名、端口),后端需要配置CORS策略,或者通过Nginx反向代理解决。
- 防火墙:确保服务器防火墙(如
ufw
)允许了Nginx (80, 443)、后端应用 (如8080)、数据库 (如3306) 等所需服务的端口。1
2
3
4
5
6sudo ufw status # 查看防火墙状态和规则
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080/tcp # 示例后端端口
sudo ufw enable # 启用防火墙 (如果未启用)
sudo ufw reload # 重载规则