我正在使用web.py和nginx开发一个网站,到目前为止,我一直在本地使用内置的开发服务器。它现在是将网站移动到实时服务器的时候了。我想部署网站,以便根目录像examples.com/test
,但我的所有网址处理都被破坏了。我曾经以为我可以创建一个url_prefix
变量并在web.py代码周围加工它,但这看起来确实很脏。看起来最好的办法就是让nginx从url中删除前缀,这样web.py应用程序永远不会看到它,但我不确定它是否可能。
有人知道如何处理这种情况吗?
答案 0 :(得分:2)
使用gunicorn等Web服务器在本地端口上运行web.py应用程序,然后配置nginx以托管静态文件并反向代理gunicorn服务器。以下是一些配置片段,假设:
/var/www/example-webpy
example-webpy/static
/etc/nginx
。默认情况下,web.py看起来不会执行此操作,因此您需要app.py
中的以下内容(或任何文件引导您的应用):
# For serving using any wsgi server
wsgi_app = web.application(urls, globals()).wsgifunc()
this SO question中的更多信息。
安装gunicorn并通过运行类似的方式启动应用程序(其中example
是Python模块的名称):
gunicorn example:wsgi_app -b localhost:3001
(您可能希望使用Supervisor等内容自动执行此操作,以便在服务器退回时重新启动应用程序服务器。)
将以下内容放入/etc/nginx/reverse-proxy.conf
(请参阅this SO answer)
# Serve / from local http server.
# Just add the following to individual vhost configs:
# proxy_pass http://localhost:3001/;
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 10;
proxy_read_timeout 10;
然后在/etc/nginx/sites-enabled/example.com.conf
中配置您的域名:
server {
server_name example.com
location /test/ {
include /etc/nginx/reverse-proxy.conf;
rewrite /test/(.*) /$1 break;
proxy_pass http://localhost:3001/;
}
location / {
root /var/www/example-webpy/static/;
}
}
请注意重写,这应该确保您的web.py应用程序永远不会看到/ test / URL前缀。请参阅proxy_pass和HttpRewriteModule上的nginx文档。
这将导致请求example.com/js/main.js
映射到example-weby/static/js/main.js
,因此它假定您的web.py模板未添加/static/
前缀。它还会导致static
目录中的所有内容都变得对Web可见,因此请确保这是您的意图!