我已在本地虚拟环境中成功运行simplest pyramid app。我现在正在处理this tutorial,但我正试图在我的personal hosting网站上运行它,我会用它来搞乱这样的事情。
我的问题是。我将什么作为参数传递给make_server(host, port, app)
以及我要检查哪些URL以查看它是否正在运行?我知道这是一个简单的问题,我只是不习惯这种工作,而documentation并没有帮助我。
奖励积分:
在本地虚拟环境中运行此操作与在此类Web应用程序方面正确托管之间有什么区别?
重要的编辑:我的提供商是bluehost,因为我没有专用的IP,我不允许打开自己的端口,这让我想知道这是否可能
答案 0 :(得分:5)
事实上,在"真实"上托管Python应用程序webserver与在本地计算机上运行它完全不同:本地您依赖于通常内置于框架中的小型Web服务器 - 但是,该Web服务器通常具有限制(例如,它可能仅在单个线程中执行请求)。一些框架(Django)明确声明他们的内置服务器应该只用于开发。
在生产环境中,Python应用程序通常由工业级"提供服务。 Web服务器,例如Apache或Nginx,它负责解决绑定到低端口,删除权限,产生多个" worker"等问题。过程,处理虚拟主机,清理格式错误的请求等。然后,Python应用程序在Web服务器中运行,例如Apache mod_wsgi
或fcgi
或Nginx uwsgi
。或者,您的应用程序作为一个单独的进程运行,监听127.0.0.1:6543(就像您在本地执行)和"前面" Web服务器将所有请求代理到您的应用程序并返回。
重点是:在通用共享主机上托管Python应用程序可能很棘手/不可能,除非您的提供商明确支持托管WSGI应用程序(请求他们提供说明)
另一点:这些天你可以得到一个很好的专用虚拟机,只需5美元/月,你可以安装任何你想要的东西,而不是与任何人分享。托管Python网站比处理共享托管更容易。
啊,并回答这个问题:在实际的生产应用程序中,示例的最后两行:
server = make_server('0.0.0.0', 8080, app)
server.serve_forever()
将不会被使用 - 而是您配置Web服务器,以便它知道app
变量包含您的wsgi应用程序。有关更实际的示例,请参阅文档中的next chapter。
答案 1 :(得分:3)
尝试在PythonAnywhere上的免费帐户上运行该网站,这是最简单的入门。
你可以简单地从github上的文件中创建一个git repo,然后在PythonAnywhere上克隆(我特意提到一个主机,因为你想知道如何在主机上运行某些东西,我发现它是最简单的一个)。至于细节,只要在他们的论坛上询问,他们会帮助你。
我最初在那里制作了一个django网站,这是我的第一个在线应用程序,我学到了不错的数量。
其次,在线和在您自己的计算机上运行您的应用程序的差异很小,这些差异从webhost到webhost不等。所以,你必须更具体地了解你想知道什么。
希望这有帮助。
答案 2 :(得分: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;
}
}