亚马逊AWS EC2微型实例上的Python CGI – 一个方法!

你怎么能让一个EC2微型实例从lighthttpd提供CGI脚本? 例如Python CGI?

那么,它花了半天时间,但是我已经使用lighttpd服务器获得了在免费的Amazon AWS EC2微型实例上运行的Python CGI。 我认为这会帮助我的同伴把所有的步骤放在一个地方。 用下面的简单步骤武装起来,只需要15分钟就能完成!

我有更多有经验的用户阅读这个问题的问题是:我所做的是否存在安全漏洞? (请参阅文件和目录权限。)

第1步:启动您的EC2实例并将其ssh。

[显然,您需要注册Amazon EC2并将密钥对保存到* .pem文件。 亚马逊会告诉你如何去做,我不会这样做。]

  1. login您的AWS账户并启动您的EC2实例。 networking上有这样做的教程。 请注意,Amazon向您呈现的默认实例大小“很小”。 这不是“微”,所以它会花费你的钱。 一定要手动select“微”。 (微型实例仅在第一年免费…)

  2. find正在运行的实例的公共DNS代码。 为此,请单击仪表板顶部窗格中的实例,最终将在底部窗格中看到“公用DNS”字段。 (你可能需要小心一点。)Public DNS看起来像这样:
    ec2-174-129-110-23.compute-1.amazonaws.com

  3. 启动你的Unix控制台程序。 (在Max OS X上,它被称为terminal,并位于应用程序 – >实用工具文件夹中。)

  4. cd到您的桌面系统上具有包含您的AWS密钥对的* .pem文件的目录。

  5. ssh到你的EC2实例,使用如下命令:
    ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >>

    所以,对我来说,这是:
    ssh -i amzn_ec2_keypair.pem [email protected]

  6. 你的EC2实例应该让你进入。

第2步:将lighttpd下载到您的EC2实例。

  1. 要安装lighttpd,您需要在您的EC2实例上进行root访问。 问题是:亚马逊不会让你以root身份login。 (不是直截了当,至less)。但是有一个解决方法。 input这个命令:
    sudo /bin/bash

  2. 系统提示字符将从$更改为#。 直到整个过程的最后一步,我们才会退出“sudo”。

  3. 安装lighttpd应用程序(版本1.4.28-1.3.amzn1):
    yum install lighttpd

  4. 为lighttpd安装FastCGI库(不需要,但为什么不?):
    yum install lighttpd-fastcgi

  5. testing你的服务器正在工作:
    /etc/init.d/lighttpd start

第3步:让外部世界看到你的服务器。

  1. 如果您现在尝试从桌面上的浏览器启动服务器,则会失败。 原因:默认情况下,Amazon AWS不会打开任何端口到您的EC2实例。 所以,你必须手动打开端口。

  2. 在桌面浏览器中转到您的EC2仪表板。 点击左侧窗格中的“安全组”。 一个或多个安全组将出现在右上方的窗格中。 select启动实例时分配给EC2实例的那个实例。

  3. 名为“允许的连接”的表格将出现在右下方的窗格中。 popup式菜单将让您select“HTTP”作为连接方法。

  4. 表中那行的其他值应该是:tcp,80,80,0.0.0.0/0

  5. 现在从浏览器的桌面上打你的EC2实例的服务器。 使用之前用于SSH的公有DNS地址。您应该看到lighttpd通用网页。 如果你不这样做,我不能帮你,因为我是一个小菜鸟。 🙁

步骤4:configurationlighttpd来提供CGI。

  1. 回到控制台程序,cd到lighttpd的configuration目录:
    cd /etc/lighttpd

  2. 要启用CGI,您需要取消注释<modules.conf>文件中的一行。 (我可以启用Fast CGI,但是最好的步骤是最好的!)你可以使用“ed”编辑器来做到这一点,如下所示:
    ed modules.conf
    /include "conf.d\/cgi.conf"/
    s/#//
    w
    q

  3. 创buildCGI程序所在的目录。 (/etc/lighttpd/lighttpd.conf文件决定了它的位置。)我们将在默认位置创build我们的目录,所以我们不必做任何configuration文件的编辑:
    cd /var/www/lighttpd
    mkdir cgi-bin
    chmod 755 cgi-bin

  4. 差不多了! 当然你需要把一个testingCGI程序放到cgi-bin目录下。 这里是一个:
    cd cgi-bin
    ed
    a
    #!/usr/bin/python
    print "Content-type: text/html\n\n"
    print "<html><body>Hello, pyworld.</body></html>"
    .
    w hellopyworld.py
    q
    chmod 655 hellopyworld.py

  5. 重新启动你的lighttpd服务器:
    /etc/init.d/lighttpd restart

  6. testing你的CGI程序。 在您的桌面浏览器中,点击此URL,replace您的EC2实例的公有DNS地址:
    http://<<Public DNS>>/cgi-bin/hellopyworld.py

    对我来说,这是:
    http://ec2-174-129-110-23.compute-1.amazonaws.com/cgi-bin/hellopyworld.py

第5步:就是这样! 清理,并感谢!

  • 要从前面给出的“sudo / bin / bash”命令中退出,请input:
    exit

  • 致谢:感谢:

    wiki.vpslink.com/Install_and_Configure_lighttpd

    www.cyberciti.biz/tips/lighttpd-howto-setup-cgi-bin-access-for-perl-programs.html

    aws.typepad.com/aws/2010/06/building-three-tier-architectures-with-security-groups.html

  • 祝你好运,伙计! 我对这个“问题”的非传统性质表示歉意,但是我从Stackoverflow得到了很多帮助,所以我急于回馈。

(奇怪的post,所以希望这不会是一个奇怪的答复)。

关于安全缺陷:在web服务器的文档根目录中存储cgi-bin脚本被认为是一种不好的做法。 甚至连W3C都没有在他们的万维网安全常见问题解答中的 “C:更安全的编译语言”

考虑以下情况。 为方便起见,您已决定使用.cgi扩展名将CGI脚本识别到服务器。 稍后,您需要对解释的CGI脚本进行一些小改动。 用Emacs文本编辑器打开它并修改脚本。 不幸的是,编辑留下了文档树中的脚本源代码的备份副本。 尽pipe远程用户不能通过获取脚本本身来获取源代码,但他现在可以通过盲目地请求URL来获得备份副本:

  http://your-site/a/path/your_script.cgi~ 

(这是将CGI脚本限制到cgi-bin并确保cgi-bin与文档根目录是分开的另一个很好的理由。)

这不像在文档根目录中写入文件的能力那么重要。 然而,攻击者可以获取cgi的源代码,并对其进行定向攻击,并将其用作服务器的垫脚石。

为了缓解这个问题,你可以在lighttpd.conf(或其中的一些变体)中添加以下几行,将cgi-bin指向与/ var / www / lighttpd文档根目录不同的目录。

 $HTTP["url"] =~ "/cgi-bin/" { cgi.assign = ( "" => "" ) } alias.url = ( "/cgi-bin/" => "/usr/lib/cgi-bin/" ) 

这需要lighttpd的cgi和别名模块。