Crossroads » Linux » Nginx. Работа с IPv6

Nginx. Работа с IPv6

  • Dislike
  • +1
  • Like
Nginx. Работа с IPv6Как заставить Nginx работать с IP-адресами шестой версии? Решение, расписанное в комментариях конфигурации не работает, если у вас больше одного виртуального хоста. По крайней мере, не работает оно в Debian, при использовании Nginx в связка с Apache.

И так, предположим, что на сервере два виртуальных хоста: example.com и example.net, Nginx работает как front end для Apache, а конфигурационный файл хостов Nginx выглядит примерно так:

# example.com
    server {
    server_name www.example.com example.com;
    listen 80;
    charset UTF-8;

    ...

    }
     
    location / {
    proxy_pass http://127.0.0.1:8080/;
    proxy_redirect http://127.0.0.1:8080/ /;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
     
    ...

    }
     
    }
	
# example.net
    server {
    server_name www.example.net example.net;
    listen 80;
    charset UTF-8;
    
    ...

    }
     
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root /var/www/nginx-default;
    }
     
    location / {
    proxy_pass http://127.0.0.1:8080/;
    proxy_redirect http://127.0.0.1:8080/ /;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
     
    ...

    }
     
    }    
	


Рекомендуется заменить строку "listen 80;" на "listen [:--><!--/smile:]:80 ipv6only=on;" - эффект тот же.

Либо заменить строку "listen 80;" на "listen [<!--smile:--><!--/smile-->]:80 ipv6only=on;" - Nginx будет работать только с IPv6.

Всё это не работает, если у вас больше одного хоста. В первом случае Nginx плюётся ошибками следующего вида:

nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)


Во втором случае ругается на повтор параметра "ipv6only=on", тип которого можно употребить лишь один раз в конфигурации хостов.

Решение: Нужно прописать IP для каждого хоста в отдельности. Таким образом рабочая конфигурация будет выглядеть примерно так:

# example.com
    server {
    server_name www.example.com example.com;
    listen 80;
    listen [XXXX:XXXX:XXXX:XXXX:XXXX:XXXX]:80;
    charset UTF-8;

    ...

    }
     
    location / {
    proxy_pass http://127.0.0.1:8080/;
    proxy_redirect http://127.0.0.1:8080/ /;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
     
    ...

    }
     
    }
	
# example.net
    server {
    server_name www.example.net example.net;
    listen 80;
    [XXXX:XXXX:XXXX:XXXX:XXXX:XXXX]:80;
    charset UTF-8;
    
    ...

    }
     
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root /var/www/nginx-default;
    }
     
    location / {
    proxy_pass http://127.0.0.1:8080/;
    proxy_redirect http://127.0.0.1:8080/ /;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
     
    ...

    }
     
    }    
	


Где "[XXXX:XXXX:XXXX:XXXX:XXXX:XXXX]" - наш IPv6. Квадратные скобки обязательны, иначе запись будет восприниматься как перечисление портов и как результат - ошибка.
Like Dislike




Tags: Nginx


 
  • Creative Commons Licence
  • Norton Safeweb
  • Website Uptime Monitoring By ServiceUptime.com