Jak sprawić, by nginx łączył php-fpm z 127.0.0.1, a nie publicznym serwerem IP?

0

Znalazłem błąd OSTRZEŻENIE: [basen www] dziecko 3715 powiedziało w stderr: „BŁĄD: połączenie niedozwolone: ​​adres IP„ x.x.x.x ”został usunięty.” ' w logu php-fpm, gdzie „x.x.x.x” jest publicznym serwerem mojego serwera.

Ponieważ „listen.allowed_clients = 127.0.0.1” jest ustawione na php-fpm, błąd jest rozsądny. Ale zastanawiam się, dlaczego nginx łączy się z php-fpm z jego publicznym ip, nginx i php-fpm są w rzeczywistości na tym samym serwerze. Czy istnieje podejście do zmiany zachowania nginx tutaj?

AKTUALIZACJA: dodano szczegółowe konfiguracje.

w nginx.conf:

user  nginx; 
worker_processes  4; 
error_log  /var/log/nginx/error.log; 
pid        /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;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
    index   index.html index.htm;
    upstream php {
        server 127.0.0.1:9000;
    }
}

w /etc/nginx/conf.d/test.conf:

server {
        listen 443 default_server ssl;
        ssl_certificate /usr/share/nginx/html/xxx.crt;
        ssl_certificate_key /usr/share/nginx/html/xxx/xxx.key;

        ## Your website name goes here.
        server_name x.x.x;
        ## Your only path reference.
        root /usr/share/nginx/html/xxx;
        ## This should be in your http block and if it is, it's not needed here.
        include       /etc/nginx/mime.types;
        index index.php

        location ~ \.php$ {
                #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
                include fastcgi.conf;
                fastcgi_intercept_errors on;
                fastcgi_pass php;
        }
}

w fastcgi.conf:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

status php-fpm:

[root@test-server ~]# netstat -tulnp | grep 9000
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      4134/php-fpm: maste 

w dziennikach php-fpm:

[03-Aug-2015 09:55:02] WARNING: [pool www] child 4109 said into stderr: "ERROR: Connection disallowed: IP address '1.2.3.4' has been dropped."

Na moim serwerze: nazwa_serwera 'x.x.x' naprawdę została zmieniona na '1.2.3.4' przez dns, które zastępuję moją prawdziwą nazwą serwera i publiczną ip tymi fałszywymi. Jeśli to jest mylące, przepraszam za to.

Wszystkie powyższe pliki konfiguracyjne nie były zmieniane przez długi czas. Wszystko było w porządku, dopóki nie zrestartowałem serwera. Pamiętałem, że dodałem jedną linię jako „1.2.3.4 x.x.x” w moim / etc / hosts, ale usunięcie tego nie pomogło.

Obecnie zmieniłem listen.allowed_clients w php-fpm, aby ominąć ten problem. Ale jestem ciekawy takiego zachowania nginx i php-fpm.

apporc
źródło
Ponieważ powiedziałeś, że nginx to zrobi. Co jest w konfiguracji nginx? Zwłaszcza co jest fastcgi_pass dyrektywa?
Alexey Ten
@AlexeyTen edytowałem pytanie i dodałem więcej informacji. Myślałem, że powinna istnieć jakaś opcja konfiguracji i nie wiedziałem o tym. Dlatego powiedziałem, że nginx to zrobi. Myślisz, że powinienem podać więcej informacji, tam dodałem. Dzięki.
apporc
1
Nie jestem guru PHP, ale od PHP-FPM już słucham 127.0.0.1 nie ma potrzeby korzystania listen.allowed_clients.
Alexey Ten

Odpowiedzi:

0

Aby jawnie ustawić początkowy adres IP żądania, musisz użyć jednego z następujących fastcgi_bind / proxy_bind dyrektywy wraz z odpowiednią dyrektywą * _pass.

Dyrektywa ta pojawiła się w wersji 0.8.22. Powoduje, że połączenia wychodzące do serwera FastCGI pochodzą z określonego lokalnego adresu IP za pomocą opcjonalnego portu (1.11.2). Wartość parametru może zawierać zmienne (1.3.12). Specjalna wartość off (1.3.12) anuluje efekt dyrektywy fastcgi_bind odziedziczonej z poprzedniego poziomu konfiguracji, co pozwala systemowi na automatyczne przypisanie lokalnego adresu IP i portu.

Timur Bakeyev
źródło