Nginx配置疑问:访问/p/yyy.cgi返回403,/production/yyy.cgi正常
先还原你的场景:你在Nginx里配置了生产(production)和测试(test)环境,CGI文件分别存在/production和/test目录下。现在访问https://xxx.xxx.xxx.xxx/p/yyy.cgi时一直返回403错误,但直接访问https://xxx.xxx.xxx.xxx/production/yyy.cgi却能正常运行,你想知道问题出在哪。
从你给出的配置片段来看,核心问题大概率出在路径映射配置错误或者权限设置不匹配上,下面我分情况给你分析:
1. 路径映射(alias/root)用错了
这是最常见的诱因。你应该是想把/p/前缀映射到/production/目录,但如果配置里混淆了root和alias,就会导致Nginx找错文件路径,触发403。
举个典型的错误配置:
location /p/ { root /production; fastcgi_pass ...; }
用root的话,Nginx会把请求路径拼接成/production/p/yyy.cgi,但你的文件实际在/production/yyy.cgi,自然找不到对应的文件,返回403。
正确的配置应该用alias,它会直接替换掉路径前缀:
location /p/ { alias /production/; # 必须配置的CGI核心参数 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass ...; # 这里填你的FastCGI地址,比如127.0.0.1:9000 }
这样Nginx会把/p/yyy.cgi准确映射到/production/yyy.cgi,和你直接访问/production/yyy.cgi的路径完全一致。
2. 目录/文件权限不达标
如果路径映射是对的,那就要检查权限:
- 确保Nginx运行的用户(通常是
www-data或nginx)对/production目录有读+执行权限(执行权限才能遍历目录),对.cgi文件有读权限。 - 用命令快速验证:
# 检查目录权限 ls -ld /production # 检查文件权限 ls -l /production/yyy.cgi
如果权限不对,用chmod调整:
chmod 755 /production chmod 644 /production/yyy.cgi
同时要注意,/production的父目录(比如根目录/)也得给Nginx用户足够的访问权限,不然会被权限链阻断。
3. SELinux限制(Linux系统常见)
如果你的服务器开启了SELinux,它可能会阻止Nginx访问/production目录。可以先临时关闭SELinux测试:
setenforce 0
如果关闭后能正常访问,就需要给目录添加正确的SELinux上下文,避免后续重启后问题复发:
chcon -R -t httpd_sys_content_t /production chcon -R -t httpd_sys_script_exec_t /production/*.cgi
4. FastCGI参数缺失
你给出的配置片段里有fastcgi_param HTTPS on;,但缺少关键的SCRIPT_FILENAME参数。这个参数是告诉FastCGI进程要执行的脚本路径,如果没配置或者配置错误,也会导致403甚至500错误。一定要确保你的location /p/块里包含这个参数。
最后,修改配置后记得重启Nginx让改动生效:
nginx -s reload
内容的提问来源于stack exchange,提问作者1.618




