我不知道我的nginx
安装出了什么问题。突然所有页面请求都被重定向到该403
页面。
昨天我尝试添加用户代理来阻止,重新启动服务后,所有内容都发送到 403。我撤消了更改,重新启动后nginx
所有内容仍定向到该403
页面。即使我删除了$http_user_agent
and $http_referer
if 语句,所有内容仍发送到 403。
我甚至从备份中恢复了整个nginx
文件夹,但我的所有页面请求仍然被定向到 403 页面......
不确定如何排除此故障,conf 文件恢复正常。我可以跟踪nginx
请求何时进入吗?
[root@soupcan nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
以下是网站配置文件:
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/website1/access.log main;
error_log /var/log/nginx/website1/error.log;
root /srv/www/website1;
## Block http user agent - morpheus fucking scanner ##
if ($http_user_agent ~* "morfeus fucking scanner|ZmEu|Morfeus strikes again.|OpenWebSpider v0.1.4 (http://www.openwebspider.org/)") {
return 403;
}
if ($http_referer ~* (semalt.com|WeSEE)) {
return 403;
}
## Only allow GET and HEAD request methods. By default Nginx blocks
## all requests type other then GET and HEAD for static content.
if ($request_method !~ ^(GET|HEAD)$ ) {
return 405;
}
location / {
index index.html index.htm index.php;
ssi on;
}
location ~ \.php {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/website1/$fastcgi_script_name;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# Redirect server error pages to the static page
error_page 403 404 /error403.html;
location = /error403.html {
root /usr/share/nginx/html;
}
}
nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;
gzip_disable "msie6";
gzip_min_length 1100;
gzip_vary on;
gzip_proxied any;
gzip_buffers 16 8k;
gzip_types text/plain text/css application/json application/x-javascript
text/xml application/xml application/rss+xml text/javascript
image/svg+xml application/x-font-ttf font/opentype
application/vnd.ms-fontobject;
server_tokens off;
include /etc/nginx/conf.d/*.conf;
# Load virtual host configuration files.
include /etc/nginx/sites-enabled/*;
# BLOCK SPAMMERS IP ADDRESSES
include /etc/nginx/conf.d/blockips.conf;
}
webroot 目录的权限:
[root@soupcan nginx]# namei -om /srv/www/website1/
f: /srv/www/website1/
dr-xr-xr-x root root /
drwxr-xr-x root root srv
drwxrwxr-x brian nobody www
drwxr-x--x brian nobody website1
编辑
发现 CentOS 6.6 和 SELinux 破坏了 nginx。我仍在寻找解决方案,但原因如下。
编辑2
解决方案发布如下。
答案1
这个问题是由于 CentOS 从 6.5 升级到 6.6 以及 SElinux 允许内容类型通过的方式引起的。升级后,SElinux 默认只允许httpd_t
内容通过(类似于它们对 Apache 的处理方式),而且由于我将所有 Web 内容存储在/srv/www/
这些用户创建的文件夹中,因此系统不会自动设置内容标签。
要检查这一点,请针对您的 webroot 和目录运行以下命令/etc/nginx
并比较内容类型:
ls -Z /srv/www/
我已经运行这些命令并重新启动nginx
,现在一切正常运行。
grep nginx /var/log/audit/audit.log | audit2allow -m nginx > nginx.te
grep nginx /var/log/audit/audit.log | audit2allow -M nginx
semodule -i nginx.pp
我不确定这个 SElinux 模块是做什么的,但我发现它读起来这个帖子关于同一个问题。我今天可能会尝试将其撤消,因为我认为我修复此问题的第二件事确实有效。
[09:15 AM] robotoverlord ~>chcon -Rv --type=httpd_sys_content_t /srv/www/
[09:15 AM] robotoverlord ~> ls -Z /srv/www/
drwxr-xr-x. www-data nobody unconfined_u:object_r:httpd_sys_content_t:s0 website1
[09:15 AM] robotoverlord ~>service nginx restart
问题解决了!
答案2
chmod ogw file
设置文件权限o沃纳,G团和瓦orld,每个都是 read(4)、write(2)、execute(1) 的总和,如果需要
没有适当的读写权限
drwxr-x--x brian nobody website1
nginx 是只读的,所以你必须让他进入!
cd /srv/
find . -type d -exec chmod 755 {} \;