Nginx - 如何使用虚拟目录发布多个 Python Web 应用程序并通过 IP 和虚拟目录访问它们(http://HOST_IP/APP_DIRECTORY)?

Nginx - 如何使用虚拟目录发布多个 Python Web 应用程序并通过 IP 和虚拟目录访问它们(http://HOST_IP/APP_DIRECTORY)?

我是 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 的用户建立一条简短、简单且准确的路径。所以我请大家帮助实现这个目标!

考虑的方面:

  1. 使用 Ubuntu Server 12.04.1 LTS AMD64;
  2. 使用 Python Web 应用程序;
  3. 使用该模型访问多个应用程序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

相关内容