Django 项目生产环境配套教程链接
Linux - Django + Nginx + uWSGI 部署项目 - 安装 Python3.x -(2)
Linux - Django + Nginx + uwsgi 部署项目 - rpm 包安装 Mysql 5.x 服务器 - 删除 Mysql 服务器 - 解决创建新数据库的utf8编码问题(3)
Linux - Django + Nginx + uwsgi 部署项目 - 安装 uWSGI 服务器 -(4)
├── apps
│ ├── app1
│ └── app2
├── common
├── common_static
├── media
├── Myproject
├── simpleui
├── static
└── templates
序言
这里笔者先提个醒,如果是使用阿里云服务器,那么下面的防火墙端口配置,是否开放其实都没啥用,重点是阿里云服务器账号,即Web端那边是否配置了相应的端口开放,如果使用的是云服务器的话,实际在本机或远程 ssh 配置防火墙端口是没用的,当然这也是笔者的一个猜测,具体看你们的配置,笔者有过类似的情况。
项目思维逻辑
- nginx 服务器接收到浏览器发送过来的 http 请求,将包进行解析,分析 url 路由,转发请求(注意是转发,而不是处理请求);
- 静态文件请求:就直接访问用户给 nginx 服务器配置的静态文件目录,直接返回用户请求的静态文件
/static/
; - 动态接口请求: nginx 服务器就会将请求转发给 uWSGI 服务器,最后到达django处理请求;
各模块作用:
nginx 服务器:是对外的服务器,外部浏览器通过url访问 nginx,nginx 主要处理静态请求
uWSGI:是对内的服务器,主要用来处理动态请求
uwsgi:是一种对内的 web 协议,接收到请求之后将包进行处理,处理成 wsgi 可以接受的格式,并发给 wsgi
wsgi:是 python专用的 web 协议,根据请求调用应用程序(django)的某个文件,某个文件的某个函数
django 框架:是真正干活的,查询数据等资源,把处理的结果再次返回给wsgi 协议, WSGI 协议将返回值进行打包,打包成 uwsgi 协议能够接收的格式 (wsgi 协议大小写都可以)
uWSGI 服务器接收 WSGI 发送的请求,并转发给nginx 服务器,nginx服务器最终将返回值返回给浏览器
这里的 uwsgi 看起来有点乱,不知道是 web 服务器,还是 web 协议,但在笔者看来,应该是 uWSGI 服务器,由这个中间件服务器,翻译相关的信息,再将其转发给相应的对象,而uwsgi 只是一个协议,是属于 uWSGI 服务器内的处理模块,用于解析两者(nginx 服务器 和 Django 应用)之间的信息,而 uWSGI 服务器充当一个转发机制,类似快递员。
总而言之,内部接收和转发的是 uWSGI 服务器,使用 uwsgi 协议进行处理,相当于物流公司一样,物流公司是 uWSGI 服务器,里面的员工相当于是 uwsgi 协议。
Django + uwsgi方案:
没有 nginx 服务器,而只有uWSGI的服务器,则会将 Internet请求直接交由 uWSGI 服务器处理,并反馈到
web
项目中。
nginx 服务器可以实现安全过滤,防DDOS等保护安全的操作,并且如果配置了多台服务器,nginx 服务器可以保证服务器的负载相对均衡。
而 uWSGI 则是一个 web服务器,实现了WSGI协议(Web Server Gateway Interface
),http
协议等,它可以接收和处理请求,发出响应等。
所以只用uwsgi也是可以的。
nginx和uWSGI特点:
nginx 服务器的作用
- 反向代理,可以拦截一些web攻击,保护后端的web服务器
- 负载均衡,根据轮询算法,分配请求到多节点web服务器
- 缓存静态资源,加快访问速度,释放 web 服务器的内存占用,专项专用
uWSGI 服务器的作用
- 单节点服务器的简易部署
- 轻量级,好部署
为什么使用 nginx 服务器放在最前面,而不是发送给 uWSGI 服务器
项目架构配置
- 如果架构是 Nginx + uWSGI + APP,uWSGI 服务器则是一个中间件服务器
- 如果架构是 uWSGI + APP,uWSGI 服务器则是一个 Web + HTTP 服务器
http 请求 —> uWSGI 服务器 —> 通过 uwsgi 协议 处理并转发 —> WSGI 协议 —> APP
- uWSGI 服务器性能比 nginx 服务器差一些, nginx 服务器还提供反向代理、负载均衡、安全拦截等
打一个比方:
nginx 服务器比如是一个日本人,django项目比如是一个中国人
uwsgi 协议相当于日语,WSGI 协议相当于汉语
日本人如果想和中国人交流必须使用一个翻译官,这个翻译官必须要懂很多种语言
uWSGI 服务器:相当于就是一个既懂 uwsgi 协议(日语),又懂 WSGI 协议 (汉语) 的翻译官
项目环境
生产环境:
cat /etc/redhat-release
Centos 7.x
所需安装程序:
pip list
python 3.7.0
django 3.2.15
mysqlclient 2.1.1
安装命令:pip install
查看 nginx 服务器版本命令
nginx -v
nginx 1.x
查看 uWSGI 服务器 版本
uwsgi --version
uwsgi 2.x
一、安装 nginx 服务器
具体教程看连接 Linux安装nginx
安装时注意要点:
- 可以不用 mkdir 创建目录,其实默认情况下,nginx 的安装目录,便是教程里的 /usr/bin/nginx 目录,但是后面当使用 make install 命令时,可以自定义安装目录的,所以如果不想要默认目录,那么就得自己去 mkdir 一个自己想要安装 nginx 的目录,并且授权 755权限,命令如下:
chmod -R 755 文件名(绝对路径目录)
eg:
chmod -R 755 /home/XXX/Program/nginx
-R
: 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
1. 权限划分详解
7 - 5 - 5 = 4 + 2 + 1 - 4 + 1 - 4 + 1
相当于 rwx - r-x - r-x
用户创建者 - 用户所属的组 - 其他的用户
rwxr-xr-x
7 = 4 - 2 - 1 用户创建者 r - w - x 读 - 写 - 执行
7 = 4 - 2 - 1 用户所属的组 r - w - x 读 - 写 - 执行
7 = 4 - 2 - 1 其他的用户 r - w - x 读 - 写 - 执行
特别权限 4755
执行某文件时,也有 root 用户的权限
chmod 4755 /home/XXX/Program/test
2. 安装 nginx 报错问题 ./configure: error: can not define uint32_t
解决方法:Shell 终端输入如下命令
yum install kernel-headers kernel-devel gcc make -y
二、服务器项目内部配置常用命令
1、 whereis 查找安装路径命令
whereis nginx
2、 配置防火墙,开放自定义端口监听
下面以 80 端口为例:
1. 查看防火墙是否开启
systemctl status firewalld
启动防火墙后,默认没有开启任何端口,需要手动开启端口。nginx默认是80端口
1.1 查看防火墙已开放端口,有两条命令可以使用
命令1:
sudo firewall-cmd --zone=public --list-ports
命令2:(推荐)
firewall-cmd --list-all
2. 手动开启防火墙开放某端口的命令
firewall-cmd --zone=public --add-port=80/tcp --permanent
命令含义:
--zone # 作用域
--add-port=80/tcp # 添加端口,格式为:端口/通讯协议
--permanent # 永久生效,没有此参数重启后失效
3. 手动关闭防火墙开放某端口的命令
firewall-cmd --zone=public --remove-port=80/tcp --permanent
4. 重启防火墙服务使其配置生效
开启和关闭防火墙端口后,需要重启防火墙才生效
systemctl restart firewalld.service
5. 解决服务端口占用问题
假设 80 端口被占用了,那么使用如下命令,查找占用该端口的进程,并 kill 了它。
netstat -tunlp | grep 80
kill -9 进程号
如上占用80端口的进程 pid 为 3848,所以 kill -9 3848
即可删除该进程,释放 80 端口。
3、重启 nginx 服务器命令
nginx -s reload
上面的命令报错,则应该是未配置系统环境变量,当然也可以配置软连接,推荐使用软连接。
1.配置 nginx 服务器的系统环境变量方法如下:
vim /etc/profile
键盘输入 G
注意是大写的 G ,快速将光标切换到该文件的最后一行。
进入插入模式,按 i 键,在文件的最后一行写入如下内容:(看一下自己电脑的 nginx 安装的可执行文件的目录位置,使用 whereis
命令,请勿照搬)
export PATH=$PATH:/usr/local/naginx/sbin
$PATH:
后是指定的 nginx 可执行文件的位置,即可以用 ./nginx
执行启动 nginx 服务器的可执行文件的位置。
2. nginx 服务器命令软连接配置 (推荐使用软连接)
这里自行选择目录,按实际情况选择目录,请勿照搬
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
软连接会在指定的位置如 /usr/bin/
创建一个名为 nginx 的文件,但是其配置却是 /usr/local/nginx/sbin/nginx
的配置,所以利用这个特性,可以在项目目录内自行创建 nginx 服务器的 .conf
配置
例如:
ln -s /home/TestProject/test.conf /usr/local/nginx/conf/nginx.conf
那么今后就可以在项目里面配置,nginx 服务器的 .conf
配置了。
当然原来的 nginx.conf 自然得删掉,不然会报出 File exists
错误
不用担心,在nginx/conf/ 目录下已经有备份过的 nginx.default 这是一个原版的 nginx.conf 的备份文件
特别注意:
这是一个同步的文件操作,在原来的文件修改了,那么软连接那边目录下的文件内容也会被修改,可以测试下,然后 cat
命令查看文件内容
三、服务器公网外部测试常用命令
1、curl 命令测试
1.1 获取当前本地服务器的公网 ip
curl ifconfig.me