Я размещаю два веб-сайта на сервере Apache2, работающем на Raspberry Pi3 (более подробная информация о версиях и конфигурациях приведена ниже): Website1 — это статический веб-сайт, который я написал с нуля, а website2 работает на Wordpress.
Я жил в квартире, где провайдер предоставлял статический публичный IP, но недавно переехал в новый дом, где провайдер не предоставляет такой возможности. Я пытался все перенастроить, но не могу заставить все работать снова.
Конфигурации
У меня Raspberry Pi 3, на котором установлена последняя версия Raspbian.
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
На моем роутере (модель: Alcatel-Lucent G240W-B
) я открылпорт XX для httpипорт YY для ssh(Я не использую стандартные порты для повышения безопасности)
Application Name | WAN Connection | WAN Port | LAN Port | Internal Client | Protocol | Status
Customer settings | {my_wan_connection} | XX~XX | XX~XX | 192.168.1.100 | TCPorUDP | ACTIVE
Customer settings | {my_wan_connection} | YY~YY | YY~YY | 192.168.1.100 | TCPorUDP | ACTIVE
Я использую apache2
$ apache2 -v
Server version: Apache/2.4.25 (Raspbian)
Server built: 2019-08-19T19:25:31
с двумя включенными веб-сайтами
$ sudo apache2ctl -S
VirtualHost configuration:
*:XX is a NameVirtualHost
default server mydomain.ddns.net (/etc/apache2/sites-enabled/website1.com.conf:1)
port XX namevhost mydomain.ddns.net (/etc/apache2/sites-enabled/website1.com.conf:1)
alias website1.com
alias www.website1.com
port XX namevhost mydomain.ddns.net (/etc/apache2/sites-enabled/website2.com.conf:1)
alias www.wesbiste2.com
alias wesbiste2.com
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex default: dir="/var/run/apache2/" mechanism=default
Mutex mpm-accept: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
Define: MODSEC_2.5
Define: MODSEC_2.9
User: name="www-data" id=33
Group: name="www-data" id=33
Это моеports.conf
$ sudo cat ports.conf
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf
Listen 0.0.0.0:XX
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
The/etc/apache2/sites-enables/website1.conf
<VirtualHost *:XX>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin [email protected]
ServerName mydomain.ddns.net
ServerAlias website1.com
ServerAlias www.website1.com
DocumentRoot /var/www/website1/public_html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
И/etc/apache2/sites-enables/website2.conf
<VirtualHost *:XX>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin [email protected]
ServerName mydomain.ddns.net
ServerAlias www.website2.com
ServerAlias website2.com
DocumentRoot /var/www/website2/public_html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Я установил динамический DNS с NoIP (mydomain.ddns.net), который обновляется через мой маршрутизатор.
Что работает, а что нет
SSH работает отлично, и я могу подключиться к своему Raspberry Pi как внутри домашней сети, так и извне. Когда я проверяю, открыта ли дверь YY с помощью инструмента проверки портов, я получаю положительный ответ.
HTTP более проблематичен: несмотря на то, что дверь закрыта (по крайней мере, по данным проверки портов), я могу видеть website1 (который является сервером Apache по умолчанию) из
- внутренний IP-адрес: 192.168.1.100:XX
- публичный IP-адрес: {my-public-ip}:XX
- динамическое DNS-имя хоста mydomain.ddns.net
Однако, поскольку таким образом я могу получить доступ только к website1, а не к website2, я попробовал отключить website1 ( sudo a2dissite website1.com.conf
) и перезапустить apache ( sudo systemctl restart apache2
)
$ sudo apache2ctl -S
VirtualHost configuration:
*:XX mydomain.ddns.net (/etc/apache2/sites-enabled/website2.com.conf:1)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex default: dir="/var/run/apache2/" mechanism=default
Mutex mpm-accept: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
Define: MODSEC_2.5
Define: MODSEC_2.9
User: name="www-data" id=33
Group: name="www-data" id=33
Однако я по-прежнему не могу получить доступ к website2 ни с внутреннего, ни с публичного IP-адреса, ни с имени хоста DDNS.
Изменение URL-адреса Wordpress
Я думал, что это может быть связано с Wordpress, и действительно, я обнаружилЭта статьяи следовал инструкциям, чтобы [изменить URL-адрес непосредственно в базе данных][2]. Действительно, значения «home» и «url» были равны моему старому общедоступному статическому IP-адресу, поэтому я изменил его на свой DDNS (myhostname.ddns.net). Однако сайт по-прежнему недоступен
К вашему сведению, моим главным приоритетом было бычтобы иметь возможность получить доступ к веб-сайту2и просмотреть его содержимое, будь то через внутренний или внешний IP, или DDNS hostnmae.
решение1
Так что, я думаю, я понял... возможно... Проблема может быть в том, как вы это тестируете. На компьютере, который вы используете для тестирования (не RPi), отредактируйте файл hosts, чтобы указать и www.website1.com, и www.website2.com на внутренний IP-адрес вашего RPi (при этом вы находитесь в одной сети).
Инструкции по файлу hosts: https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/
Затем откройте в своем браузере сайт www.website1.com, а затем www.website2.com.
Если это сработает, измените файл hosts, чтобы направить эти веб-сайты на ваш внешний IP-адрес.
Объяснение: Часть рукопожатия между веб-браузером и веб-сервером включает в себя то, какой сайт вы запрашиваете. Это позволяет размещать более одного сайта на одном веб-сервере. Поскольку в вашей конфигурации Apache указаны псевдонимы www.website1.com и www.website2.com, но вы запрашиваете веб-сайт для вашего IP-адреса. Apache ответил www.website1.com, потому что он установлен в качестве вашего сайта по умолчанию.
решение2
В конце концов, дело было в настройке маршрутизатора: входящий порт (порт WAN) должен быть установлен на 80, а внутренний порт (порт LAN) — на тот порт, который прослушивает мой маршрутизатор.