【问题标题】:Getting started with pyramid on a live server在实时服务器上开始使用金字塔
【发布时间】:2013-07-02 16:42:48
【问题描述】:

我已在本地虚拟环境中成功运行simplest pyramid app。我现在正在处理this tutorial,但我正试图通过在我的personal hosting 网站上运行它来更进一步,我用它来搞乱这样的东西。

我的问题是。我应该将什么作为参数传递给make_server(host, port, app),我应该去哪个 url 检查它是否正在运行?我知道这是一个简单的问题,我只是不习惯这种工作,documentation 对我没有帮助。

奖励积分:

就此类 Web 应用程序而言,在本地虚拟环境中运行它和在适当的主机上运行有什么区别?

重要编辑:我的提供商是 bluehost,由于我没有专用 IP,因此我不能打开自己的端口,这让我想知道这是否可能

【问题讨论】:

  • 您不应该在提供托管服务的支持论坛上问这个问题吗?如果是 VPS,那是一回事,如果是共享主机,那通常是某种控制面板……等等……等等……
  • @JonClements 不,我想问一个关于金字塔编程的问题,如果我的托管服务从未听说过金字塔,我不会感到惊讶
  • 答案是——你提供hostport,你运行的系统已经为你提供/打开了......所以这不是一个编程问题......他们'll可能允许一个港口知道如何从前端/无论如何到...所以,您需要找到它的内容,然后绑定到该端口... span>

标签: python python-2.7 pyramid wsgi


【解决方案1】:

事实上,在“真正的”网络服务器上托管 Python 应用程序与在本地计算机上运行它完全不同:在本地,您依赖于通常内置在框架中的小型网络服务器 - 但是,该网络服务器通常有局限性(例如,它可能只在单个线程中执行请求)。一些框架 (Django) 明确声明它们的内置服务器只能用于开发。

在生产环境中,Python 应用程序通常由“工业级”网络服务器提供服务,例如 Apache 或 Nginx,它负责处理诸如绑定到低端口、放弃特权、产生多个“工作”进程等问题,处理虚拟主机,清理格式错误的请求等。然后,Python 应用程序在 Web 服务器中运行,使用类似于 Apache 的 mod_wsgifcgi 或 Nginx 的 uwsgi 之类的东西。或者,您的应用程序作为一个单独的进程在 127.0.0.1:6543 上运行(就像您在本地执行的一样),“前端”网络服务器代理所有对您的应用程序的请求并返回。

重点是:在通用共享主机上托管 Python 应用程序可能会很棘手/不可能,除非您的提供商明确支持托管 WSGI 应用程序(请向他们询问说明)

另外一点:如今,只需 5 美元/月,您就可以获得一个不错的专用虚拟机,您可以在其中安装您想要的任何东西,而不是与任何人共享。通过这种方式托管 Python 网站比处理共享托管要容易得多。

啊,回答这个问题:在实际生产应用程序中,示例的最后两行:

server = make_server('0.0.0.0', 8080, app)
server.serve_forever()

将不会被使用 - 相反,您配置网络服务器,以便它知道 app 变量包含您的 wsgi 应用程序。请参阅文档中的next chapter 以获得更实际的示例。

【讨论】:

  • 我不同意,因为这取决于您拥有什么样的开发环境。例如,我在本地机器上使用 Bitnami 堆栈进行开发,当我最终启动它时,确实几乎没有什么不同。现在这取决于服务器,例如,如果您想将服务器设置为不同的东西,那么是的,这是完全不同的,除了基本原则保持不变。只是我的两分钱。
  • @GamesBrainiac:嗯,这就像说坐公共汽车和坐飞机是一回事——你基本上买了一张票然后登机——但这只是因为有人付出了所有努力为您驾驶/飞行的工作 :) 使用 Bitnami,您有一个预先配置的“应用程序”/VM,它处理您的本地机器的配置,然后您可以使用预构建的 VM 来创建生产服务器你可以部署到。我看不出这与我的观点有何矛盾,即“OP 应该使用‘真正的’网络服务器进行生产,这与 OP 当前使用的不同”
  • 确实如此,但实际上并没有太大区别,没有什么可以阻止已经将应用程序离线的人将其推送到在线。没什么大不了的。
  • @Sergey 我在哪里可以获得 5 美元/月的虚拟机?
  • @Stephan:试试 digitalocean.com。我在那里托管我的个人网站,非常好。
