2017-07-26 171 views
0

我不能讓我的瓶的應用程序在https://my.domain/運行,但它確實成功地部署到正規http://my.domain/如何使用SSL將AWS EC2 Flask應用程序部署到HTTPS端口443?

我是能夠成功地獲取並測試SSL證書和驗證它們在https://my.domain:8888/

上Jupyter筆記本實例工作

我能夠修改/etc/httpd/conf/httpd.conf中的https://my.domain/以訪問我的根主目錄 - > /首頁/用戶名/密碼/

我也能夠成功地將HTTP請求重定向到https,但登陸頁面只是一個Linux資源管理器,而不是我的Flask a pplication。

也就是說,即使在httpd.conf中,ssl.conf中,並wsgi.conf發動對端口443瓶應用廣泛的編輯,它沒有這樣做,但仍然在80端口

而且,我注意到無論何時通過AWS CodeStar部署我的代碼更改,部署都會覆蓋我的EC2實例/etc/httpd/conf.d/wsgi.conf文件。

在亞馬遜這邊有一個設置,我必須配置,以便我的應用程序部署到正確的端口?還是需要編輯我的EC2實例服務器上的配置文件?或者是其他錯誤?

回答

0

爲了得到HTTPS/SSL爲瓶工作,使瓶2個端口上運行,你首先要在這裏遵循的提示:Https with Http in Flask Python

然而,這隻會設置你的瓶代碼運行與SSL。它不會在部署時實際啓動Flask進程。爲此,您需要編輯/etc/httpd/conf.d/wsgi.conf腳本以啓動wsgi守護程序的第二個實例。

您的wsgi.conf的默認腳本應該包含一個端口80的部分。您想複製此部分,添加您的SSL參數,然後編輯wsgi命令以擁有不同的變量名稱,否則Apache會在您投訴時發射。我有以下補充:

<VirtualHost *:443> 
    ServerName <MY SERVER NAME> 
    ServerAlias <MY SERVER NAME> 
    SSLEngine on 
    SSLCertificateFile <Server PEM file> 
    SSLCertificateKeyFile <Private Key PEM file> 
    SSLProtocol all -SSLv2 -SSLv3 
    SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA; 
    SSLHonorCipherOrder on 
    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 wsgi2 processes=1 threads=15 display-name=%{GROUP} \ 
    python-path=/opt/python/current/app:/opt/python/run/venv/lib64/python3.4/site-packages:/opt/python/run/venv/lib/python3.4/site-packages user=wsgi group=wsgi \ 
    home=/opt/python/current/app 
    WSGIProcessGroup wsgi2 
    </VirtualHost> 

請注意,您還可以在這個時候,除去WSGI,而是編輯端口80節有一個重定向到443,因爲這裏說明: Redirect to Https using Elastic Beanstalk ELBRedirect HTTP to HTTPS Apache2

測試這種配置通過重新使用

sudo service httpd restart 

然後Apache服務器啓動您的開發服務器

python application.py 

sudo /home/ec2-user/anaconda3/bin/python application.py 

之後,應看到瓶上的兩個端口上運行的!

但是,請注意,如果您在EC2實例上運行此代碼,則您的代碼可能已經部署並正在運行,因此您的端口可能正在使用中,您將看到「OSError:[Errno 98] Address already in use 「

但是你還沒有完成......哦,不,還有一個問題......

我發現從https://forums.aws.amazon.com/thread.jspa?threadID=163369這實際上如下(見的問題#1 what is difference between commands and container commands in elasticbean talkConfigure apache on elastic beanstalkwsgi user permissions on elastic beanstalk)...

通過CodeStar和彈性青苗顯然EC2應用並覆蓋你/etc/httpd/conf.d/ wsgi.conf文件。爲了防止/更正此問題,您需要編輯.ebextensions配置腳本​​以使用您自己的wsgi.conf文件。請注意,這有一個缺點,那就是不跟蹤亞馬遜可能對其默認腳本進行的更新。

首先,我複製了我想保留在.ebextensions目錄下的wsgi.conf文件。

接下來,我修改了.ebextensions/sshd.config文件(唯一一個我有在該目錄中),以添加以下內容:

files: 
    "/etc/httpd/conf.d/wsgi.conf" : 
    mode: "000777" 
    owner: root 
    group: root 
    content: | 
     <IfModule !wsgi_module> 
     LoadModule wsgi_module modules/mod_wsgi.so 
     </IfModule> 
     . . . 
     <VirtualHost *:443> 
     . . . 
     </VirtualHost> 
     LogFormat "%h (%{X-Forwarded-For}i) %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 

然後,在經過「文件:」一節中,我添加以下到配置結束:

container_commands: 
    02_update_wsgi: 
    command: > 
     cp .ebextensions/wsgi.conf ../wsgi.conf 

請注意,上述使用CONTAINER_COMMANDS,而不是命令。

關於這項技術的最大好處是,彈性魔豆自動運行的Apache服務器重新啓動命令,所以在部署之後,你不需要手動複製任何東西,或重新運行「命令服務的httpd重新啓動」

繼上述步驟將使您的Flask在HTTPS上運行SSL證書並正確部署。

相關問題