乘客2.2.4,nginx 0.7.61和SSL

有没有人有幸使用SSLconfigurationPassenger和nginx? 我花了好几个小时的时间试图让这个configuration能够正常工作,在网上使用了很less的资源,而且我不能在Rails控制器中显示任何转发的头文件。

例如,使用以下(及其多个变体)的conf文件:

server { listen 3000; server_name .example.com; root /Users/website/public; passenger_enabled on; rails_env development; } server { listen 3443; root /Users/website/public; rails_env development; passenger_enabled on; ssl on; #ssl_verify_client on; ssl_certificate /Users/website/ssl/server.crt; ssl_certificate_key /Users/website/ssl/server.key; #ssl_client_certificate /Users/website/ssl/CA.crt; ssl_session_timeout 5m; ssl_protocols SSLv3 TLSv1; ssl_ciphers ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X_FORWARDED_PROTO https; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_set_header X-SSL-Subject $ssl_client_s_dn; #proxy_set_header X-SSL-Issuer $ssl_client_i_dn; proxy_redirect off; proxy_max_temp_file_size 0; } 

和控制器中的Rails代码是这样的:

 request.headers.each { |k, v| RAILS_DEFAULT_LOGGER.error "Header #{k} Val #{v}" } 

其他标题出现,但不是在nginx中设置的,例如:

 Header rack.multithread Val false Header REQUEST_URI Val /login/new Header REMOTE_PORT Val 64021 Header rack.multiprocess Val true Header PASSENGER_USE_GLOBAL_QUEUE Val false Header PASSENGER_APP_TYPE Val rails Header SCGI Val 1 Header SERVER_PORT Val 3443 Header HTTP_ACCEPT_CHARSET Val ISO-8859-1,utf-8;q=0.7,*;q=0.7 Header rack.request.query_hash Val Header DOCUMENT_ROOT Val /Users/website/public 

我甚至更改了Passenger的abstract_request_handlermain_loop方法,也就是说,

 headers, input = parse_request(client) if headers if headers[REQUEST_METHOD] == PING process_ping(headers, input, client) else headers.each { |h,v| log.unknown "abstract_request_handler: #{h} = #{v}" } process_request(headers, input, client) end end 

只是发现所谓的添加头文件不存在:

 abstract_request_handler: HTTP_KEEP_ALIVE = 300 abstract_request_handler: HTTP_USER_AGENT = Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5 abstract_request_handler: PASSENGER_SPAWN_METHOD = smart-lv2 abstract_request_handler: CONTENT_LENGTH = 0 abstract_request_handler: HTTP_IF_NONE_MATCH = "b6e8b9afbc1110ee3bf0c87e119252ad" abstract_request_handler: HTTP_ACCEPT_LANGUAGE = en-us,en;q=0.5 abstract_request_handler: SERVER_PROTOCOL = HTTP/1.1 abstract_request_handler: HTTPS = on abstract_request_handler: REMOTE_ADDR = 127.0.0.1 abstract_request_handler: SERVER_SOFTWARE = nginx/0.7.61 abstract_request_handler: SERVER_ADDR = 127.0.0.1 abstract_request_handler: SCRIPT_NAME = abstract_request_handler: PASSENGER_ENVIRONMENT = development abstract_request_handler: REMOTE_PORT = 64021 abstract_request_handler: REQUEST_URI = /login/new abstract_request_handler: HTTP_ACCEPT_CHARSET = ISO-8859-1,utf-8;q=0.7,*;q=0.7 abstract_request_handler: SERVER_PORT = 3443 abstract_request_handler: SCGI = 1 abstract_request_handler: PASSENGER_APP_TYPE = rails abstract_request_handler: PASSENGER_USE_GLOBAL_QUEUE = false 

我厌倦了把头撞在墙上,所以我真的很感激任何帮助,我可以得到!

Passenger 3通过一个新的指令passenger_set_cgi_param来实现这个function,它的行为和proxy_set_header

例如,要将SSLvariables传递给Rack,可以这样做:

 server { listen 443 default ssl; # other SSL stuff goes here # other passenger stuff here passenger_set_cgi_param X_FORWARDED_PROTO https; passenger_set_cgi_param X-SSL-Raw-Cert $ssl_client_raw_cert; passenger_set_cgi_param X-SSL-Cert $ssl_client_cert; passenger_set_cgi_param X-SSL-Client-S-DN $ssl_client_s_dn; passenger_set_cgi_param X-SSL-Client-I-DN $ssl_client_i_dn; passenger_set_cgi_param X-SSL-Client-Verify $ssl_client_verify; } 

然后,您可以访问Rack::Request实例中的X-SSL-Raw-Cert和其他头文件(可从控制器中的#request访问)。

这还没有logging,但这里有一些更多的信息:

乘客与代理不同,它以某种方式使用SCGI。 唯一的解决办法就是在不同的(受保护的)端口上通过nginx进行代理。 这远非理想,但确实奏效。

嗯……你碰巧有一个位置指令,再次使用proxy_set_header?

我在问,因为fastcgi或proxy_set_header之类的数组指令在较低级别修改时不会从较高级别inheritance。 由于您在服务器级别声明了proxy_set_header,因此除了最新的指令之外,其他任何位于较低级别的proxy_set_header伪指令(例如“location”)都将清除此级别声明的所有内容。

我build议在乘客问题371中添加您的“明星”。http ://code.google.com/p/phusion-passenger/issues/detail? id=371

nginx / 1.8.1 Phusion_Passenger / 5.0.25的有效选项

passenger_enabled on; passenger_set_header X-SSL-Subject $ssl_client_s_dn; passenger_set_header X-Client-DN $ssl_client_s_dn; passenger_set_header X-Client-Verify $ssl_client_verify; passenger_set_header X-Forwarded-For "";