如何在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:
- 将
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', # 添加此行 ] - 配置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端口防火墙规则:
(AWS实例需同步在安全组中开放80端口入站规则)sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload
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
相关产品推荐
相关产品推荐