【解决方案2】:

尝试在 PythonAnywhere 上的免费帐户上运行该网站,这是最简单的入门。

您可以简单地从 github 上的文件创建一个 git repo,然后在 PythonAnywhere 上进行克隆(我特别提到了主机,因为您想知道如何在主机上运行某些东西,而我发现它是最简单的一个)。至于具体的,去他们的论坛问问吧,他们会帮你的。

我最初在那里创建了一个 django 网站,这是我的第一个在线应用程序,我学到了很多东西。

其次,在线运行您的应用程序和在您自己的计算机上运行您的应用程序几乎没有区别,而且这些差异因网络主机而异。因此,您必须更具体地了解您想知道的内容。

希望这会有所帮助。

【讨论】:

  • 它没有,我已经知道如何使用在线 python 解释器并且你没有回答我的任何问题,我投票是因为你付出了努力。
  • @Stephan:PythonAnywhere 确实提供了托管服务:“我们不仅支持 Django:Flask、Bottle、web2py……我们可以处理您想要使用的任何 WSGI Web 框架”:pythonanywhere.com/details/hosting
【解决方案3】:

您将使用makeserver 进行测试部署。在这种情况下,您通常会像这样包装一个小 runserver-Script(正如本教程也指出的那样):

#!/bin/env python
from wsgiref.simple_server import make_server
from yourapp.core import app # whereever your wsgi app lives

if __name__ == '__main__':
     server = make_server('0.0.0.0', 6547, app)
     print ('Starting up server on http://localhost:6547')
     server.serve_forever()

如果你想部署到 Apache,你需要 mod_wsgi 模块。我建议找一个支持 nginx 或 lighthttpd 的主机。使用 uwsgi 模块结合 virtualenv 可以非常方便地部署 WSGI 应用程序。

如果您的主机不允许您打开端口,您可以将 uwsgi 配置为使用 unix 套接字。

我曾经写过一篇博文,解释了如何在 uwsgi + nginx 后面部署 Django,您可能希望以此为起点来玩转部署设置:http://blog.johannesklug.de/2012/11/27/deploying-django-behind-nginx-with-uwsgi-and-virtualenv/

注意:你提供给 make_server 的同一个应用程序对象将被 uwsgi 用来启动它的工作进程并打开一个套接字。

uwsgi 的示例配置(未经测试,但摘自我的博客文章):

# uwsgi.ini
[uwsgi]
# path to where you put your project code
chdir=/home/project/project

# if the app object resides in core.py
module=core:app

# this switch tells uwsgi to spawn a master process,
# that will dynamically spawn new child processes for
# server requests
master=True
# uwsgi stores the pid of your master process here
pidfile=/home/project/master.pid
vacuum=True
# path to your virtual environment, you should be using virtualenv
home=/home/project/env/
# path to log file
daemonize=/home/project/log
# this is where you need to point nginx to,
# if you chose to put this in project home make
# sure the home dir is readable and executable by
# nginx
socket=/tmp/uwsgi.sock

nginx 的示例配置:

server {
    listen       80;
    server_name  yourserver.example.org;

    location / {
        uwsgi_pass unix:///tmp/uwsgi.sock;
        include uwsgi_params;
    }
}

【讨论】:

  • 谢谢,我们将不胜感激:)。
猜你喜欢
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 2018-03-07
  • 2013-12-03
  • 1970-01-01
相关资源
最近更新 更多