4

我已经在本地虚拟环境中成功运行了最简单的金字塔应用程序。我现在正在编写本教程,但我正试图通过在我用来处理此类内容的个人托管网站上运行它来更进一步。

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

奖励积分:

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

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

4

3 回答 3

5

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

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

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

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

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

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

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

于 2013-07-04T21:12:35.293 回答
3

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

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

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

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

希望这可以帮助。

于 2013-07-04T16:38:38.570 回答
1

您将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;
    }
}
于 2013-07-05T14:56:05.070 回答