Цель: настроить сервер, который может получать запросы https и http от домена и перенаправлять их в приложение rails, работающее на сервере. Приложение rails работает на localhost: 3002, и все попытки подключиться к серверу выполняются с другого компьютера в Интернете.
Я следовал этому руководству: http://hints.macworld.com/article.php?story=20041129143420344
Вот определение моего виртуального хоста
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot "/Users/me/projects/myproject/public"
ServerName ssl.mydomain.com
ServerAlias *.ssl.mydomain.com
ProxyPass / http://localhost:3002/ # the rails app forwards all http requests to https
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
SSLProxyEngine On
RequestHeader set Front-End-Https "On"
CacheDisable *
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
DocumentRoot "/Users/me/projects/myproject/public"
ServerName ssl.mydomain.com
ServerAlias *.ssl.mydomain.com
SSLCertificateKeyFile "/private/etc/apache2/certs/webserver.nopass.key"
SSLCertificateFile "/private/etc/apache2/certs/newcert.pem"
SSLCACertificateFile "/private/etc/apache2/certs/demoCA/cacert.pem"
SSLCARevocationPath "/private/etc/apache2/certs/demoCA/crl"
ErrorLog "/Users/me/Desktop/ssl.log"
ProxyPass / https://localhost:3002/
ProxyPreserveHost on
</VirtualHost>
И когда я пытаюсь подключиться к серверу через веб-браузер, я получаю такую ошибку:
[Thu Feb 02 16:50:40 2012] [error] (502)Unknown error: 502: proxy: pass request body failed to 127.0.0.1:3002 (localhost)
[Thu Feb 02 16:50:40 2012] [error] [client 96.11.81.39] proxy: Error during SSL Handshake with remote server returned by /session/new
[Thu Feb 02 16:50:40 2012] [error] proxy: pass request body failed to 127.0.0.1:3002 (localhost) from 96.11.81.39 ()
как мне отладить / исправить это?
РЕДАКТИРОВАТЬ: ошибка веб-браузера: (Эта ошибка произошла на удаленном компьютере (относительно сервера))
URL, который я ввел, был https://ssl.mydomain.com
РЕДАКТИРОВАТЬ 2: ошибка, которую мне бросают рельсы:
Filter chain halted as [:ensure_proper_protocol] rendered_or_redirected.
Completed in 0ms (DB: 0) | 302 Found [http://ssl.devtinderbox.com/]
[2012-02-03 10:20:45] ERROR bad Request-Line `?p\001\003\001\000W\000\000\000\020\000\0009\000\0008\000\0005\000\000\026\000\000\023\000\000'.
не уверен, важно ли это, поскольку я думаю, что подтверждение SSL должно быть успешным, прежде чем rails узнают, что делать.
Я использую Mac OS X Lion.
(Просто копирую мой собственный ответ из дубликата на SO.)
Не беспокойтесь о HTTPS между вашим интерфейсом и внутренним сервером от localhost до localhost.
РЕДАКТИРОВАТЬ: чтобы уточнить, используйте ProxyPass / http://localhost:3002/
вместо того ProxyPass / https://localhost:3002/
В качестве альтернативы, если вы действительно хотите подключить обратный прокси-сервер к внутреннему серверу с помощью SSL (в основном полезно, когда этот сервер не там, где находится обратный прокси-сервер Apache Httpd), в дополнение к https://backend-server-address
, использовать SSLProxy*
директивы для настройки сертификатов CA, как описано в введение в mod_proxy
документация.
Вы перенаправляете оба порта 80 (чистый http) и 443 (зашифрованный https) на один и тот же порт 3002. Это НЕ будет работать.
Я не полностью понял вашу конфигурацию, но ошибка в подтверждении SSL объясняет, что происходит. По этой ошибке я могу сказать, что вы устанавливаете соединение с открытым текстом (http) с https (порт 443), которое явно не работает.
Вы получите аналогичную ошибку, если попытаетесь получить доступ к URL-адресу, например http: // сервер: 443 / и этот порт 443 открыт для https.
Я никогда не видел, чтобы для этого использовался ProxyPass; почему бы вам просто не использовать правило .htaccess для принудительного перенаправления на https, если кто-то подключается к http?
Примерно так (если у вас нет других правил htaccess):
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
Вы сказали, что используете рельсы? Если в приложении уже есть файл .htaccess, вам необходимо изменить его в зависимости от существующих правил. Если вы разместите текущий файл .htaccess, мы сможем его просмотреть.