【问题标题】:Mod_wsgi https Error Connection RefusedMod_wsgi https 错误连接被拒绝
【发布时间】:2015-03-03 01:11:09
【问题描述】:

我的团队正在开发一个 REST API 来支持使用 Django 的 REST 框架的 iPhone 应用程序。现在是我们从通过开发 WSGI 接口托管切换到 mod_wsgi apache 接口的时候了。我们决定使用 mod_wsgi-httpd 作为 Apache 实例。

我们无法让 mod_wsgi 通过 HTTPS 托管。

我们在 django 应用程序设置文件 (settings.py) 中包含了 mod_wsgi

INSTALLED_APPS = (
    'sslserver',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'mod_wsgi.server',
)

并且可以使用此命令成功启动 mod_wsgi 服务器:

python manage.py runmodwsgi --host 0.0.0.0 --port 8000 --https-port 8001 --ssl-certificate /path/to/cert/and/key

HTTP 服务器运行良好。我们所有的仅 HTTP API 方法都按预期进行侦听和响应。 HTTPS 端不配合。当尝试访问仅 HTTPS 的方法时,连接被拒绝。

例如,当尝试使用 Google Chrome 连接到该方法时...

https://ipaddress:8001/ldapauth/(ldapauth 是一种 HTTPS 方法)

Chrome 吐回来...

在客户端 Swift 中形成的类似请求也会被拒绝连接。

通常我认为这是一个更根本的问题,但是我们成功使用开发 WSGI sslserver(也在项目的 settings.py INSTALLED_APPS 中)让我认为这是 mod_wsgi 或 mod_wsgi-httpd 的问题。使用此命令,我们可以通过 SSL 托管我们的 API,并获得成功的请求/响应:

python manage.py 运行slserver 0.0.0.0:8001 --key /path/to/key --cert /path/to/cert

有什么我在配置 mod_wsgi 或 mod_wsgi-httpd 时可能遗漏的想法吗?非常感谢您的帮助,加油!

【问题讨论】:

    标签: django apache ssl https mod-wsgi


    【解决方案1】:

    您需要指定--server-name 选项以及使用https 地址可访问的站点名称。这应该与设置 SSL 证书的名称相匹配。

    python manage.py runmodwsgi --host 0.0.0.0 --port 8000 --https-port 8001 --ssl-certificate /path/to/cert/and/key --server-name host.example.com
    

    然后您将使用带有 FQDN 的 URL 访问它:

    https://host.example.com:8001
    

    如果您希望能够从 localhost(同一系统)访问它而无需提供 FQDN 主机名,则可以使用 --allow-localhost 选项。

    python manage.py runmodwsgi --host 0.0.0.0 --port 8000 --https-port 8001 --ssl-certificate /path/to/cert/and/key --server-name host.example.com --allow-localhost
    

    对于后者,即使使用官方证书作为主机名,您也会收到关于证书不匹配的浏览器警告。对于 wget 和 curl 等命令行 HTTP 工具,在这些情况下,您必须告诉他们这是一个不安全的站点。

    这是因为它与 HTTPS 和 SSL 证书的正常使用方式背道而驰,出于测试目的,仅允许从本地主机访问除正确服务器名称之外的名称。

    简而言之,在使用 HTTPS 时,您确实应该始终使用正确的主机名,而不是访问站点时的 IP 地址。如有必要,您可以在主机服务文件中为您的系统创建一个虚拟主机映射。

    例如,您可以在/etc/hosts 文件中添加:

    127.0.0.1       host.example.com
    

    有关更多信息,建议您使用 mod_wsgi 邮件列表。我不再习惯在这里闲逛或回答有关 mod_wsgi 的问题,而这个问题引起了我的注意。

    【讨论】:

    • 感谢您的帮助!这正是问题所在。必须确保 mod_wsgi 知道服务器名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2015-09-09
    • 2016-12-09
    • 2018-04-21
    相关资源
    最近更新 更多