在ubuntu的开发中使用mongrel和rails 3设置Apache for SSL时遇到问题

时间:2010-10-14 07:37:02

标签: ruby-on-rails

我正在尝试设置apache2,以便我可以在ubuntu上的rails 3应用程序中尝试开发ssl。

rails应用程序可以正常工作,除了我在Fire Fox中的https:

The connection was interrupted 
The connection to localhost:3000 was interrupted while the page was loading.

在控制台中我得到:

Thu Oct 14 15:56:28 +1100 2010: HTTP parse error, malformed request (127.0.0.1):
#<Mongrel::HttpParserError: Invalid HTTP format, parsing fails.>
Thu Oct 14 15:56:28 +1100 2010: REQUEST DATA: "\200U\001\003\000\000<\000\000\000\020\000\000\210\000\000\207\000\0008\000\000\204\000\0005\000\0009\000\000E\000\000D\000\0003\000\0002\000\000\226\000\000A\000\000\004\000\000\005\000\000/\000\000\026\000\000\023\000\376\377\000\000\n\000\000\377[������-V\214�e\277P-"
---
PARAMS: {}
---

使用https时,无论Apache是​​否正在运行,我都会收到上述控制台错误。这让我觉得https localhost:3000请求永远不会通过Apache,而是直接进入无法处理ssl的mongrel。

Apache正在运行,因为如果我转到http://localhost,我会获得默认的“It Works”网页。我很确定我创建的自签名证书也很好,因为转到https://localhost会在firefox中显示页面,询问您是否信任该站点,还可以让我看到证书的详细信息。

我已经完成了一堆谷歌搜索,我已经阅读并尝试了一些指南,但其中许多是几年,可能已经过时。

我最终卸载了apache2,然后重新安装了这个ubuntu指南https://help.ubuntu.com/10.04/serverguide/C/httpd.html它有一个关于https配置的部分,我做了它创建了这个文件 - &gt;在/ etc / apache2的/网站/有默认的SSL。看起来像这样

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin webmaster@localhost

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
</Directory>

ErrorLog /var/log/apache2/error.log

LogLevel warn

CustomLog /var/log/apache2/ssl_access.log combined

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

SSLEngine on

SSLCertificateFile    /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key

<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
    SSLOptions +StdEnvVars
</Directory>

BrowserMatch "MSIE [2-6]" \
    nokeepalive ssl-unclean-shutdown \
    downgrade-1.0 force-response-1.0
# MSIE 7 and newer should be able to use keepalive
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

# Used by Rails. Mentioned in all the Rails SSL tutorials.
RequestHeader set X_FORWARDED_PROTO "https"

</VirtualHost>
</IfModule>

我修改的所有内容都是证书和密钥位置     <VirtualHost *:443> 代替     <VirtualHost _default_:443> 并在最后添加了RequestHeader设置X_FORWARDED_PROTO“https”行,就像所有指南所说的那样。我不确定还有什么需要改变的。有一次我尝试将DocumentRoot设置为我的rails应用程序的公共文件夹,但它没有什么区别。

Apache重新启动正常,日志中没有错误。

我确信我必须非常接近让它工作但我已经花了很多时间多天而且无法理解它。我最好的猜测是我在上面的apache配置文件中有错误或遗漏。

我的问题是:

  1. 我如何知道请求是否实际通过apache?
  2. 如果不是为什么https ssl请求进入mongrel而不是由apache处理?
  3. 我需要做些什么才能让它发挥作用?

1 个答案:

答案 0 :(得分:0)

我塞满了很多年,仍然无法让它与apache一起工作,所以最终关注了这部分ubuntu rails guide并安装了Passenger。乘客很好,安装快捷,最好的https现在正在开发中。

我想我应该将defaultHost * .80设置为默认值并将virtualHost * .443设置为default-ssl,但无论如何这是我的sites-available / default-ssl文件现在的样子(store = rails app name):

<VirtualHost *:80>
  ServerName localhost
  DocumentRoot /home/daniel/www/store/public    
  <Directory /home/daniel/www/store/public>
    AllowOverride all              
    Options -MultiViews            
  </Directory>
</VirtualHost>

<VirtualHost *:443>
  ServerName localhost   
  SSLEngine on
  SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
  SSLCertificateFile /etc/ssl/certs/server.crt
  SSLCertificateKeyFile /etc/ssl/private/server.key
  RequestHeader set X_FORWARDED_PROTO 'https'
  DocumentRoot /home/daniel/www/store/public    
  <Directory /home/daniel/www/store/public>
     AllowOverride all              
     Options -MultiViews            
  </Directory>
</VirtualHost>

我的httpd.conf文件在开发模式下使用开发数据库设置了乘客和运行轨道的设置:

ServerName localhost
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.0/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.0
PassengerRuby /usr/bin/ruby1.8
RailsEnv development
RackEnv development

我仍然不能100%确定所有端口的工作方式,但我猜测使用http://localhost:3000 3000位使它直接进入mongrel而不是通过apache,因此为什么ssl以前从未工作过。通过上面的apache和乘客设置,我现在转到http://localhosthttps://localhost,它会通过apache运行。现在可以使用。