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 配置防火墙端口是没用的,当然这也是笔者的一个猜测,具体看你们的配置,笔者有过类似的情况。
/static/
;各模块作用:
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 服务器
http 请求 —> uWSGI 服务器 —> 通过 uwsgi 协议 处理并转发 —> WSGI 协议 —> APP
打一个比方:
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
具体教程看连接 Linux安装nginx
chmod -R 755 文件名(绝对路径目录)
eg:
chmod -R 755 /home/XXX/Program/nginx
-R
: 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
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
解决方法:Shell 终端输入如下命令
yum install kernel-headers kernel-devel gcc make -y
whereis nginx
下面以 80 端口为例:
systemctl status firewalld
启动防火墙后,默认没有开启任何端口,需要手动开启端口。nginx默认是80端口
命令1:
sudo firewall-cmd --zone=public --list-ports
命令2:(推荐)
firewall-cmd --list-all
firewall-cmd --zone=public --add-port=80/tcp --permanent
命令含义:
--zone # 作用域
--add-port=80/tcp # 添加端口,格式为:端口/通讯协议
--permanent # 永久生效,没有此参数重启后失效
firewall-cmd --zone=public --remove-port=80/tcp --permanent
开启和关闭防火墙端口后,需要重启防火墙才生效
systemctl restart firewalld.service
假设 80 端口被占用了,那么使用如下命令,查找占用该端口的进程,并 kill 了它。
netstat -tunlp | grep 80
kill -9 进程号
如上占用80端口的进程 pid 为 3848,所以 kill -9 3848
即可删除该进程,释放 80 端口。
nginx -s reload
上面的命令报错,则应该是未配置系统环境变量,当然也可以配置软连接,推荐使用软连接。
vim /etc/profile
键盘输入 G
注意是大写的 G ,快速将光标切换到该文件的最后一行。
进入插入模式,按 i 键,在文件的最后一行写入如下内容:(看一下自己电脑的 nginx 安装的可执行文件的目录位置,使用 whereis
命令,请勿照搬)
export PATH=$PATH:/usr/local/naginx/sbin
$PATH:
后是指定的 nginx 可执行文件的位置,即可以用 ./nginx
执行启动 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
命令查看文件内容
curl ifconfig.me