- PVSM.RU - https://www.pvsm.ru -
Сегодня столкнулся с проблемой — обнаружилось, что по ошибке старого системного администратора, в одном очень редком случае у нас происходил редирект с обычного 80 порта на порт 8080.
Из-за этого в индекс яндекса попала целая куча страниц, имеющих адрес example.com:8080, потому что проблема существовала уже 3 года, а заметили ее только сейчас.
Проблема усугублялась тем, что сервер конфигурировался автоматически с помощью ISP manager, что привело к тому, что сайты были доступны как по адресу example.com, так и по example.com:8080, и с учетом того, что к серверу было привязано 5 ip-адресов и на нем крутилось около 20 сайтов, переконфигурировать все вручную чтобы сконфигурировать правильным способом апач и nginx (сделать, чтобы апач слушал только 127.0.0.1 и чтобы они висели на одном порту с nginx, а внешние адреса слушал только nginx) не представлялось возможным. Проблеме потенциально подвержены все сайты, которые пользуются ISP manager, поэтому я считаю ее достаточно актуальной, и решил опубликовтаь свое решение, чтобы все тоже проверили и исправили, если надо.
Соответственно стояла задача — «малой кровью» сделать:
1. чтобы сайт example.com корректно работал, но не открывался по адресу example.com:8080
2. чтобы с порта 8080 для одного определенного сайта шел редирект на 80 порт, чтобы сохранить работоспособность страниц, попавших в выдачу яндекса.
Перейти сразу к ответу, без предыстории [1]
Беглое гугление [2] не показало ничего хорошего, большинство способов были аналогичны способу с iptables, предложенному тут [3]:
iptables -A INPUT -p tcp -m tcp --dport 8080 -j REDIRECT --to-ports 80
Проблема в том, что этот способ не работает — dmesg выдает
ip_tables REDIRECT target: only valid in nat table, not filter.
После небольшого гугления нашел вариант в списке рассылки nginx-ru:
www.lexa.ru/nginx-ru/msg21134.html [4]
Вариант был такой — перевесить в apache.conf мой сайт с моего ip 11.22.33.44:8080 на 127.0.0.1:8080, в nginx.conf соответсвенно прописать proxy_pass 127.0.0.1:8080 вместо 11.22.33.44:8080 для моего сайта, и потом добавить в конфиг nginx новый сервер
server { listen 11.22.33.44:8080; rewrite ^/(.*)$ http://$host:80/$1 redirect; }
Вариант в принципе был похож на правду, но была одна проблема — апач упорно слушал порт 11.22.33.44:8080, и соответсвенно не давал nginx-у начать его слушать.
Тут меня осенило — можно просто взять, и реализовать такой же редирект, но средствами apache а не nginx.
Просто берем и добавляем в apache2.conf соответствующий VirtualHost:
<VirtualHost 11.22.33.44:8080> ServerName example.com Redirect 301 / http://example.com/ </VirtualHost>
Попробовал — и вуаля, все заработало!
Таким образом, решение проблемы "как сделать редирект с 8080 порта на 80", при условии что у вас стоит debian, nginx, apache и все это настроено isp-менеджером для сайта example.com с ip 11.22.33.44, состоит из четырех простых шагов:
1. В конфиге Apache (/etc/apache2/apache2.conf) меняем все вхождения
Virtual Host 11.22.33.44:8080
на
VirtualHost 127.0.0.1:8080
2. Добавляем в конфиг Apache (/etc/apache2/apache2.conf) новый VirtualHost с редиректом:
<VirtualHost 11.22.33.44:8080> ServerName example.com Redirect 301 / http://example.com/ </VirtualHost>
3. В конфиге nginx (/etc/nginx/nginx.conf) меняем все вхождения
proxy_pass http://11.22.33.44:8080
на
proxy_pass http://127.0.0.1:8080
4. перезапускаем apache, перезапускаем nginx
/etc/init.d/apache2 restart /etc/init.d/nginx restart
Автор: rednaxi
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/nginx/2621
Ссылки в тексте:
[1] Перейти сразу к ответу, без предыстории: #answer
[2] Беглое гугление: http://yandex.ru/yandsearch?p=1&text=%D0%BA%D0%B0%D0%BA+%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C+%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82+%D1%81+%D0%BF%D0%BE%D1%80%D1%82%D0%B0+8080+%D0%BD%D0%B0+80&clid=46511&lr=43
[3] тут: http://habrahabr.ru/qa/451/#answer_1967
[4] www.lexa.ru/nginx-ru/msg21134.html: http://www.lexa.ru/nginx-ru/msg21134.html
Нажмите здесь для печати.