Nginx + ssl + Passenger 配置

Nginx + ssl + Passenger 配置

博客分类: Linux
nginxRailsRubyAccess应用服务器
好久没写blog了。

今天搞了半天才搞定 Nginx + SSL的配置,主要是对这方面不太理解,导致一开始的思路就错了,我原以为在Nginx下的一个server里同时监听 80 和 443端口,就可以让服务器自动处理这两种不同链接,如: http://www.domain.com 和 https://www.domain.com 。

但是在nginx.conf里面打开了 ssl on:之后,所有的链接变成https的,也就是变成了强制使用ssl协议了,而且使用了Rails的ssl_requirement插件后,会出现死循环的重定向,就是 http://www.domain.com 跳转到 https://www.domain.com,然后又重新跳转,我那个汗啊...

静下来研究了一番,发现对ssl还是要做重定向,思路就是:

1.在nginx里面配置两个server,一个监听80端口,一个监听443端口。

2.把所有使用https访问的请求,也就是使用443端口的请求转发给服务器的80端口来处理。

3.由于在应用里使用ssl_requirement来强制使用ssl链接,所有在应用了要求使用ssl的链接都不能使用http来访问,会强制进行跳转。

可能这个东西很多对服务器熟悉的人都明白,我还是搞了大半天才搞好,终究是底子差了点。

贴出配置文件:
Conf代码  收藏代码
#user  nobody; 
worker_processes  4; 
 
#error_log  logs/error.log; 
#error_log  logs/error.log  notice; 
#error_log  logs/error.log  info; 
 
#pid        logs/nginx.pid; 
 
 
events { 
    worker_connections  51200; 

 
 
http { 
    passenger_root /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.0; 
    passenger_ruby /usr/local/bin/ruby; 
 
    include       mime.types; 
    default_type  application/octet-stream; 
 
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' 
    #                  '$status $body_bytes_sent "$http_referer" ' 
    #                  '"$http_user_agent" "$http_x_forwarded_for"'; 
 
    log_format  main  '$remote_addr | $remote_user | [$time_local] | "$request" | ' 
                      '"$status" | $body_bytes_sent | "$http_referer" | ' 
                      '"$http_user_agent" | "$http_x_forwarded_for" | $request_time'; 
    #access_log  logs/access.log  main; 
 
    sendfile        on; 
    #tcp_nopush     on; 
 
    #keepalive_timeout  0; 
    keepalive_timeout  65; 
 
    gzip  on; 
    client_max_body_size 20m; 
    client_header_buffer_size 16k; 
    large_client_header_buffers 4 64k; 
 
    # forbid ip access 禁止用IP访问 
    server{ 
    listen 80; 
    server_name _; 
    return 404; 
    } 
 
    # dev server 
    server{ 
    listen 80; #监听正规的80端口 
    server_name www.domain.com; 
        access_log /home/domain.com/dev/log/access.log main; 
    rails_env development;  
 
    location ~ ^/(product|image|images)/ { 
        access_log off; 
        root /home/domain.com/dev/public; 
        expires 30d; 
        } 
    location / { 
        root /home/domain.com/dev/public; 
        passenger_enabled on; 
    } 
    } 
 
    # ssl to server 配置转发 
    upstream server { 
        server 127.0.0.1:80; 
    } 
 
    # ssl for dev 
    server{ 
    listen 443; #监听 SSL端口 
    server_name www.domain.com; 
    access_log /home/domain.com/dev/log/ssl_access.log main; 
     
    ssl on; 
    ssl_certificate server.crt; 
    ssl_certificate_key server_nopassword.key; 
     
        # 下面这堆都是抄的 
    location / { 
        proxy_pass  http://server; #把所有的请求转发给 server,看上面的配置 
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; 
        proxy_set_header Host $host; 
                proxy_set_header X-Real-IP $remote_addr; 
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header X-Forwarded-Proto https; 
        proxy_redirect     off; 
    } 
    } 

猜你喜欢

转载自schooltop.iteye.com/blog/2102779