
В качестве предупреждения: я задавал этот вопрос на Webmaster StackExchange и ServerFault, и оба раза он был закрыт. На ServerFault меня перенаправили сюда.
Я схожу с ума, пытаясь понять, почему это не работает. Это мой первый опыт работы с Apache и CentOS. Это для хобби-сайта, чтобы помочь мне развить свои навыки.
Вот что я пытаюсь сделать: у меня есть приложение ASP.NET Core, настроенное на сервере. Файлы находятся в /var/www/myapp
. У меня есть настройка службы для него, и она запущена и работает на порту 5000. Я могу сделать cURL к нему и получить правильный ответ:
curl -H 'Content-Type: application/json' -X POST -d '<json>' http://127.0.0.1:5000/graphql
Теперь я хочу иметь возможность взаимодействовать с этим приложением через обратный прокси-сервер на моем домене. Я начал с того, что следовал документации Microsoft по этому поводу:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-apache?view=aspnetcore-3.1
Это не сработало для меня, поэтому я начал проводить кучу исследований, и я просто потерялся. Независимо от того, что я делаю, я получаю ошибки 404. Not Found. Боже, как мне это надоело lol. Вот где я сейчас нахожусь. У меня есть имя файла конфигурации myapp.conf
в /etc/apache2/conf.d
:
<VirtualHost *:80>
ServerName <domain>.com
ServerAlias *.<domain>.com
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
ErrorLog /etc/apache2/logs/myapp-error.log
CustomLog /etc/apache2/logs/myapp-access.log common
</VirtualHost>
Я знаю, что мой файл конфигурации виден:
apachectl -S | grep myapp
*:80 <domain>.com (/etc/apache2/conf.d/myapp.conf:1)
Я знаю, что прокси-модули включены:
httpd -M | grep proxy
proxy_module (shared)
proxy_fcgi_module (shared)
proxy_http_module (shared)
proxy_wstunnel_module (shared)
Когда я пытаюсь загрузить их вручную, просто чтобы быть уверенным, Apache говорит мне, что они уже включены, и пропускает их. Я также знаю, что моя конфигурация в порядке:
apachectl -t
Syntax OK
я используюБессонницадля проверки обратного прокси. Вот как выглядит обмен:
* Preparing request to http://<domain>.com/graphql
* Using libcurl/7.69.1 OpenSSL/1.1.1g zlib/1.2.11 brotli/1.0.7 libidn2/2.1.1 libssh2/1.9.0 nghttp2/1.40.0
* Current time is 2020-06-27T01:22:57.448Z
* Disable timeout
* Enable automatic URL encoding
* Enable SSL validation
* Enable cookie sending with jar of 1 cookie
* Too old connection (488 seconds), disconnect it
* Connection 46 seems to be dead!
* Closing connection 46
* Trying <ip_address>:80...
* Connected to <domain>.com (<ip_address>) port 80 (#47)
> POST /graphql HTTP/1.1
> Host: <domain>.com
> User-Agent: insomnia/2020.2.2
> Content-Type: application/json
> Accept: */*
> Content-Length: 343
| <json>
* upload completely sent off: 343 out of 343 bytes
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< Date: Sat, 27 Jun 2020 01:22:57 GMT
< Server: Apache
< Content-Length: 315
< Content-Type: text/html; charset=iso-8859-1
* Received 315 B chunk
* Connection #47 to host <domain>.com left intact
Исходя из всего, что я прочитал... нет никаких причин, по которым я должен получать эти 404. Кстати, я перепробовал десятки и десятки различных способов настройки каждой директивы в файле конфигурации. Я с радостью сделаю все это снова, если у вас есть предложения.
Одна вещь, которую я пытался выяснить, но не смог, это есть ли способ протестировать запрос на вашей настройке Apache и просто посмотреть, как Apache маршрутизирует запрос. Так что было бы неплохо, если бы кто-нибудь знал.
решение1
Итак, после многих проб и ошибок, я думаю, что проблема в том, что мое определение виртуального хоста просто обрабатывалось после определения по умолчанию в httpd.conf. Когда я изменил определение виртуального хоста, чтобы прослушивать IP-адрес сервера, а не *:80
, это сработало.
<VirtualHost *:80>
...
</VirtualHost>
to
<VirtualHost <my-server-ip-address>:80>
...
</VirtualHost>
Мне бы хотелось выяснить, почему *:80 не работает, но, возможно, это тема для другого раза.