Nginx位置块 - 排除特定的PHP文件

时间:2016-05-18 10:18:40

标签: php wordpress nginx proxy

我在客户端服务器群集上有一个站点的Nginx服务器块:

# Create shared memory zone for managing requests from IP's. Request rate set at 60 requests per minute, equates to 1 per second.
# Any quicker than this and nginx will serve 404, instead of the resource.
limit_req_zone $binary_remote_addr zone=xmlrpc:10m rate=60r/m;

# Create shared memory zone for managing active connections. Works almost the same as above. Not currently using this.
limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  REMOVED;
        root         /var/www/REMOVED/html;
        client_max_body_size 20M;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/ *.conf;

        location / {
        #root         /var/www/REMOVED/html;
        index  index.php index.htm index.html;
        proxy_read_timeout 200;
        #try_files $uri $uri/ =404;
        try_files $uri $uri/ /index.php?$args;
        include /var/www/REMOVED/html/nginx.conf;
        }

        location /xmlrpc.php {
        limit_req zone=xmlrpc;
        #limit_conn addr 10;#DO NOT USE
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {
                root           /var/www/REMOVED/html;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_read_timeout 200;
                fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
                include        fastcgi_params;
        }

        location ~ ^/(status|ping)$ {
        access_log off;
        allow 127.0.0.1;
        allow 10.10.10.0/24;
        allow 10.10.33.11;
        deny all;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
        }

        error_page 404 /404.html;
            location = /404.html {
        }

        error_page 500 /500.html;
            location = /500.html {
        }
    }

此处感兴趣的区域是前几行,我试图将给定时间范围内的单个给定IP地址的请求数限制为单个资源。具体来说,我试图在wordpress安装中将每秒的请求数从1 IP限制为xmlrpc.php。

如果我创建一个测试htm文件并将位置块从xmlrpc.php更改为testfile.htm,这一切都按预期工作,任何更频繁的请求,每秒1次,被阻止并命中404。但是,如果我制作位置块xmlrpc.php,它不起作用,我仍然可以点击domain.com/xmlrpc.php,我永远不会被阻止。

我使用php-fpm处理所有PHP请求,Nginx仅作为PHP文件的代理,如您所见。 location ~ \.php$ { 位置区块处理该问题。

我目前的理论是xmlrpc.php请求,因为它们不是由Nginx直接处理和服务的,而是忽略了在Nginx中设置的请求限制。

有没有办法可以从主location ~ \.php$ {位置排除xmlrpc.php,因此它们会受到请求限制的影响,但xmlrpc.php文件在合法访问时仍能正常工作办法?感谢。

1 个答案:

答案 0 :(得分:0)

解决。问题是nginx继续处理位置块并使用catch所有.php文件之一。忽略我原来的xmlrpc.php。

我使用“=”运算符来寻找与/xmlrpc.php的完全匹配,因此导致nginx在匹配该位置块之后停止处理更多的位置块。

我的最终位置块最终看起来像这样:

    location = /xmlrpc.php {
    limit_req zone=xmlrpc;
    #limit_conn addr 10;#DO NOT USE
            root           /var/www/REMOVED/html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_read_timeout 200;
            fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
            include        fastcgi_params;
    }

这已经过测试和验证,工作正常。感谢。