配置Nginx目的:
1.为支持HTTP和HTTPS两种启动方式,方便用户使用。
2.使用【课程】内容用户一定要先登录,这里涉及安全认证,必须要用HTTPS打开网页,仅用端口转发虽然可以用HTTPS方式但不能进行安全认证,须配置Nginx才可。https://192.168.10.69 打开网页即可
步骤1:安装Nginx
在Ubuntu中安装:
sudo apt update
sudo apt install nginx
步骤2:创建Nginx配置文件
创建文件 /etc/nginx/sites-available/myproject:
nginx
server {
listen 80; # 端口转发(推荐用于NAT)
listen [::]:80; # 【桥接模式】添加这行,监听IPv6和所有接口
server_name 192.168.220.10 192.168.10.69 localhost;
# HTTP重定向到HTTPS(可选)
# return 301 https://$server_name$request_uri;
# 或者同时支持HTTP
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;
}
# 静态文件
location /static/ {
alias /home/chen/mydjango/static/;
expires 30d;
}
location /media/ {
alias /home/chen/mydjango/media/;
expires 30d;
}
}
server {
listen 443 ssl;
server_name 192.168.220.10 192.168.10.69 localhost;
# SSL证书 - 使用你现有的证书
ssl_certificate /home/chen/mydjango/cert.pem;
ssl_certificate_key /home/chen/mydjango/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
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;
}
# 静态文件
location /static/ {
alias /home/chen/mydjango/static/;
expires 30d;
}
location /media/ {
alias /home/chen/mydjango/media/;
expires 30d;
}
}
步骤3:启用配置
# 创建符号链接
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重启Nginx
sudo systemctl restart nginx
步骤4:修改Django设置
在settings.py中:
python
# 允许通过代理访问
ALLOWED_HOSTS = ['192.168.220.10', '192.168.10.69', 'localhost', '127.0.0.1']
# 信任Nginx代理
USE_X_FORWARDED_HOST = True
USE_X_FORWARDED_PORT = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# 静态文件
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
步骤5:使用Gunicorn运行Django
# 安装gunicorn
cd /home/chen/mydjango
source venv/bin/activate
pip3 install gunicorn
# 收集静态文件,collectstatic命令会自动生成 ./staticfiles目录
python3 manage.py collectstatic
# 测试几个关键文件,确认是否都返回 200,如果还有文件返回 403,说明这些文件在 staticfiles/ 目录中的权限还需要修复
curl -I http://192.168.220.10/static/js/jquery-3.7.1.js
curl -I http://192.168.220.10/static/css/bootstrap.css
curl -I http://192.168.220.10/static/images/logo.png
# 1. 增加各目录其他用户执行权限
sudo chmod o+x /home/chen/
sudo chmod o+x /home/chen/mydjango/
sudo chmod o+x /home/chen/mydjango/staticfiles/
# 修复整个 staticfiles 目录的权限
sudo find /home/chen/mydjango/staticfiles/ -type f -exec chmod 644 {} \;
sudo find /home/chen/mydjango/staticfiles/ -type d -exec chmod 755 {} \;
# 设置所有者(推荐)
sudo chown -R chen:www-data /home/chen/mydjango/staticfiles/
# 重新测试
curl -I http://192.168.220.10/static/js/jquery-3.7.1.js
# 以 Nginx 用户身份直接访问
sudo -u www-data cat /home/chen/mydjango/staticfiles/js/jquery-3.7.1.js
步骤6:配置NAT虚拟网络80和443转发端口
您的Nginx配置中有两个server块:
打开虚拟机设置 → 网络 → NAT设置 → 端口转发
添加新的规则:
HTTP: 监听80端口HTTP: 监听80端口
名称: Django-HTTP
协议: TCP
主机IP: 192.168.10.69 (或留空)
主机端口: 80
虚拟机IP: 192.168.220.10
虚拟机端口: 80
HTTPS: 监听443端口HTTPS: 监听443端口
名称: Django-HTTPS
协议: TCP
主机IP: 192.168.10.69 (或留空)
主机端口: 443
虚拟机IP: 192.168.220.10
虚拟机端口: 443
# HTTPS访问方式可以解决其他IP访问服务器需要用户登录验证不通过的问题
步骤7:访问方式
# 启动gunicorn(在8000端口)
gunicorn --bind 0.0.0.0:8000 myproject.wsgi
sudo systemctl reload nginx
# 可以通过:
HTTP: http://192.168.220.10/ (端口80)
HTTPS: https://192.168.220.10/ (端口443)
# 或创建启动脚本
创建 /home/chen/mydjango/start_prod.sh:
#!/bin/bash
cd /home/chen/mydjango
source venv/bin/activate
gunicorn --bind 0.0.0.0:8000 myproject.wsgi --workers 3 --access-logfile gunicorn.log
优势优势
统一端口:HTTP(80)和HTTPS(443),无需记端口号
性能更好:Nginx处理静态文件,gunicorn处理动态内容
自动协议处理:Nginx处理所有SSL和协议转换
更稳定:生产级架构