本文使用云服务器+djngo+uwsgi+nginx的方式实现网站的搭建,主要侧重代码部署
环境
python 3.8
nginx 1.18.0 (Ubuntu)
MySQL 8.0.26-0ubuntu0.20.04.2
django 3.2.6
uwsgi 9.3.0
阿里云服务器ubuntu20.04
前期准备
1.项目文件
本地测试无问题的项目文件
本人的文件结构如下
project
├─api
│ ├─migrations
│ │ └─__pycache__
│ ├─static
│ │ ├─css
│ │ ├─img
│ │ └─js
│ ├─templates
│ └─__pycache__
├─backend
│ └─__pycache__
└─static
├─css
├─img
└─js
2.云服务器
本文使用白嫖来的阿里云服务器
实现原理
nginx监听特定的端口将请求转发给uwsgi处理,完成后再由nginx发回给用户
云服务器配置
1.安装nginx
ubuntu下直接使用
sudo apt-get install nginx
然后可以直接
nginx
停止
nginx -s stop
重启
nginx -s restart
nginx默认监听80端口,此时可以直接在浏览器输入云服务器ip,回车后可以看到
说明nginx已经成功启动
如果无法访问检查一下
nginx的端口是否被占用
云服务器是否开放了80端口
安装uwsgi
1.升级源
sudo apt update
sudo apt upgrade
2.安装python
安装依赖包,若没有依赖包后面的uwsgi安装会报错
apt-get install python3.8-dev
安装pip
sudo apt install python3-pip
安装uwsgi
安装好依赖后直接
python3-pip install uwsgi
即可
配置uwsgi和nginx
配置uwsgi
在项目根目录下创建uwsgi.ini文件
此处使用vim
vim uwsgi.ini
若没有vim先安装
sudo apt install vim
按i进入输入模式
[uwsgi]
socket = 127.0.0.1:8001
chdir=/home/server/backend
module=backend.wsgi
按ESC后按:wq回车保存退出
参数说明
socket为nginx和uwsgi的内网通信
这里要保证和后面nginx的配置中的转发位置保持一致
chdir为项目所在的目录
moudle是django自己生成的wsgi文件,指明即可
还有其他参数读者可以自行添加,这里从简故不做深入
这里有个坑
如果使用nginx转发请求的话要使用socket
不然nginx的请求转发不到uwsgi
局域网可以使用
[uwsgi]
http = host:port
chdir=/home/server/backend
module=backend.wsgi
使用配置文件启动uwsgi
先安装一个实用的小工具
sudo apt install screen
创建一个新终端
screen -S name
name是你自定义的名字
cd到项目目录然后启动uwsgi
uwsgi uwgi.ini
*** Operational MODE: single process ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x55bd7feebf40 pid: 107105 (default app)
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 107105, cores: 1)
启动成功
按Ctrl + A + D即可回到主命令行
如果前面使用的是http的配置方法
回到主命令行后直接
curl host:port
是可以看到nginx的欢迎页面的
nginx配置
配置文件似乎是有好几个位置,这里就用一个方便一点的
nginx的配置文件在/etc/nginx/nginx.conf
vim /etc/nginx/nginx.conf
在http中添加和修改配置参数如下
server {
listen 80;
server_name 自己的云服务器公网IP;
charset utf-8;
client_max_body_size 75M;
location / {
uwsgi_pass 127.0.0.1:8001;
# 刚才在uwsgi.ini中设置的host和port
include /etc/nginx/uwsgi_params;
uwsgi_read_timeout 15;
}
location /static {
# 指定静态文件存放的目录
alias /home/server/project/static;
}
}
如果不指明静态文件的存放目录会出现静态文件(css、img、js)等无法访问
保存后重启nginx
nginx -s restart
此时在浏览器输入自己的公网ip,回车
成功访问django
出现这个页面是因为在settings.py里面
DEBUG = True
关闭以后就看不到该页面了
此时的uwsgi
[pid: 107190|app: 0|req: 1/1]
ip手动打码
{42 vars in 770 bytes}
[Wed Dec 22 23:11:15 2021]
GET /api/ip => generated 103 bytes in 106 msecs
(HTTP/1.1 200) 5 headers in 158 bytes (1 switches on core 0)
项目地址
项目还没结题
测试账号就先不给了
DEBUG开着读者可以自己试探
一些坑
如果要使用nginx,uwsgi.ini内要使用socket
如果nginx出现502 bad gateway的话
可能是uwsgi没有启动或者没有正确配置
建议检查一下uwsgi和nginx配置文件里的host和port
提交form表单时候出现csrf ***报错的时候
1.在HTML源码中加入{csrf token}
2.在settings.py中注释掉django.middleware.csrf.CsrfViewMiddleware即可
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
参考了很多大佬的blog,这里简单的做一下记录