1. 项目概述
最近在帮朋友部署一个社区论坛时,重新梳理了一遍LNMP/LNAMP架构的完整部署流程。这个看似基础的工作,在实际操作中却有不少值得注意的细节。本文将分享从零开始搭建LNMP/LNAMP环境,到部署Discuz论坛,再到实现动静分离的完整过程。
2. 环境准备与基础架构选择
2.1 服务器配置建议
对于中小型网站,建议使用以下配置:
- CPU:2核以上
- 内存:4GB以上
- 系统:CentOS 7/8或Ubuntu 18.04/20.04 LTS
- 磁盘:40GB以上系统盘,建议单独挂载数据盘
2.2 LNMP与LNAMP架构对比
LNMP架构:
- Linux + Nginx + MySQL + PHP
- 优点:轻量级、高并发、资源占用少
- 缺点:PHP处理效率略低
LNAMP架构:
- Linux + Nginx + Apache + MySQL + PHP
- 优点:动静分离、Apache处理PHP更稳定
- 缺点:架构复杂、资源占用略高
对于Discuz这类PHP应用,如果访问量不大(日PV<10万),LNMP架构完全够用;如果访问量较大或需要更好的PHP处理性能,建议选择LNAMP架构。
3. LNMP环境搭建实战
3.1 基础环境安装
# 更新系统 yum update -y # 或Ubuntu系统 apt update && apt upgrade -y # 安装常用工具 yum install -y wget vim git3.2 Nginx安装与配置
# CentOS安装Nginx yum install -y epel-release yum install -y nginx # Ubuntu安装Nginx apt install -y nginx # 启动Nginx systemctl start nginx systemctl enable nginx配置Nginx默认站点(/etc/nginx/conf.d/default.conf):
server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }3.3 MySQL安装与安全配置
# CentOS安装MySQL wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm rpm -ivh mysql80-community-release-el7-3.noarch.rpm yum install -y mysql-community-server # 启动MySQL systemctl start mysqld systemctl enable mysqld # 获取临时密码 grep 'temporary password' /var/log/mysqld.log # 安全配置 mysql_secure_installation3.4 PHP安装与优化
# 安装PHP及常用扩展 yum install -y php php-fpm php-mysqlnd php-gd php-mbstring php-xml # 配置PHP-FPM vim /etc/php-fpm.d/www.conf关键配置项:
user = nginx group = nginx listen = /var/run/php-fpm/php-fpm.sock listen.owner = nginx listen.group = nginx pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 354. Discuz论坛部署
4.1 准备工作
# 创建网站目录 mkdir -p /data/wwwroot/discuz chown -R nginx:nginx /data/wwwroot/discuz # 下载Discuz cd /tmp wget https://download.comsenz.com/DiscuzX/3.4/Discuz_X3.4_SC_UTF8.zip unzip Discuz_X3.4_SC_UTF8.zip cp -r upload/* /data/wwwroot/discuz/4.2 数据库配置
CREATE DATABASE discuz DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER 'discuz'@'localhost' IDENTIFIED BY 'StrongPassword123!'; GRANT ALL PRIVILEGES ON discuz.* TO 'discuz'@'localhost'; FLUSH PRIVILEGES;4.3 Nginx配置Discuz站点
server { listen 80; server_name yourdomain.com; root /data/wwwroot/discuz; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.ht { deny all; } }4.4 安装Discuz
- 访问http://yourdomain.com/install/
- 按照向导完成安装
- 删除install目录
5. LNAMP架构实现与动静分离
5.1 Apache安装与配置
# 安装Apache yum install -y httpd # 配置Apache监听8080端口 vim /etc/httpd/conf/httpd.conf修改:
Listen 80805.2 修改PHP-FPM配置
vim /etc/php-fpm.d/www.conf修改:
user = apache group = apache listen = 127.0.0.1:90005.3 Nginx动静分离配置
server { listen 80; server_name yourdomain.com; # 静态文件处理 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico|js|css)$ { root /data/wwwroot/discuz; expires 30d; access_log off; } # 动态请求转发到Apache location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }5.4 Apache虚拟主机配置
<VirtualHost *:8080> DocumentRoot "/data/wwwroot/discuz" ServerName yourdomain.com <Directory "/data/wwwroot/discuz"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog "/var/log/httpd/discuz_error.log" CustomLog "/var/log/httpd/discuz_access.log" combined </VirtualHost>6. 性能优化与安全加固
6.1 PHP优化配置
vim /etc/php.ini关键参数:
memory_limit = 256M upload_max_filesize = 50M post_max_size = 60M max_execution_time = 300 opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=16.2 MySQL优化配置
vim /etc/my.cnf关键参数:
innodb_buffer_pool_size = 1G innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 2 innodb_flush_method = O_DIRECT query_cache_size = 64M thread_cache_size = 8 table_open_cache = 20006.3 安全加固措施
- 修改默认SSH端口
- 禁用root远程登录
- 配置防火墙规则
- 安装fail2ban防止暴力破解
- 定期备份数据库和网站文件
7. 常见问题排查
7.1 502 Bad Gateway错误
可能原因:
- PHP-FPM未运行
- Nginx与PHP-FPM通信问题
- PHP脚本执行超时
解决方案:
# 检查PHP-FPM状态 systemctl status php-fpm # 检查socket文件权限 ls -l /var/run/php-fpm/php-fpm.sock # 查看错误日志 tail -f /var/log/php-fpm/error.log7.2 Discuz上传文件失败
可能原因:
- 目录权限问题
- PHP配置限制
- Nginx/Apache配置问题
解决方案:
# 检查目录权限 chown -R apache:apache /data/wwwroot/discuz/data chmod -R 755 /data/wwwroot/discuz/data # 检查PHP配置 php -i | grep upload_max_filesize7.3 数据库连接问题
可能原因:
- MySQL服务未启动
- 用户权限不足
- 防火墙阻止连接
解决方案:
# 检查MySQL服务 systemctl status mysqld # 检查用户权限 mysql -u root -p SELECT host, user FROM mysql.user; SHOW GRANTS FOR 'discuz'@'localhost'; # 检查防火墙 firewall-cmd --list-all8. 监控与维护
8.1 基础监控配置
# 安装监控工具 yum install -y htop iftop nmon # 日志轮转配置 vim /etc/logrotate.d/nginx配置示例:
/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 640 nginx adm sharedscripts postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript }8.2 定期维护任务
- 每周检查磁盘空间:
df -h - 每月清理旧日志:
logrotate -f /etc/logrotate.conf - 每季度更新系统:
yum update -y - 每日数据库备份脚本:
#!/bin/bash DATE=$(date +%Y%m%d) mysqldump -u root -p'password' discuz > /backup/discuz_${DATE}.sql find /backup -type f -name "*.sql" -mtime +30 -exec rm {} \;