使用SSL解密卸载到ELB,在AWS EC2 nginx上的重定向中添加了无效端口

时间:2014-05-30 17:09:45

标签: ssl nginx amazon-ec2 amazon-elb

在AWS上,我尝试迁移在nginx上运行的PHP Symfony应用程序。我希望能够通过直接与EC2服务器通信并通过ELB(公共路径)来测试应用程序。

我已设置弹性负载均衡器来解密所有SSL流量,并通过端口80将其传递到我的EC2服务器,并通过端口80将端口80直接传递到我的EC2服务器上。

最初这会在我的应用中引起无限重定向,但我研究并通过添加

来修复此问题
fastcgi_param HTTPS $https;

使用一些自定义逻辑来查看$ http_x_forwarded_proto,以确定它实际上是通过SSL的。

我仍然无法解决一个问题。当用户登录Symfony应用程序时,如果他们通过ELB来,表单POST最终会返回重定向   https://elb.mysite.com:80/dashboard 代替   https://elb.mysite.com/dashboard 这会给用户一个" SSL连接错误"。

的错误

我已尝试过设置

fastcgi_param SERVER_PORT $fastcgi_port; 

迫使它远离80,我也添加了

port_in_redirect off

指令但两者没有区别。

我发现解决此问题的唯一方法是改变ELB 443监听器以通过https传递流量。 EC2服务器已配置自认证SSL证书。但这意味着EC2服务器正在浪费容量来执行这种不必要的第二次解密。

非常感谢任何帮助。也许在nginx中有一个单独的方法告诉POST请求不应用端口号?

Nginx vhost config:

server {
        port_in_redirect off;

        listen 80;
        listen 443 ssl;

        ssl_certificate /etc/nginx/ssl/mysite.com/self-ssl.crt;
        ssl_certificate_key /etc/nginx/ssl/mysite.com/self-ssl.key;

        # Determine if HTTPS being used either locally or via ELB
        set $fastcgi_https off;
        set $fastcgi_port 80;
        if ( $http_x_forwarded_proto = 'https' ) {
          # ELB is using https
          set $fastcgi_https on;
#          set $fastcgi_port 443;
        }
        if ( $https = 'on' ) {
          # Local connection is using https
          set $fastcgi_https on;
#          set $fastcgi_port 443;
        }

        server_name *.mysite.com my-mysite-com-1234.eu-west-1.elb.amazonaws.com;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log error;

        rewrite ^/app\.php/?(.*)$ /$1 permanent;

        location / {
                port_in_redirect off;
                root /var/www/vhosts/mysite.com/web;
                index app.php index.php index.html index.html;
                try_files $uri @rewriteapp;
        }

        location ~* \.(jpg|jpeg|gif|png)$ {
               root /var/www/vhosts/mysite.com/web;
               access_log off;
               log_not_found off;
               expires 30d;
        }

        location ~* \.(css|js)$ {
                root /var/www/vhosts/mysite.com/web;
                access_log off;
                log_not_found off;
                expires 2h;
        }

        location @rewriteapp {
           rewrite ^(.*)$ /app.php/$1 last;
        }

        location ~ ^/(app|app_dev|config)\.php(/|$) {
                port_in_redirect off;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                fastcgi_param HTTPS $fastcgi_https;
#                fastcgi_param SERVER_PORT $fastcgi_port;
                #fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/vhosts/mysite.com/web$fastcgi_script_name;
                include fastcgi_params;
        }
}

参考文献: FastCGI application behind NGINX is unable to detect that HTTPS secure connection is used

https://serverfault.com/questions/256191/getting-correct-server-port-to-php-fpm-through-nginx-and-varnish

http://nginx.org/en/docs/http/ngx_http_core_module.html#port_in_redirect

1 个答案:

答案 0 :(得分:0)

最后通过另一个渠道获得解决方案。

答案是在文件fastcgi_params文件中用#注释掉SERVER_PORT。

非常感谢来自Nginx的Maxim。