如何重新启动 httpd 以在 Elastic Beanstalk 中的 EC2 实例上启用 HTTPS?

Posted

技术标签:

【中文标题】如何重新启动 httpd 以在 Elastic Beanstalk 中的 EC2 实例上启用 HTTPS?【英文标题】:How do you restart httpd to enable HTTPS on EC2 instance in Elastic Beanstalk? 【发布时间】:2020-12-14 07:56:27 【问题描述】:

问题

我正在尝试在 Elastic Beanstalk 中的 EC2 实例上启用 HTTPS。我在.ebextensions 目录中有一个https-instance.config 文件,其中包括停止和启动httpd 服务器。原始容器命令是这些(来自 AWS 文档here,并且在我的问题here 中也提到:

container_commands:
  01killhttpd:
    command: "killall httpd"
  02waitforhttpddeath:
    command: "sleep 3"

但是,我收到以下错误,详细信息请参见 cfn-init.log

2020-08-25 14:51:55,622 [INFO] -----------------------Starting build-----------------------
2020-08-25 14:51:55,631 [INFO] Running configSets: Infra-EmbeddedPostBuild
2020-08-25 14:51:55,634 [INFO] Running configSet Infra-EmbeddedPostBuild
2020-08-25 14:51:55,638 [INFO] Running config postbuild_0_tiny_app
2020-08-25 14:51:55,706 [ERROR] Command 01killhttpd (systemctl restart httpd.service) failed
2020-08-25 14:51:55,706 [ERROR] Error encountered during build of postbuild_0_tiny_app: Command 01killhttpd failed
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 542, in run_config
    CloudFormationCarpenter(config, self._auth_config).build(worklog)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 260, in build
    changes['commands'] = CommandTool().apply(self._config.commands)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/command_tool.py", line 117, in apply
    raise ToolError(u"Command %s failed" % name)
ToolError: Command 01killhttpd failed
2020-08-25 14:51:55,706 [ERROR] -----------------------BUILD FAILED!------------------------
2020-08-25 14:51:55,707 [ERROR] Unhandled exception during build: Command 01killhttpd failed
Traceback (most recent call last):
  File "/opt/aws/bin/cfn-init", line 171, in <module>
    worklog.build(metadata, configSets)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 129, in build
    Contractor(metadata).build(configSets, self)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 530, in build
    self.run_config(config, worklog)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 542, in run_config
    CloudFormationCarpenter(config, self._auth_config).build(worklog)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 260, in build
    changes['commands'] = CommandTool().apply(self._config.commands)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/command_tool.py", line 117, in apply
    raise ToolError(u"Command %s failed" % name)
ToolError: Command 01killhttpd failed

我已尝试从https-instance.config 中删除此重新启动,它可以构建但无法连接到 HTTPS。我还尝试将上述命令替换为其他命令以重新启动httpd 服务器,但这些导致与上述几乎相同的错误:

container_commands:
  01restart:
    command: "systemctl restart httpd"

container_commands:
  01restartservice:
    command: "systemctl restart httpd.service"

问题

如何重新启动 httpd 服务器以允许 HTTPS 连接到我的应用程序?

上下文

亚马逊 Linux 2 Python 3.7 环境中的 Flask 应用 使用单个 EC2 实例,因此没有负载均衡器 我只需要这个用于开发目的

这是我从 AWS 获得的完整的 https-instance.config

packages:
  yum:
    mod_ssl : []
    
files:
  /etc/httpd/conf.d/ssl.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
      LoadModule wsgi_module modules/mod_wsgi.so
      WSGIPythonHome /opt/python/run/baselinenv
      WSGISocketPrefix run/wsgi
      WSGIRestrictEmbedded On
      Listen 443
      <VirtualHost *:443>
        SSLEngine on
        SSLCertificateFile "/etc/pki/tls/certs/server.crt"
        SSLCertificateKeyFile "/etc/pki/tls/certs/server.key"
        
        Alias /static/ /opt/python/current/app/static/
        <Directory /opt/python/current/app/static>
        Order allow,deny
        Allow from all
        </Directory>
        
        WSGIScriptAlias / /opt/python/current/app/application.py
        
        <Directory /opt/python/current/app>
        Require all granted
        </Directory>
        
        WSGIDaemonProcess wsgi-ssl processes=1 threads=15 display-name=%GROUP \
          python-path=/opt/python/current/app \
          python-home=/opt/python/run/venv \
          home=/opt/python/current/app \
          user=wsgi \
          group=wsgi
        WSGIProcessGroup wsgi-ssl
        
      </VirtualHost>
      
  /etc/pki/tls/certs/server.crt:
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN CERTIFICATE-----
      MIID8zCCAtsCFGzyKrXOsCiyLHRPfBG75SlmQyXqMA0GCSqGSIb3DQEBCwUAMIG1
      ...
      PuulTMAZWNXHa0g+XbRTtOQDA8FA0vlA80B+rFUQESSo2Cw5JKXTaL9OpMMG/t9S
      qvv+vGuaIw==
      -----END CERTIFICATE-----

       
  /etc/pki/tls/certs/server.key:
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN RSA PRIVATE KEY-----
      MIIEogIBAAKCAQEA+OYzho7mXLUY6zTTqBIibsk2rfuJIO2xN2moIUNTqzJS8Yv6
      ...
      cSQsBzRR1Z5hl77Qa6gwiDx7rYswWtQt/8zsY8OUB3kg1SqriwI=
      -----END RSA PRIVATE KEY-----

container_commands:
  01restartservice:
    command: "systemctl restart httpd.service"

【问题讨论】:

每次新部署都会重新启动 httpd,这对于单个 EC2 实例来说已经足够了 【参考方案1】:

您的命令失败的原因是在 Amazon Linux 2 上 Python 3.7 环境没有没有 httpd(它的物理安装,但未激活)。您可以通过 SSH 进入实例并运行来验证这一点:

sudo systemctl status httpd

相反,there are nginxgunicorn 作为 wsgi。您提供的 AWS 文档链接适用于 Amazon Linux 1,而不是 2。

因此,应使用 .platform/nginx/conf.d/ 文件夹中的 nginx config files 设置 SSL 证书和 HTTP。

【讨论】:

好的,有趣。我永远不会从 AWS 文档中知道这一点——即使在他们的 Linux 2 特定文档 (docs.aws.amazon.com/AWSEC2/latest/UserGuide/…) 中,他们也谈到了“.platform/httpd/conf.d/”文件夹中的配置。我想我不知道配置会有什么不同——不是这方面的专家——但这可能是一个单独的问题。我目前没有 ssh 访问权限。 @whoopscheckmate 是的。可悲的是,AWS 文档现在很混乱。一些处理 Amazon Linux 1,其他部分讨论 Amazon Linux 2,并且不清楚他们何时这样做。 这个答案很有道理,但是我搜索了一种将httpd配置映射到nginx配置的清晰方法,但没有找到任何东西。这是我看到的使用 nginx 启用 https (techrepublic.com/article/how-to-enable-ssl-on-nginx) 的文档,但它似乎不正确。我的问题是,有没有一种简单的方法可以更改上面的配置文件来进行 nginx 设置?如果是这样,并且您愿意提供帮助,我可以再问一个问题。如果没有,我应该在他们的论坛上联系 AWS 吗? 我的另一个想法是以某种方式将 wsgi 更改为 httpd。这可能吗? @whoopscheckmate 目前不确定。也许你可以做到,但我现在不清楚该怎么做。【参考方案2】:

您可以将 AWS Linux 2 配置为使用 Apache (httpd),尽管它不是默认设置。

您可以在创建环境时通过控制台进行设置,也可以在配置文件中使用以下内容:

option_settings:
  aws:elasticbeanstalk:environment:proxy:
    ProxyServer: apache

如果你使用的是 Apache,重启它的命令是:

sudo systemctl restart httpd

另请注意,在 AWS Linux 2 上,Apache 现在只是转发到由 Gunicorn 提供服务的 localhost:8000,而不是通过 modwsgi 运行应用程序。

有关适用于 AWS Linux 2 的自签名证书的配置文件,请参阅 this answer。

【讨论】:

以上是关于如何重新启动 httpd 以在 Elastic Beanstalk 中的 EC2 实例上启用 HTTPS?的主要内容,如果未能解决你的问题,请参考以下文章

linux中如何重新启动httpd服务。

使用 Elastic Beanstalk 配置 httpd 服务超时

如何更改在 DOCKER 容器内运行的 apache 的 httpd.conf 并重新启动 apache

如何在Centos上使用ansible模块启动httpd服务

Linux下启动httpd失败,终端并未提示原因,怎么办?

如何使用 Cloudfront 设置 AWS Elastic Beanstalk 以在 PHP 堆栈上托管图像和视频