Получите Apache2, работающий с nginx в качестве обратного прокси
Моя цель - предоставить безопасный почтовый сервис с нового сервера Ubuntu 16.04. Для этого я хочу настроить Apache2 с запущенным nginx в качестве обратного прокси-сервера.
Моя непосредственная проблема заключается в том, что Apache не запускается, утверждая, что не назначен SSL-сертификат (см. Вывод из терминала в конце этого вопроса), хотя я (пока) не пытаюсь использовать HTTPS.
Мои вопросы:
- Если Apache работает на локальном порту, разве мало того, что nginx знает о каких-либо SSL-сертификатах?
- Что мне нужно сделать, чтобы Apache начал слушать по локальному адресу?
Вот мое понимание того, что мне нужно сделать. Буду признателен, если вы укажете, где мое понимание ошибочно.
- Установите nginx и Apache2
- Создайте блок сервера nginx, чтобы:
- Прослушивание портов 80 (и 443)
- (Перенаправить трафик с порта 80 на порт 443)
- (Сделка с сертификацией SSL)
- Направляйте любые запросы на PHP-файл в Apache на 127.0.0.1:8080.
- Настройте Apache для:
- Слушайте только через порт 8080, а не через порт 443
- Оставаться в неведении о любой сертификации SSL
Мне нравится иметь дело с одной проблемой за раз, поэтому в настоящее время я оставляю в стороне вопрос о сертификатах SSL и пытаюсь заставить Apache работать с nginx в качестве его обратного прокси-сервера только на порту 80.
Вот файлы конфигурации, которые у меня есть:
Nginx
$ sudo nano /etc/nginx/sites-available/webmail
server {
listen 80;
root /var/www/webmail/web;
index index.php index.html index.htm;
server_name webmail.mydomain.com;
# Look for...
# * the exact path
# * a default (index.*) file, considering the path to be a directory
# ... and if that fails:
# * get the index.php script at the root to deal with the request
location / {
try_files $uri $uri/ /index.php;
}
# If the chosen path leads to a PHP fie:
# * forward the request to Apache running at 127.0.0.1:8080
# * after having modified certain headers
location ~ \.php$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
# If there are any Apache HT files in the chosen directory
# ignore any direct requests for them
location ~ /\.ht {
deny all;
}
}
Apache2
$ sudo nano /etc/apache2/sites-available/webmail.conf
<VirtualHost 127.0.0.1:8080>
ServerName webmail.mydomain.com
ServerAdmin admin@mydomain.com
DocumentRoot /var/www/webmail/web
<Directory "/var/www/webmail/web">
Options FollowSymLinks
AllowOverride All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Порты Apache2
$ sudo nano /etc/apache2/ports.conf
Listen 127.0.0.1:8080
#<IfModule ssl_module>
# Listen 443
#</IfModule>
#<IfModule mod_gnutls.c>
# Listen 443
#</IfModule>
Обратите внимание, что я явно не прошу Apache прослушивать порт 443. Есть ли другое место в каком-либо другом конфигурационном файле, который сообщает Apache прослушивать порт 443?
Вот мои заполнители PHP и HTML-файлов, в их ожидаемых местах:
index.php
$ sudo nano /var/www/webmail/web/index.php
<?php
echo "PHP from /var/www/webmail/web/index.php\n";
?>
index.html
$ sudo nano /var/www/webmail/web/index.html
<html>
HTML from /var/www/webmail/web/index.html
</html>
В браузере запрос к http://webmail.mydomain.com/index.html выполняется должным образом, но запрос к http://webmail.mydomain.com/index.php приводит к тому, что файл загружается, а не выполняется,
Вот что происходит, когда я пытаюсь запустить Apache2:
$ sudo /etc/init.d/apache2 restart
[ ok ] Restarting apache2 (via systemctl): apache2.service.
$ sudo service apache2 status
* apache2.service - LSB: Apache2 web server
Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
`-apache2-systemd.conf
Active: inactive (dead) since <Time>; 3s ago
Docs: man:systemd-sysv-generator(8)
Process: 16059 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS)
Process: 16043 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)
systemd[1]: Starting LSB: Apache2 web server...
apache2[16043]: * Starting Apache httpd web server apache2
apache2[16043]: Action 'start' failed.
apache2[16043]: The Apache error log may have more information.
apache2[16043]: *
apache2[16059]: * Stopping Apache httpd web server apache2
apache2[16059]: *
systemd[1]: Started LSB: Apache2 web server.
Вот содержимое файла error.log:
$ sudo nano /var/log/apache2/error.log
[ssl:emerg] [pid 15943] AH02572: Failed to configure at least one certificate and key for myhostname.hostingservice.com:443
[ssl:emerg] [pid 15943] SSL Library Error: error:140A80B1:SSL routines:SSL_CTX_check_private_key:no certificate assigned
[ssl:emerg] [pid 15943] AH02311: Fatal error initialising mod_ssl, exiting. See /var/log/apache2/error.log for more information
(Это в var/log/apache2/error.log, и больше информации нет.)
Что я пропустил?
ПРИМЕЧАНИЕ. Основное назначение этого сервера - доставка приложения Meteor. Я решил сделать это с помощью Phusion Passenger и Nginx. В дополнение к почтовой службе Apache также будет использоваться для доставки сайта WordPress.
1 ответ
У меня это работает сейчас. Я забыл удалить /etc/apache2/sites-disabled/default-ssl.conf
Апач пытался запустить безопасный сайт, который не был нужен.
Я впоследствии использовал sudo certbot --nginx
получить сертификат для Nginx, и теперь все работает надежно.