You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows Server 2016上IIS部署Django 4应用连接PostgreSQL失败求助

Windows Server 2016上IIS部署Django 4应用连接PostgreSQL失败求助

我之前帮朋友排查过几乎一模一样的问题,结合自己踩过的坑,给你几个针对性的排查方向,应该能解决这个socket连接失败的问题:

首先先明确你的问题现象:

本地用python manage.py runserver能正常连接PostgreSQL,但通过IIS访问时,日志始终报:

psycopg.OperationalError: connection failed: :1), port 23825 failed: could not receive data from server: Socket is not connected (0x00002749/10057)
could not send SSL negotiation packet: Socket is not connected (0x00002749/10057)

即使把数据库地址从localhost改成127.0.0.1,错误依旧。

接下来按优先级排查:

1. 检查IIS应用池的身份权限

这是最常见的原因!IIS默认的应用池身份是ApplicationPoolIdentity,这个账号权限非常有限,甚至可能没有访问本地PostgreSQL socket或者网络端口的权限。

解决步骤:

  • 打开IIS管理器,找到你的站点对应的应用池
  • 右键点击应用池 → 高级设置
  • 在「进程模型」→「标识」里,把默认的ApplicationPoolIdentity改成LocalSystem(临时测试用,后续可以换成权限更合适的本地用户)
  • 重启应用池和你的IIS站点,再访问试试

2. 确认PostgreSQL的监听与访问控制设置

虽然本地runserver能连,但IIS的进程身份可能不在PostgreSQL的允许列表里:

  • 打开PostgreSQL的postgresql.conf文件(通常在C:\Program Files\PostgreSQL\{版本}\data目录下)
    • 确保listen_addresses设置为'127.0.0.1'或者'*'(不要只设localhost,Windows下有时候解析会有问题)
    • 确认port设置和你Django配置里的一致(你的日志里是23825,不是默认的5432,这点要注意)
  • 打开pg_hba.conf文件,添加一行允许本地IP访问的规则:
    host    all             all             127.0.0.1/32            scram-sha-256
    
    (如果你的PostgreSQL版本比较旧,可能用md5代替scram-sha-256
  • 重启PostgreSQL服务,再测试连接

3. 排查Windows防火墙拦截

Windows Server的防火墙有时候会拦截IIS进程访问本地端口,哪怕是127.0.0.1的连接:

  • 先临时关闭Windows Defender防火墙(仅测试用),如果能正常连接,说明是防火墙的问题
  • 然后给PostgreSQL的23825端口添加入站和出站规则,或者直接允许w3wp.exe(IIS的工作进程)访问所有网络资源
  • 也可以检查PostgreSQL的安装目录下有没有添加到防火墙允许列表里

4. 检查httpPlatformHandler的配置与环境变量

httpPlatformHandler启动Python进程时,可能没有加载正确的环境变量,导致psycopg无法找到PostgreSQL的客户端库:

  • 打开你的站点根目录下的web.config,检查httpPlatform节点的配置:
    <httpPlatform processPath="C:\Users\Administrator\AppData\Local\Programs\Python\Python311\python.exe"
                  arguments="manage.py runserver %HTTP_PLATFORM_PORT%"
                  stdoutLogEnabled="true"
                  stdoutLogFile=".\logs\stdout"
                  startupTimeLimit="60"
                  requestTimeout="00:05:00">
      <environmentVariables>
        <environmentVariable name="PATH" value="%PATH%;C:\Program Files\PostgreSQL\{版本}\bin" />
        <environmentVariable name="PYTHONPATH" value="%PYTHONPATH%;." />
        <environmentVariable name="DJANGO_SETTINGS_MODULE" value="your_project.settings" />
      </environmentVariables>
    </httpPlatform>
    
    重点是要把PostgreSQL的bin目录添加到PATH环境变量里,确保psycopg能找到所需的动态链接库

5. 用应用池身份测试数据库连接

如果上面的方法都没用,可以直接模拟IIS的运行身份来测试数据库连接:

  • 打开命令提示符,用runas切换到应用池的身份:
    runas /user:NT AUTHORITY\ApplicationPoolIdentity cmd.exe
    
    (如果你改成了LocalSystem,就用runas /user:NT AUTHORITY\SYSTEM cmd.exe
  • 在新打开的cmd窗口里,运行psql命令测试连接:
    psql -h 127.0.0.1 -p 23825 -U your_db_user -d your_db_name
    
    如果这里也报错,说明是身份权限的问题;如果能连上,那就是IIS配置的问题

备注:内容来源于stack exchange,提问作者Nika Tvildiani

火山引擎 最新活动