gpt4 book ai didi

amazon-web-services - 在单个 docker 容器环境中配置 nginx (AWS ElasticBeanstalk)

转载 作者:行者123 更新时间:2023-12-04 08:07:24 24 4
gpt4 key购买 nike

我目前正在使用 single container docker environment 部署 Django + uWSGI 应用程序在 AWS ElasticBeanstalk 中。此环境已随 nginx 一起提供,我目前正在尝试对其进行配置。

我正在努力实现以下目标:

  • 在环境的负载均衡器上终止 HTTPS
  • 使用nginx(随环境提供)将HTTP 请求重定向到HTTPS
  • 将请求从 nginx 传递到 uwsgi

  • 环境信息:
  • 配置和解决方案堆栈名称 : 单容器 Docker 1.11
    版本 2.3.0
  • AMI : 64 位 Amazon Linux 2016.09 v2.3.0 运行 Docker
    1.11.2
    2016.09.0
  • Docker 版本 : 1.11.2
  • 代理服务器 :nginx 1.10.1

  • 这是我目前的配置:

    .ebxtensions/00-loadbalancer-terminatehttps.config
    option_settings:
    aws:elb:listener:443:
    ListenerEnabled: true
    ListenerProtocol: HTTPS
    SSLCertificateId: <resource-id-here>
    InstancePort: 443
    InstanceProtocol: HTTP
    aws:elb:listener:80:
    ListenerEnabled: true
    ListenerProtocol: HTTP
    InstancePort: 80
    InstanceProtocol: HTTP

    .ebextensions/01-nginx-proxy.config
    files:
    "/etc/nginx/sites-available/test.domain.com.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
    server {
    listen 80;
    server_name test.domain.com;
    access_log /var/log/nginx/$server_name.access.log;

    location / {
    return 301 https://$server_name$request_uri;
    }

    location = /status/ {
    access_log /var/log/nginx/$server_name.healthd.log healthd;
    include uwsgi_params;
    uwsgi_pass docker;
    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-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    }

    }

    server {
    listen 443;
    server_name test.domain.com;
    access_log /var/log/nginx/$server_name.access.log;

    location / {
    include uwsgi_params;
    uwsgi_pass docker;
    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-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    client_max_body_size 100m;
    }

    location /static {
    alias /var/www/static;
    }
    }

    commands:
    00_enable_site:
    command: 'rm -f /etc/nginx/sites-enabled/* && ln -s /etc/nginx/sites-available/test.domain.com.conf /etc/nginx/sites-enabled/test.domain.com.conf'

    .ebextensions/02-healthcheckurl.config
    option_settings:
    - namespace: aws:elasticbeanstalk:application
    option_name: Application Healthcheck URL
    value: /status/

    application.ini (uwsgi 配置)
    [uwsgi]
    master = true
    socket = :3031
    processes = 4
    enable-threads = true
    threads = 2
    chdir = /opt/app/
    wsgi-file = test/wsgi.py
    logto2 = /var/log/uwsgi.log
    callable = application
    py-autoreload = 3

    现在,在测试配置时:

    正在检查 http://test.domain.com/status/工作正常
    $ wget http://test.domain.com/status/
    --2017-01-14 23:00:18-- http://test.domain.com/status/
    Resolving test.domain.com... 52.xx.xx.xx, 52.xx.xx.xy
    Connecting to test.domain.com|52.xx.xx.xx|:80... connected.
    HTTP request sent, awaiting response... 200 OK

    正在检查 http://test.domain.com/hello/没有按预期工作。它重定向正常,但它会挂起,直到请求超时。
    $ wget http://test.domain.com/hello/
    --2017-01-14 22:59:13-- http://test.domain.com/hello/
    Resolving test.domain.com... 52.xx.xx.xx, 52.xx.xx.xy
    Connecting to test.domain.com|52.xx.xx.xx|:80... connected.
    HTTP request sent, awaiting response... 301 Moved Permanently
    Location: https://test.domain.com/hello/ [following]
    --2017-01-14 22:59:15-- https://test.domain.com/hello/
    Connecting to test.domain.com|52.xx.xx.xx|:443... connected.
    HTTP request sent, awaiting response... 408 REQUEST_TIMEOUT
    2017-01-14 23:00:17 ERROR 408: REQUEST_TIMEOUT.

    最佳答案

    按照@deviavir 的建议,我需要允许从负载均衡器到 EC2 实例的流量。

    这是我的最终配置:

       .ebextensions
    |-- 00-resources.config
    |-- 01-nginx-proxy.config

    .ebextensions/00-resources.config :
    Resources:
    AWSEBSecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
    GroupDescription: "Allow traffic to ports 80 and 443 from the load balancer. Restrict SSH access."
    AWSEBLoadBalancer:
    Type: "AWS::ElasticLoadBalancing::LoadBalancer"
    Properties:
    Listeners:
    - {LoadBalancerPort: 80,
    Protocol: 'HTTP',
    InstancePort: 80,
    InstanceProtocol: 'HTTP'}
    - {LoadBalancerPort: 443,
    Protocol: 'HTTPS',
    InstancePort: 443,
    InstanceProtocol: 'HTTP',
    SSLCertificateId: 'arn:aws:acm:us-east-1:xxxx:certificate/yyyy'}
    HealthCheck:
    Target: HTTP:80/status/
    HealthyThreshold: '3'
    UnhealthyThreshold: '5'
    Interval: '30'
    Timeout: '5'
    Port80SecurityGroupIngress:
    Type: "AWS::EC2::SecurityGroupIngress"
    Properties:
    GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
    IpProtocol: tcp
    ToPort: 80
    FromPort: 80
    SourceSecurityGroupName: {"Fn::GetAtt" : ["AWSEBLoadBalancer" , "SourceSecurityGroup.GroupName"]}
    Port443SecurityGroupIngress:
    Type: "AWS::EC2::SecurityGroupIngress"
    Properties:
    GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
    IpProtocol: tcp
    ToPort: 443
    FromPort: 443
    SourceSecurityGroupName: {"Fn::GetAtt" : ["AWSEBLoadBalancer" , "SourceSecurityGroup.GroupName"]}
    SSHSecurityGroupIngress:
    Type: "AWS::EC2::SecurityGroupIngress"
    Properties:
    GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
    IpProtocol: tcp
    ToPort: 22
    FromPort: 22
    CidrIp: xx.xx.xx.xx/yy

    .ebextensions/01-nginx-proxy.config :
    files:
    "/etc/nginx/sites-available/test.domain.com.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
    server {
    listen 80;
    server_name test.domain.com;
    access_log /var/log/nginx/$server_name.access.log;

    location / {
    return 301 https://$server_name$request_uri;
    }

    location = /status/ {
    access_log /var/log/nginx/$server_name.status.log;
    uwsgi_pass docker;
    include uwsgi_params;
    }

    }

    server {
    listen 443;
    server_name test.domain.com;
    access_log /var/log/nginx/$server_name.access.log;

    location / {
    uwsgi_pass docker;
    include uwsgi_params;
    client_max_body_size 100m;
    }

    location /static/ {
    root /var/www;
    }
    }

    commands:
    00_enable_site:
    command: 'rm -f /etc/nginx/sites-enabled/* && ln -s /etc/nginx/sites-available/test.domain.com.conf /etc/nginx/sites-enabled/test.domain.com.conf'

    关于amazon-web-services - 在单个 docker 容器环境中配置 nginx (AWS ElasticBeanstalk),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41658096/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com