在CentOS系统中搭建LNMP(Linux+Nginx+MySQL+PHP)环境时,权限问题是常见的故障诱因,主要表现为网站无法访问、502 Bad Gateway错误或文件无法读写。以下是系统性的解决步骤:
Nginx和PHP-FPM需以同一用户/组运行,否则会导致PHP-FPM无法处理Nginx传递的请求(如动态页面生成失败)。
/usr/local/nginx/conf/nginx.conf或/etc/nginx/nginx.conf),找到user指令(如user www-data www-data;),记录用户/组(示例为www-data)。/usr/local/php/etc/php-fpm.conf或/etc/php-fpm.d/www.conf),找到listen.owner和listen.group指令,将其值修改为与Nginx一致(如listen.owner = www-data、listen.group = www-data)。systemctl restart nginx)和PHP-FPM(systemctl restart php-fpm)使配置生效。权限设置需遵循最小权限原则,避免使用777(完全开放),否则会带来严重的安全风险。
/home/wwwroot/default)及子目录应设置为755(所有者可读/写/执行,其他用户可读/执行),命令示例:chown -R www-data:www-data /home/wwwroot/default # 递归修改所有者和组
find /home/wwwroot/default -type d -exec chmod 755 {} \; # 递归设置目录权限
644(所有者可读/写,其他用户可读),命令示例:find /home/wwwroot/default -type f -exec chmod 644 {} \; # 递归设置文件权限
/home/wwwroot/default/uploads)需设置为755(目录)和644(文件),并禁止执行PHP(通过Nginx配置location ~* ^/uploads/.*\.php$ { deny all; })。CentOS默认启用SELinux(安全增强模块),可能会阻止Nginx或PHP-FPM访问网站目录。
setenforce 0,若问题消失则说明是SELinux导致。/etc/selinux/config文件,将SELINUX=enforcing改为SELINUX=permissive,重启系统生效。chcon -R -t httpd_sys_rw_content_t /home/wwwroot/default # 将目录标记为httpd可读写
setsebool -P httpd_can_network_connect 1 # 允许httpd进程网络连接(如连接数据库)
LNMP安装后,网站目录下会生成.user.ini文件(用于限制PHP执行权限),若该文件被锁定(chattr +i),则无法修改或删除,可能导致权限问题。
chattr -i /home/wwwroot/default/.user.ini,修改完成后可重新锁定(chattr +i /home/wwwroot/default/.user.ini)。若上述步骤无法解决,需查看Nginx错误日志和PHP-FPM错误日志,定位具体错误原因:
/usr/local/nginx/logs/error.log(或/var/log/nginx/error.log)。/usr/local/php/var/log/php-fpm.log(或/var/log/php-fpm/error.log)。通过以上步骤,可系统性解决CentOS LNMP环境中的权限问题。需注意,权限设置需兼顾安全性与功能性,避免过度开放权限导致服务器被入侵。