我是 IIS - Internet 信息服务(Microsoft Windows)用户,我想迁移到 Nginx。
如何使用虚拟目录(IIS 样式)在 Python 中发布多个 Web 应用程序,并http://HOST_IP/APP_DIRECTORY
在 Nginx 中通过 IP 和目录名(例如:)访问它们?
我使用的服务器操作系统是Ubuntu Server 12.04.1 LTS AMD64。
[]的
答案1
我自己提出并回答的这个主题的目的是为来自 IIS - Internet Information Services (Microsoft Windows) 并希望迁移和/或使用 Nginx 和 Python 的用户建立一条简短、简单且准确的路径。所以我请大家帮助实现这个目标!
考虑的方面:
- 使用 Ubuntu Server 12.04.1 LTS AMD64;
- 使用 Python Web 应用程序;
- 使用该模型访问多个应用程序
http://HOST_IP/APP_DIRECTORY
;
我对 Nginx 了解不多。我强调一下,这里的目标是以简单易行的方式创建用于测试和开发的 Web Python 应用程序,无需域名(例如 www.domain.com)并通过 IP 和虚拟目录访问它们。
我不知道这是否是使用虚拟目录发布应用程序的最佳方式。欢迎对此方面提出评论。
这就是我的答案!
安装将运行 Python 应用程序的 Nginx 和 uWSGI;
apt-get 安装 nginx-full uwsgi uwsgi-plugin-python
创建 Nginx 的配置文件。这将包含 Nginx 中可用的虚拟目录列表(文件夹“sites-available”):
nano /etc/nginx/sites-available/applications
档案内容:
server
{
listen 80;
server_name $hostname;
access_log /srv/www/applications/logs/access.log;
error_log /srv/www/applications/logs/error.log;
location /pytest0
{
#uwsgi_pass 127.0.0.1:9001;
uwsgi_pass unix:///run/uwsgi/app/pytest0/pytest0.socket;
include uwsgi_params;
uwsgi_param UWSGI_SCHEME $scheme;
uwsgi_param SERVER_SOFTWARE nginx/$nginx_version;
}
location /pytest1
{
#uwsgi_pass 127.0.0.1:9001;
uwsgi_pass unix:///run/uwsgi/app/pytest1/pytest1.socket;
include uwsgi_params;
uwsgi_param UWSGI_SCHEME $scheme;
uwsgi_param SERVER_SOFTWARE nginx/$nginx_version;
}
}
创建 Nginx 保存日志的目录:
mkdir -p /srv/www/applications/logs
将您创建的应用程序列表放在已启用的应用程序集合中(文件夹“applications-enabled”):
ln -s /etc/nginx/sites-available/applications /etc/nginx/sites-enabled/applications
通过输入以下命令删除到默认虚拟主机的链接:
rm /etc/nginx/sites-enabled/default
注意:通过此操作可以更轻松地诊断可能的错误,因为如果发生故障,NGINX 会返回错误而不是标准页面。
为第一个 Python 测试应用程序创建文件夹:
mkdir -p /srv/www/pytest0/public_html/static
mkdir /srv/www/pytest0/application
设置第一个测试应用程序并使其在 uWSGI (文件夹“apps-available”)中可用:
mkdir -p /etc/uwsgi/apps-available/
纳米/etc/uwsgi/apps-available/pytest0.xml
档案内容:
<uwsgi>
<plugin>python</plugin>
<socket>/run/uwsgi/app/pytest0/pytest0.socket</socket>
<pythonpath>/srv/www/pytest0/application/</pythonpath>
<app mountpoint="/">
<script>wsgi_configuration_module</script>
</app>
<master/>
<processes>4</processes>
<harakiri>60</harakiri>
<reload-mercy>8</reload-mercy>
<cpu-affinity>1</cpu-affinity>
<stats>/tmp/stats.socket</stats>
<max-requests>2000</max-requests>
<limit-as>512</limit-as>
<reload-on-as>256</reload-on-as>
<reload-on-rss>192</reload-on-rss>
<no-orphans/>
<vacuum/>
</uwsgi>
将第一个测试应用程序放置在 uWSGI 中启用的位置(文件夹“apps-enabled”):
ln -s /etc/uwsgi/apps-available/pytest0.xml /etc/uwsgi/apps-enabled/pytest0.xml
在 uWSGI 中“创建”第一个测试应用程序:
纳米/srv/www/pytest0/application/wsgi_configuration_module.py
档案内容:
import os
import sys
sys.path.append('/srv/www/pytest0/application')
os.environ['PYTHON_EGG_CACHE'] = '/srv/www/pytest0/.python-egg'
def application(environ, start_response):
status = '200 OK'
output = 'Hello pytest0!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
为第二个 Python 测试应用程序创建文件夹:
mkdir -p /srv/www/pytest1/public_html/static
mkdir /srv/www/pytest1/application
设置第二个测试应用程序并使其在 uWSGI (文件夹“apps-available”)中可用:
纳米/etc/uwsgi/apps-available/pytest1.xml
档案内容:
<uwsgi>
<plugin>python</plugin>
<socket>/run/uwsgi/app/pytest1/pytest1.socket</socket>
<pythonpath>/srv/www/pytest1/application/</pythonpath>
<app mountpoint="/">
<script>wsgi_configuration_module</script>
</app>
<master/>
<processes>4</processes>
<harakiri>60</harakiri>
<reload-mercy>8</reload-mercy>
<cpu-affinity>1</cpu-affinity>
<stats>/tmp/stats.socket</stats>
<max-requests>2000</max-requests>
<limit-as>512</limit-as>
<reload-on-as>256</reload-on-as>
<reload-on-rss>192</reload-on-rss>
<no-orphans/>
<vacuum/>
</uwsgi>
将第二个测试应用程序放置在 uWSGI 中启用的位置(文件夹“apps-enabled”):
ln -s /etc/uwsgi/apps-available/pytest1.xml /etc/uwsgi/apps-enabled/pytest1.xml
在 uWSGI 中“创建”第二个测试应用程序:
纳米/srv/www/pytest1/application/wsgi_configuration_module.py
档案内容:
import os
import sys
sys.path.append('/srv/www/pytest1/application')
os.environ['PYTHON_EGG_CACHE'] = '/srv/www/pytest1/.python-egg'
def application(environ, start_response):
status = '200 OK'
output = 'Hello pytest1!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
重新启动服务:
服务 uwsgi 重启
服务 nginx 重启
请给出意见!
- 参考:
https://library.linode.com/web-servers/nginx/python-uwsgi/ubuntu-12.04-precise-pangolin