You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Amazon Linux 2上安装配置Nginx+Gunicorn+Daphne WebSocket服务器

在Amazon Linux 2上配置Nginx+Gunicorn+Daphne实现WebSocket通信

1. 环境准备

先完成基础依赖安装:

  • 更新系统包:sudo yum update -y
  • 安装Python、pip和Nginx:sudo yum install python3-pip nginx -y
  • 安装虚拟环境工具:sudo pip3 install virtualenv

2. 创建Django项目并配置WebSocket支持

Daphne是针对Django的ASGI服务器,需基于Django项目搭建:

  • 创建并激活虚拟环境:
    virtualenv venv
    source venv/bin/activate
    
  • 安装核心依赖:pip install django channels daphne gunicorn
  • 创建Django项目:django-admin startproject myproject && cd myproject
  • 创建WebSocket业务应用:python manage.py startapp myapp

2.1 修改Django配置文件

编辑myproject/settings.py:

  1. 将channels和myapp加入INSTALLED_APPS:
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'channels',  # 添加此行
        'myapp',      # 添加此行
    ]
    
  2. 配置ASGI应用入口和WebSocket通道层:
    ASGI_APPLICATION = 'myproject.asgi.application'
    
    CHANNEL_LAYERS = {
        "default": {
            "BACKEND": "channels.layers.InMemoryChannelLayer"  # 测试用内存层,生产建议Redis
        }
    }
    

2.2 配置ASGI路由

编辑myproject/asgi.py,替换原有内容:

import os
import django
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
django.setup()

from myapp.routing import websocket_urlpatterns

application = ProtocolTypeRouter({
    "http": get_asgi_application(),  # Gunicorn处理HTTP请求
    "websocket": URLRouter(websocket_urlpatterns),  # Daphne处理WebSocket
})

2.3 编写WebSocket消费者和路由

  • 在myapp目录下创建routing.py:
    from django.urls import path
    from . import consumers
    
    websocket_urlpatterns = [
        path('ws/test/', consumers.TestConsumer.as_asgi()),
    ]
    
  • 创建myapp/consumers.py,实现基础WebSocket逻辑:
    import json
    from channels.generic.websocket import AsyncWebsocketConsumer
    
    class TestConsumer(AsyncWebsocketConsumer):
        async def connect(self):
            await self.accept()
            await self.send(text_data=json.dumps({'message': 'WebSocket连接成功!'}))
    
        async def disconnect(self, close_code):
            pass
    
        async def receive(self, text_data):
            text_data_json = json.loads(text_data)
            message = text_data_json['message']
            await self.send(text_data=json.dumps({'message': f'收到消息:{message}'}))
    

2.4 初始化Django项目

  • 执行数据库迁移:python manage.py migrate
  • 创建超级用户(可选):python manage.py createsuperuser

3. 配置Daphne服务(处理WebSocket)

创建systemd服务文件管理Daphne进程:

  • 编辑服务文件:sudo vi /etc/systemd/system/daphne.service
  • 写入以下内容(注意替换路径为你的项目实际路径):
    [Unit]
    Description=Daphne ASGI Server for WebSocket
    After=network.target
    
    [Service]
    User=ec2-user
    Group=ec2-user
    WorkingDirectory=/home/ec2-user/myproject
    Environment="PATH=/home/ec2-user/myproject/venv/bin"
    ExecStart=/home/ec2-user/myproject/venv/bin/daphne -b 0.0.0.0 -p 8001 myproject.asgi:application
    
    [Install]
    WantedBy=multi-user.target
    
  • 启动并启用服务:
    sudo systemctl daemon-reload
    sudo systemctl start daphne
    sudo systemctl enable daphne
    
  • 检查服务状态:sudo systemctl status daphne

4. 配置Gunicorn服务(处理HTTP请求)

创建systemd服务文件管理Gunicorn进程:

  • 编辑服务文件:sudo vi /etc/systemd/system/gunicorn.service
  • 写入以下内容:
    [Unit]
    Description=Gunicorn HTTP Server for Django
    After=network.target
    
    [Service]
    User=ec2-user
    Group=ec2-user
    WorkingDirectory=/home/ec2-user/myproject
    Environment="PATH=/home/ec2-user/myproject/venv/bin"
    ExecStart=/home/ec2-user/myproject/venv/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 myproject.wsgi:application
    
    [Install]
    WantedBy=multi-user.target
    
  • 启动并启用服务:
    sudo systemctl daemon-reload
    sudo systemctl start gunicorn
    sudo systemctl enable gunicorn
    
  • 检查服务状态:sudo systemctl status gunicorn

5. 配置Nginx反向代理

通过Nginx统一转发HTTP和WebSocket流量:

  • 创建Nginx配置文件:sudo vi /etc/nginx/conf.d/django_websocket.conf
  • 写入以下内容(替换your_domain_or_ip为你的服务器域名/公网IP):
    server {
        listen 80;
        server_name your_domain_or_ip;
    
        # 转发HTTP请求到Gunicorn
        location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    
        # 转发WebSocket请求到Daphne
        location /ws/ {
            proxy_pass http://127.0.0.1:8001;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_read_timeout 86400;  # 延长超时时间适配长连接
        }
    }
    
  • 测试配置正确性:sudo nginx -t
  • 重启Nginx服务:sudo systemctl restart nginx
  • 开放80端口防火墙规则:
    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --reload
    
    (AWS实例需同步在安全组中开放80端口入站规则)

6. 测试WebSocket通信

打开浏览器开发者工具(F12),在控制台执行以下代码测试:

const ws = new WebSocket('ws://your_domain_or_ip/ws/test/');
ws.onmessage = function(event) { console.log('收到响应:', event.data); };
ws.send(JSON.stringify({message: 'Hello WebSocket!'}));

若控制台输出连接成功消息和收到的反馈,则配置生效。

内容的提问来源于stack exchange,提问作者chetan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:07:12