Linux 从零部署项目实战指南(二):Nginx + MySQL + Redis 运行环境搭建
本系列面向零基础或初中级开发者,手把手教你将一个项目从零部署到 Linux 服务器,并解决过程中遇到的常见问题。
一、前言
在上一篇文章中,我们完成了服务器的初始化:系统配置好了、防火墙打开了、目录结构规范了。
但一台空服务器还不能跑项目。我们需要安装三样东西:
- • Nginx:处理 HTTP 请求,反向代理到你的应用,还能托管静态文件
这三者是绝大多数 Web 项目的"标配"运行环境。本篇会详细讲解每一步的安装、配置和验证,以及常见坑的解决方案。
二、Nginx 安装与配置
2.1 Nginx 是什么?
Nginx(发音"engine-x")是一个高性能的 HTTP 服务器和反向代理服务器。它帮你做三件事:
┌──────────┐ ┌──────────┐ ┌──────────────┐│ 用户浏览器 │ ──▶ │ Nginx │ ──▶ │ .NET/Python ││ │ │ │ │ Web 应用 ││ :80/443 │ ◀── │ :80 │ ◀── │ :5000 │└──────────┘ └──────────┘ └──────────────┘ │ ▼ ┌──────────────┐ │ 静态资源 │ │ (HTML/CSS/JS)│ └──────────────┘
- • 反向代理:用户访问 80 端口,Nginx 把请求转发到你应用监听的端口(如 5000)
- • 静态文件服务:图片、CSS、JS 等直接由 Nginx 响应,速度快
- • 负载均衡:流量大时,分发到多个后端服务器(后续文章会讲)
2.2 安装 Nginx
# 更新软件源sudo apt update# 安装 Nginxsudo apt install -y nginx# 查看版本nginx -v# 启动 Nginxsudo systemctl start nginx# 设置开机自启sudo systemctl enable nginx# 查看状态sudo systemctl status nginx# 输出应显示:active (running)
安装完成后,在浏览器中访问服务器公网 IP,应该能看到 Nginx 的欢迎页面:
http://123.123.123.123
💡 如果看不到欢迎页:检查防火墙是否放行了 80 端口(参考第一篇的防火墙配置)。
2.3 Nginx 配置文件结构
理解 Nginx 的配置文件结构很重要,否则后面改配置时一脸懵:
/etc/nginx/├── nginx.conf # 主配置文件(入口)├── sites-available/ # 可用站点配置目录│ └── default # 默认站点配置├── sites-enabled/ # 已启用站点配置(软链接到 sites-available)│ └── default → ../sites-available/default├── conf.d/ # 额外的配置文件(可在此添加 .conf 文件)├── modules-enabled/ # 已启用的模块└── mime.types # MIME 类型映射表
关键理解:sites-available 是"候选项",sites-enabled 是"已启用项"。一个站点先在 sites-available 中创建配置,然后通过软链接到 sites-enabled 来启用。禁用一个站点时,只需删除软链接,配置不会丢失。
2.4 配置第一个站点(静态网站)
我们来配置一个最简单的静态站点,用于验证 Nginx 正常工作:
# 1. 创建站点目录sudo mkdir -p /home/www/myproject/static# 2. 创建一个测试页面sudo tee /home/www/myproject/static/index.html << 'EOF'<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>我的项目 - 部署成功</title> <style> body { font-family: Arial, sans-serif; text-align: center; padding: 50px; } h1 { color: #0F4C81; } </style></head><body> <h1>✅ 部署成功!</h1> <p>Nginx 运行正常,服务器已就绪。</p></body></html>EOF# 3. 创建 Nginx 站点配置sudo tee /etc/nginx/sites-available/myproject << 'EOF'server { # 监听端口 listen 80; listen [::]:80; # 域名(没有域名就写服务器 IP,或者用 _ 通配) server_name _; # 站点根目录 root /home/www/myproject/static; # 默认首页文件 index index.html; # 日志文件 access_log /var/log/nginx/myproject_access.log; error_log /var/log/nginx/myproject_error.log; location / { try_files $uri $uri/ =404; }}EOF# 4. 启用站点(创建软链接)sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/# 5. 先禁用默认站点(避免冲突)sudo rm /etc/nginx/sites-enabled/default# 6. 测试配置语法sudo nginx -t# 输出:syntax is ok / test is successful# 7. 重新加载 Nginxsudo systemctl reload nginx
再次访问 http://123.123.123.123,应该能看到你创建的测试页面。
2.5 配置反向代理(核心功能)
大多数项目不是静态页面,而是运行在特定端口上的 Web 应用。Nginx 作为反向代理,把用户请求转发到应用端口:
# 编辑站点配置,改为反向代理模式sudo tee /etc/nginx/sites-available/myproject << 'EOF'server { listen 80; listen [::]:80; server_name _; # 访问日志 access_log /var/log/nginx/myproject_access.log; error_log /var/log/nginx/myproject_error.log; # ---------- 静态资源(Nginx 直接处理,更快) ---------- location /static/ { alias /home/www/myproject/static/; expires 30d; # 浏览器缓存 30 天 add_header Cache-Control "public, immutable"; } location /uploads/ { alias /home/www/myproject/static/uploads/; expires 7d; } # ---------- 动态请求(反向代理到后端应用) ---------- location / { proxy_pass http://127.0.0.1:5000; # 转发到你的应用 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; # WebSocket 支持(如果应用需要) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 超时设置 proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; }}EOF# 测试配置并重新加载sudo nginx -t && sudo systemctl reload nginx
反向代理配置说明:
| | |
|---|
proxy_pass | | |
proxy_set_header Host | | 后端应用通过 Host 头知道用户访问的是哪个域名 |
proxy_set_header X-Real-IP | | 否则后端应用看到的 IP 都是 127.0.0.1(Nginx 本机) |
proxy_set_header X-Forwarded-For | | |
proxy_http_version 1.1 | | WebSocket 需要 HTTP/1.1 或更高 |
2.6 配置 HTTPS(SSL 证书)
为什么要 HTTPS?
方案一:使用 Let's Encrypt 免费证书(推荐)
# 安装 Certbotsudo apt install -y certbot python3-certbot-nginx# 申请证书(需要域名已解析到服务器 IP)sudo certbot --nginx -d yourdomain.com# 按照提示操作:# 1. 输入邮箱地址(用于接收证书续期通知)# 2. 同意服务条款# 3. 选择是否将 HTTP 重定向到 HTTPS(强烈建议选)
Certbot 会自动修改 Nginx 配置,添加 SSL 相关配置。证书有效期为 90 天,设置自动续期:
# 测试自动续期是否正常工作sudo certbot renew --dry-run# Certbot 会安装 systemd 定时器自动续期,无需手动操作# 查看定时器状态sudo systemctl status certbot.timer
方案二:手动配置 SSL(使用已有证书)
如果你有证书文件(如从云平台申请的免费证书):
# 将证书文件放在服务器上sudo mkdir -p /etc/nginx/ssl# 上传 yourdomain.com.pem 和 yourdomain.com.key 到 /etc/nginx/ssl/# 配置 Nginxsudo tee /etc/nginx/sites-available/myproject << 'EOF'server { # HTTP 自动跳转 HTTPS listen 80; listen [::]:80; server_name yourdomain.com; return 301 https://$server_name$request_uri;}server { listen 443 ssl; listen [::]:443 ssl; server_name yourdomain.com; # SSL 证书配置 ssl_certificate /etc/nginx/ssl/yourdomain.com.pem; ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key; # SSL 安全配置(推荐) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 其他配置与之前一致 root /home/www/myproject/static; index index.html; location / { proxy_pass http://127.0.0.1:5000; 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; }}EOFsudo nginx -t && sudo systemctl reload nginx
2.7 Nginx 常用管理命令
# 启动sudo systemctl start nginx# 停止sudo systemctl stop nginx# 重启sudo systemctl restart nginx# 重新加载配置(不中断服务,推荐)sudo systemctl reload nginx# 查看状态sudo systemctl status nginx# 测试配置语法sudo nginx -t# 查看错误日志sudo tail -f /var/log/nginx/error.log# 查看访问日志sudo tail -f /var/log/nginx/access.log
三、MySQL 安装与配置
3.1 MySQL 是什么?
MySQL 是最流行的开源关系型数据库。你的项目数据(用户信息、文章内容、订单记录等)都存储在 MySQL 中。
3.2 安装 MySQL 8.0
# 安装 MySQL 8.0sudo apt install -y mysql-server-8.0# 查看版本mysql --version# 确认 MySQL 服务已启动sudo systemctl status mysql# 输出应显示:active (running)# 设置开机自启(默认已设置)sudo systemctl enable mysql
3.3 安全初始化配置
安装完成后,必须执行安全配置脚本:
# 运行安全配置脚本sudo mysql_secure_installation
安全配置选项说明:
Enter current password for root: # 直接回车(默认无密码)Switch to unix_socket authentication? # 输入 n(保持密码认证)Change the password for root? # 输入 y(为 root 设置密码) New password: # 输入一个强密码(如 MySqL@2024#Secure) Re-enter new password: # 再次输入确认Remove anonymous users? # 输入 y(删除匿名用户)Disallow root login remotely? # 输入 y(禁止 root 远程登录)Remove test database and access to it? # 输入 y(删除测试数据库)Reload privilege tables now? # 输入 y(立即生效)
3.4 验证 MySQL 登录
# 使用 root 密码登录sudo mysql -u root -p# 输入刚才设置的密码# 登录后看到 mysql> 提示符,表示成功# 运行以下命令测试mysql> SHOW DATABASES;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || sys |+--------------------+4 rows in set (0.01 sec)mysql> EXIT;
3.5 创建项目数据库和用户
不要直接用 root 操作项目数据库,就像上一篇说的,不要用 root 操作项目一样。创建一个专用数据库和用户:
-- 登录 MySQLsudo mysql -u root -p-- 创建项目数据库CREATE DATABASE myproject_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 创建项目用户CREATE USER 'myapp'@'localhost' IDENTIFIED BY 'YourAppPassword2024!';-- 授权(只给必要的权限)GRANT ALL PRIVILEGES ON myproject_db.* TO 'myapp'@'localhost';-- 如果应用需要从其他服务器连接(比如你的开发机)-- 先查一下你的开发机 IP,然后:-- CREATE USER 'myapp'@'192.168.1.%' IDENTIFIED BY 'YourAppPassword2024!';-- GRANT ALL PRIVILEGES ON myproject_db.* TO 'myapp'@'192.168.1.%';-- 刷新权限FLUSH PRIVILEGES;-- 验证SHOW DATABASES;SELECT user, host FROM mysql.user;-- 退出EXIT;
字符集说明:
- •
utf8mb4:真正的 UTF-8 编码,支持 emoji 😊 和中文字符 - •
utf8mb4_unicode_ci:基于 Unicode 的排序规则,支持多语言排序 - • 不要用
utf8(它是 MySQL 的 utf8mb3 别名,不支持 emoji 等 4 字节字符)
3.6 测试数据库连接
# 用新创建的用户测试连接mysql -u myapp -p -D myproject_db# 输入密码,应该能正常登录# 创建一张测试表mysql> CREATE TABLE test_connection ( id INT AUTO_INCREMENT PRIMARY KEY, message VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);mysql> INSERT INTO test_connection (message) VALUES ('连接成功!');mysql> SELECT * FROM test_connection;+----+--------------+---------------------+| id | message | created_at |+----+--------------+---------------------+| 1 | 连接成功! | 2026-07-29 10:00:00 |+----+--------------+---------------------+mysql> DROP TABLE test_connection;mysql> EXIT;
3.7 配置远程访问(按需开启)
默认 MySQL 只允许本地(localhost)访问。如果你的应用在另一台服务器上,需要开启远程访问:
# 1. 编辑 MySQL 配置文件sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf# 2. 找到以下行并修改# 修改前:bind-address = 127.0.0.1# 修改后:bind-address = 0.0.0.0# 3. 重启 MySQLsudo systemctl restart mysql# 4. 防火墙放行 MySQL 端口(仅限内网 IP)sudo ufw allow from 10.0.0.0/8 to any port 3306# 或指定具体的应用服务器 IPsudo ufw allow from 应用服务器IP to any port 3306
⚠️ 安全警告:不要将 MySQL 端口(3306)暴露到公网(0.0.0.0/0),否则你的数据库会被全网扫描并暴力破解。
3.8 数据库备份策略
定时备份数据库是关键操作,别等数据丢了才后悔。
手动备份
# 备份单个数据库mysqldump -u myapp -p myproject_db > /data/backup/db/myproject_db_$(date +%Y%m%d).sql# 压缩备份(推荐,备份文件可缩小 10-20 倍)mysqldump -u myapp -p myproject_db | gzip > /data/backup/db/myproject_db_$(date +%Y%m%d).sql.gz# 备份所有数据库mysqldump -u root -p --all-databases | gzip > /data/backup/db/all_databases_$(date +%Y%m%d).sql.gz
自动定时备份(Crontab)
# 创建备份脚本sudo tee /usr/local/bin/backup-mysql.sh << 'EOF'#!/bin/bashBACKUP_DIR="/data/backup/db"DB_NAME="myproject_db"DB_USER="myapp"DB_PASSWORD="YourAppPassword2024!"RETENTION_DAYS=30mkdir -p $BACKUP_DIR# 备份并压缩mysqldump -u $DB_USER -p$DB_PASSWORD $DB_NAME | \ gzip > $BACKUP_DIR/${DB_NAME}_$(date +%Y%m%d_%H%M%S).sql.gz# 删除 30 天前的旧备份find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -deleteecho "Backup completed: $(date)"EOF# 给脚本执行权限sudo chmod +x /usr/local/bin/backup-mysql.sh# 添加定时任务(每天凌晨 3 点执行)sudo crontab -e# 添加以下行:0 3 * * * /usr/local/bin/backup-mysql.sh >> /var/log/backup-mysql.log 2>&1
四、Redis 安装与配置
4.1 Redis 是什么?
Redis 是一个内存数据库,读写速度极快(微秒级),常用于:
4.2 安装 Redis
# 安装 Redissudo apt install -y redis-server# 查看版本redis-server --version# 确认 Redis 服务已启动sudo systemctl status redis-server# 输出应显示:active (running)# 测试连通性redis-cli ping# 输出:PONG
4.3 配置 Redis
默认配置可以直接用,但为了安全,需要做几项调整:
# 编辑 Redis 配置文件sudo vim /etc/redis/redis.conf
关键配置项说明:
# 1. 绑定地址(只允许本机访问,最安全)bind 127.0.0.1 ::1# 如果应用和 Redis 在同一台服务器,保持这个配置# 如果不在一台服务器,改为 bind 0.0.0.0 并设置防火墙# 2. 端口(默认 6379,一般不需要改)port 6379# 3. 守护进程模式(后台运行)daemonize yes# 4. 日志级别loglevel notice# 可选:debug(开发)、verbose、notice(推荐)、warning# 5. 日志文件logfile /var/log/redis/redis-server.log# 6. 设置密码(强烈建议!)requirepass YourRedisPassword2024!# 在 # requirepass foobared 下方添加# 7. 最大内存限制(防止 Redis 耗尽服务器内存)maxmemory 256mb# 根据服务器内存设定,建议不超过总内存的 25%# 2G 服务器 → 512mb,4G 服务器 → 1gb# 8. 内存淘汰策略(达到 maxmemory 时怎么处理)maxmemory-policy allkeys-lru# 可选策略:# noeviction:不淘汰,写入时报错(默认,不推荐)# allkeys-lru:淘汰最近最少使用的 key(推荐)# volatile-lru:淘汰设置了过期时间的 key 中最近最少使用的# allkeys-lfu:淘汰使用频率最低的 key
配置完成后重启 Redis:
# 检查配置语法sudo redis-server /etc/redis/redis.conf --test# 重启 Redissudo systemctl restart redis-server# 验证密码登录redis-cli -a YourRedisPassword2024! ping# 输出:PONG# 不带密码测试redis-cli ping# 输出:NOAUTH Authentication required.
4.4 配置 Redis 持久化
Redis 默认把数据存在内存中,重启后数据会丢失。配置持久化可以让数据保存到磁盘:
# 编辑 /etc/redis/redis.confsudo vim /etc/redis/redis.conf
两种持久化方式对比:
| | | | |
|---|
| RDB | save 900 1 | | | |
| AOF | appendonly yes | | | |
推荐配置(同时开启两者):
# RDB 快照配置(默认已开启)save 900 1 # 900 秒(15 分钟)内至少 1 个 key 被修改save 300 10 # 300 秒(5 分钟)内至少 10 个 key 被修改save 60 10000 # 60 秒内至少 10000 个 key 被修改# RDB 文件保存路径dir /var/lib/redisdbfilename dump.rdb# AOF 持久化(推荐开启)appendonly yesappendfilename "appendonly.aof"# AOF 写入策略(推荐 everysec)appendfsync everysec# always:每次写入都同步(最安全,但最慢)# everysec:每秒同步一次(推荐,平衡安全与性能)# no:由操作系统决定(最快,但可能丢失大量数据)# AOF 重写(自动压缩 AOF 文件)auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb
# 重启 Redis 使配置生效sudo systemctl restart redis-server# 验证持久化文件已生成ls -la /var/lib/redis/# 应该能看到 dump.rdb 和 appendonly.aof
4.5 测试 Redis 功能
# 设置键值redis-cli -a YourRedisPassword2024! set test_key "Hello Redis"# 读取redis-cli -a YourRedisPassword2024! get test_key# 输出:"Hello Redis"# 设置过期时间(10 秒后自动删除)redis-cli -a YourRedisPassword2024! setex temp_key 10 "临时数据"# 查看所有 keyredis-cli -a YourRedisPassword2024! keys *# 清理测试数据redis-cli -a YourRedisPassword2024! del test_key temp_key
五、服务管理
5.1 使用 systemd 管理服务
Ubuntu 使用 systemd 管理系统服务。三个核心服务的命令:
# ========== Nginx ==========sudo systemctl status nginxsudo systemctl restart nginxsudo systemctl reload nginx # 重载配置(不中断服务)# ========== MySQL ==========sudo systemctl status mysqlsudo systemctl restart mysqlsudo systemctl reload mysql # MySQL 的 reload 是重新加载配置# ========== Redis ==========sudo systemctl status redis-serversudo systemctl restart redis-server
5.2 查看服务日志
# Nginx 错误日志sudo tail -f /var/log/nginx/error.log# Nginx 访问日志sudo tail -f /var/log/nginx/access.log# MySQL 日志sudo tail -f /var/log/mysql/error.log# Redis 日志sudo tail -f /var/log/redis/redis-server.log# 查看系统日志(按服务名过滤)sudo journalctl -u nginx --since "5 minutes ago"sudo journalctl -u mysql --since "today"sudo journalctl -u redis-server --since "1 hour ago" --no-pager
5.3 监控服务状态
# 查看服务监听端口sudo ss -tlnp | grep -E '80|443|3306|6379'# 输出示例:# LISTEN 0 511 *:80 *:* users:(("nginx",pid=1234))# LISTEN 0 151 *:3306 *:* users:(("mysqld",pid=5678))# LISTEN 0 511 127.0.0.1:6379 *:* users:(("redis-server",pid=9012))# 查看进程ps aux | grep -E 'nginx|mysql|redis'# 查看内存占用ps aux --sort=-%mem | grep -E 'nginx|mysql|redis' | head -10
六、性能优化建议
6.1 Nginx 优化
# 编辑 /etc/nginx/nginx.confsudo vim /etc/nginx/nginx.conf
# 工作进程数(设为 CPU 核心数)worker_processes auto;# 每个进程的最大连接数worker_connections 1024;# 开启 gzip 压缩(减少传输数据量)gzip on;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;gzip_min_length 1000;gzip_comp_level 5;# 开启静态文件缓存(降低服务器负载)# 在站点配置的 location /static/ 中已配置 expires
6.2 MySQL 优化
# 编辑 MySQL 配置文件sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 根据服务器内存调整# 2G 内存服务器推荐值innodb_buffer_pool_size = 512M # 设为总内存的 25%-50%query_cache_type = 0 # MySQL 8.0 已废弃查询缓存query_cache_size = 0max_connections = 100 # 最大连接数
6.3 Redis 优化
# 已在 /etc/redis/redis.conf 中配置maxmemory 256mbmaxmemory-policy allkeys-lru
七、常见问题
❓ Q1:Nginx 启动失败 "address already in use"
原因:80 端口已被占用,通常是 Apache 或其他服务在占用。
排查与解决:
# 查看哪个进程占用了 80 端口sudo ss -tlnp | grep :80# 如果是 Apache 占用了,停用它sudo systemctl stop apache2sudo systemctl disable apache2# 重启 Nginxsudo systemctl start nginx
❓ Q2:Nginx 配置测试报错 "could not build server_names_hash"
原因:server_name 配置太多或太长,哈希表不够大。
解决方案:
# 编辑 /etc/nginx/nginx.conf,在 http 块中添加:server_names_hash_bucket_size 128;server_names_hash_max_size 1024;# 测试并重载sudo nginx -t && sudo systemctl reload nginx
❓ Q3:MySQL 无法启动 "Permission denied"
原因:MySQL 数据目录权限不正确。
解决方案:
# 修复权限sudo chown -R mysql:mysql /var/lib/mysqlsudo chmod -R 750 /var/lib/mysql# 重启 MySQLsudo systemctl restart mysql
❓ Q4:MySQL 连接报错 "Access denied for user"
原因:用户名、密码或主机限制不正确。
排查步骤:
# ① 检查用户是否存在及允许的主机sudo mysql -u root -pmysql> SELECT user, host, authentication_string FROM mysql.user WHERE user='myapp';# ② 如果不存在,重新创建用户mysql> CREATE USER 'myapp'@'localhost' IDENTIFIED BY 'YourPassword';mysql> GRANT ALL PRIVILEGES ON myproject_db.* TO 'myapp'@'localhost';mysql> FLUSH PRIVILEGES;# ③ 检查密码是否正确(可以重置密码)mysql> ALTER USER 'myapp'@'localhost' IDENTIFIED BY 'NewPassword';mysql> FLUSH PRIVILEGES;
❓ Q5:Redis 连接报错 "NOAUTH Authentication required"
原因:连接 Redis 时没有提供密码。
解决方案:
# 连接时带密码redis-cli -a YourRedisPassword2024!# 或者先连接再认证redis-cli> AUTH YourRedisPassword2024!# 如果是应用连接,检查连接字符串是否包含密码# Redis 连接字符串格式:# redis://:YourRedisPassword2024!@localhost:6379/0
❓ Q6:MySQL 远程连接不上
原因:没有开启远程访问或防火墙未放行。
排查步骤:
# ① 检查 MySQL 是否监听所有网卡sudo ss -tlnp | grep 3306# 如果显示 127.0.0.1:3306,说明只监听了本机# 需要修改 bind-address = 0.0.0.0# ② 检查防火墙是否放行sudo ufw status | grep 3306# 如果没有规则,添加:sudo ufw allow from 10.0.0.0/8 to any port 3306# ③ 检查云平台安全组# 登录控制台,确认 3306 端口已放行# ④ 测试端口连通性(从客户端机器)telnet 服务器IP 3306
❓ Q7:服务器重启后服务没有自动启动
原因:服务没有设置开机自启。
解决方案:
# 设置所有核心服务开机自启sudo systemctl enable nginxsudo systemctl enable mysqlsudo systemctl enable redis-server# 验证sudo systemctl is-enabled nginxsudo systemctl is-enabled mysqlsudo systemctl is-enabled redis-server# 输出都应该是:enabled
八、总结
至此,你的服务器已经具备了运行 Web 项目的完整环境!
本文要点回顾:
第二篇:Nginx + MySQL + Redis 运行环境搭建├── ✅ Nginx 安装与配置│ ├── 反向代理配置(核心功能)│ ├── HTTPS 配置(Let's Encrypt 免费证书)│ └── 常用管理命令├── ✅ MySQL 8.0 安装与配置│ ├── 安全初始化配置│ ├── 创建项目数据库和用户│ ├── 远程访问配置(可选)│ └── 自动备份策略├── ✅ Redis 安装与配置│ ├── 密码认证│ ├── 内存限制和淘汰策略│ ├── 持久化配置(RDB + AOF)│ └── 功能验证├── ✅ 服务管理│ ├── systemd 管理三件套│ ├── 日志查看│ └── 状态监控└── ✅ 常见问题排查 ├── Nginx 端口冲突 ├── MySQL 权限问题 ├── Redis 认证问题 └── 远程连接问题
下一篇预告:《Linux 从零部署项目实战指南(三):实战部署 .NET Web 应用》我们将把一个 .NET Web API 项目从源码编译、发布、配置到上线,完整走一遍部署流程。
如果你在操作过程中遇到任何问题,欢迎在评论区留言交流!
📌 本系列持续更新中,关注 IT在线自学 第一时间获取最新教程。