Как заставить Nginx работать с IP-адресами шестой версии? Решение, расписанное в комментариях конфигурации не работает, если у вас больше одного виртуального хоста. По крайней мере, не работает оно в Debian, при использовании Nginx в связка с Apache.
И так, предположим, что на сервере два виртуальных хоста: example.com и example.net, Nginx работает как front end для Apache, а конфигурационный файл хостов Nginx выглядит примерно так:
Рекомендуется заменить строку "listen 80;" на "listen [:--><!--/smile:]:80 ipv6only=on;" - эффект тот же.
Либо заменить строку "listen 80;" на "listen [<!--smile:--><!--/smile-->]:80 ipv6only=on;" - Nginx будет работать только с IPv6.
Всё это не работает, если у вас больше одного хоста. В первом случае Nginx плюётся ошибками следующего вида:
Во втором случае ругается на повтор параметра "ipv6only=on", тип которого можно употребить лишь один раз в конфигурации хостов.
Решение: Нужно прописать IP для каждого хоста в отдельности. Таким образом рабочая конфигурация будет выглядеть примерно так:
Где "[XXXX:XXXX:XXXX:XXXX:XXXX:XXXX]" - наш IPv6. Квадратные скобки обязательны, иначе запись будет восприниматься как перечисление портов и как результат - ошибка.
И так, предположим, что на сервере два виртуальных хоста: 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. Квадратные скобки обязательны, иначе запись будет восприниматься как перечисление портов и как результат - ошибка.