如何重新启动 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 nginx
和 gunicorn
作为 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?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Elastic Beanstalk 配置 httpd 服务超时
如何更改在 DOCKER 容器内运行的 apache 的 httpd.conf 并重新启动 apache