CentOS 7.9手动搭建LNMP环境全攻略

1. 项目概述

在CentOS系统上搭建LNMP(Linux+Nginx+MySQL+PHP)环境是Web开发者和运维人员的常见需求。相比一键安装脚本,通过yum手动安装能更好地控制组件版本和配置细节,特别适合需要定制化环境的生产场景。

我最近在CentOS 7.9上为电商项目搭建LNMP环境时,发现网上教程要么过于简单要么版本老旧。经过多次实践,总结出一套稳定可靠的安装方案,重点解决三个核心问题:

  1. 如何通过官方源安装最新稳定版组件
  2. Nginx与PHP-FPM的高效协作配置
  3. MySQL的安全加固措施

提示:建议使用至少2GB内存的服务器,避免因资源不足导致安装失败或性能问题。

2. 环境准备与系统配置

2.1 系统更新与基础配置

首先通过SSH连接服务器,执行系统更新确保所有软件包为最新版本:

sudo yum update -y sudo yum install -y epel-release # 安装EPEL扩展源

设置时区并同步时间:

sudo timedatectl set-timezone Asia/Shanghai sudo yum install -y chrony sudo systemctl enable --now chronyd

2.2 防火墙与SELinux配置

放行必要端口并设置防火墙规则:

sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload

对于SELinux,建议保持启用但调整策略:

sudo setsebool -P httpd_can_network_connect 1 sudo semanage port -a -t http_port_t -p tcp 9000 # 为PHP-FPM放行端口

3. 组件安装与配置

3.1 Nginx安装与优化

添加Nginx官方源并安装:

sudo tee /etc/yum.repos.d/nginx.repo <<-'EOF' [nginx-stable] name=nginx stable repo baseurl=https://nginx.org/packages/centos/7/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key EOF sudo yum install -y nginx

关键配置调整(/etc/nginx/nginx.conf):

worker_processes auto; # 自动匹配CPU核心数 worker_connections 1024; keepalive_timeout 65; gzip on; # 启用压缩

启动服务并测试:

sudo systemctl enable --now nginx curl -I 127.0.0.1 # 应返回HTTP 200

3.2 MySQL 8.0安全部署

添加MySQL官方源并安装:

sudo rpm -Uvh https://repo.mysql.com/mysql80-community-release-el7-7.noarch.rpm sudo yum install -y mysql-community-server

安全加固步骤:

  1. 获取临时密码:sudo grep 'temporary password' /var/log/mysqld.log
  2. 运行安全脚本:sudo mysql_secure_installation
  3. 创建应用专用用户:
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'Complex@Password123'; GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost'; FLUSH PRIVILEGES;

性能优化建议(/etc/my.cnf):

[mysqld] innodb_buffer_pool_size = 1G # 建议为内存的50-70% innodb_log_file_size = 256M max_connections = 200

3.3 PHP 7.4/8.0安装与调优

通过Remi源安装指定版本PHP:

sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm sudo yum-config-manager --enable remi-php80 # 或remi-php74 sudo yum install -y php php-fpm php-mysqlnd php-opcache

关键配置(/etc/php-fpm.d/www.conf):

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 = 10

OPcache优化(/etc/php.d/10-opcache.ini):

opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60

4. 服务集成与测试

4.1 Nginx与PHP-FPM集成

创建专用站点配置(/etc/nginx/conf.d/php-site.conf):

server { listen 80; server_name example.com; root /var/www/html; index index.php index.html; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }

测试配置并重载:

sudo nginx -t sudo systemctl reload nginx sudo systemctl restart php-fpm

4.2 环境验证

创建测试脚本/var/www/html/info.php:

<?php phpinfo(); $conn = new mysqli('localhost', 'app_user', 'Complex@Password123'); if ($conn->connect_error) { die("MySQL连接失败: " . $conn->connect_error); } echo "LNMP环境验证通过!"; ?>

访问测试后务必删除:

sudo rm -f /var/www/html/info.php

5. 常见问题排查

5.1 502 Bad Gateway错误

可能原因及解决方案:

  1. PHP-FPM未运行:sudo systemctl status php-fpm
  2. Socket权限问题:
    sudo chown nginx:nginx /var/run/php-fpm/php-fpm.sock sudo chmod 660 /var/run/php-fpm/php-fpm.sock
  3. SELinux限制:
    sudo audit2allow -a # 查看拒绝日志 sudo setsebool -P httpd_execmem 1

5.2 MySQL连接问题

典型错误排查:

# 检查服务状态 sudo systemctl status mysqld # 测试本地连接 mysql -u app_user -p # 检查错误日志 sudo tail -50 /var/log/mysqld.log

5.3 性能优化建议

Nginx工作进程调整:

worker_processes 4; # 匹配CPU核心数 worker_rlimit_nofile 65535;

PHP-FPM进程管理优化(高流量场景):

pm = static pm.max_children = 100 # 根据内存调整:(总内存 - 系统占用) / 单个进程内存

6. 进阶配置与维护

6.1 日志管理配置

Nginx日志切割(/etc/logrotate.d/nginx):

/var/log/nginx/*.log { daily missingok rotate 30 compress delaycompress notifempty create 640 nginx adm sharedscripts postrotate /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true endscript }

PHP-FPM慢日志记录(/etc/php-fpm.d/www.conf):

slowlog = /var/log/php-fpm/www-slow.log request_slowlog_timeout = 5s

6.2 安全加固措施

关键安全配置:

  1. 禁用危险PHP函数:
    disable_functions = exec,passthru,shell_exec,system,proc_open,popen
  2. 限制PHP访问目录:
    open_basedir = /var/www/html:/tmp
  3. Nginx防注入规则:
    location ~* \.(php|asp|aspx|jsp)$ { deny all; }

6.3 备份与恢复方案

MySQL定时备份脚本(/usr/local/bin/mysql_backup.sh):

#!/bin/bash DATE=$(date +%Y%m%d) BACKUP_DIR="/backup/mysql" mkdir -p $BACKUP_DIR mysqldump -u root -pYourPassword --all-databases | gzip > "$BACKUP_DIR/full_$DATE.sql.gz" find $BACKUP_DIR -type f -mtime +30 -delete

设置定时任务:

sudo chmod +x /usr/local/bin/mysql_backup.sh (crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/mysql_backup.sh") | crontab -

这套方案已在多个生产环境稳定运行,关键点在于:使用官方源保证组件兼容性,精细化的服务配置确保性能,严格的安全设置防范风险。对于需要多版本PHP的场景,可以通过Remi源灵活切换PHP版本。