手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程

ubuntu 刚刚发布了ubuntu 22.04,正好有个django程序也是刚写完,考虑22.04安全性会更好,于是直接在22.04上部署,我选择的是 server版本。

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图

———- 第一部分 系统安装 ———-

1.1、下载安装包:

我主要选择在国内的镜像站下载,如网易云清华腾讯云,点击文字即可跳转,自己选择即可。

制作启动盘:

1.2、由于是我是macos的重度使用者,已经很少使用windows,我采用的是macos里的第三方软件,balenaEtcher,只需3步傻瓜制作启动盘,使用macos的用户强烈推荐。

下载地址,自己搜索即可,这里就不推荐了

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图1

1.3、安装 ubuntu 22.04

安装过程非常简单,所有皆选下一步即可,这一版本可见的几个优势:

1)在线升级的服务器有中文的地址了,因此不用在手动切换阿里源,下载速度貌似还不错;

2)IP地址设置的地方有了一个wifi 的配置文件,应该是设置无线网的,还没有尝试,以后有机会再写;

不到10分钟即安装完毕,熟悉的命令行界面。

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图2


———- 第二部分 基础设定 ———-

2.1、设定root密码

虽然出于安全考虑一般会进制root用户远程登录,不过这里还是把过程记下来

sudo passwd root

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图3

root用户密码设定完毕,使用 su 命令进入root用户模式。

2.1、开启 root 用户远程登录

服务器在调试状态经常需要管理员权限,因此需要开启 root 用户的远程登录权限

vim /etc/ssh/sshd_config

PermitRootLogin prohibit-password 改为: PermitRootLogin yes

service sshd restart

即可实现远程访问。

* 当服务器为生产服务器时,请一定记得关闭 root 远程登录权限。

2.3、修改固定IP地址

ubuntu 22.04 默认没有安装网络工具,刚刚装完的系统是无法使用 ifconfig的,用下列命令安装

sudo apt install net-tools

修改固定 IP 地址,是服务器最需要第一时间完成的工作,毕竟服务器的地址是需要固定的。

配置文件在 /etc/netplan 目录下,该目录下新增了一个 WiFi的配置文件。

22.04的IP地址设定更为简洁,老规矩先备份现有数据

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图4

新老配置文件同时奉上,可以对比着看

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图5手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图6

ubuntu 的固定网卡配置理解起来还是比较简单的,需要注意的是缩进,每个缩进都要严格遵守,通过 tab 键进行缩进,按照上面的配置完成后输入命令网络配置直接生效。

sudo netplan apply

* 如果这时候使用的是网络终端,则会卡在那里不动,因为网卡地址换了,之前的连接找不到服务器了,所以需要关闭当前窗口,重新连接新IP地址就可以了;

* 如果新IP地址也连不上,就可能是IP地址配置错误了,因此这个操作最好在本机上登录使用显示器直连的方式配置;

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图7

ping 8.8.8.8 有返回信息则表示 IP 地址配置正确;


———- 第三部分 系统更新及安装软件 ———-

3.1、使用Ubuntu apt的包更新和升级命令

sudo apt-get update //更新包版本信息 sudo apt-get upgrade //更新本地软件到最新版

不知道是不是因为服务器在中国的缘故,有可能是操作系统比较新,用的包都是最新的,更新速度很快;

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图8

3.2、安装ssh

如果安装的时候忽略了ssh的安装,这里需要再安装下,很简单

sudo apt install ssh

3.3、在本机安装 SFTP 软件

此时已经具备了远程管理的能力,因此在控制台电脑上安装SFTP软件,这里推荐的事macos上的Transmit,非常方便,windows上的软件如 xshell等,大家自行寻找吧。

服务端无需安装任何软件,非常方便

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图9

3.4、 安装redis

sudo apt install redis

这种方式安装的 redis 会自动运行,非常方便;

3.5、安装python3

Ubuntu 22.04 自带了Python 3.10.4 ,所以无需重复安装;

3.6、修改 pip3 下载源

cd // 直接进入服务器的用户目录 mkdir .pip // 在用户目录下新建 .pip 的隐藏目录 vim ~/.pip/pip.conf // 编辑 pip.conf 提供升级地址修改 # 将下列内容拷贝到文件中 [global] index-url=https://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com 

3.7、安装pip

Ubuntu 22.04提供了python3的运行程序,但是没有提供pip3的包管理工具,真是费解。

通过下列命令安装:

sudo apt install python3-pip

3.7、安装 python 必备的软件包

pip3 可以一键安装多个包,我用到的都写这里,一次性安装吧,为了保证以后不出错,这里都指定了版本号。

sudo pip3 install django==4.0.0 requests==2.25.1 redis==4.2.2 xlrd==1.2.0 xlwt==1.3.0 docx2txt==0.8 python-docx==0.8.11 python-pptx==0.6.21 pdfplumber==0.6.1 configparser==5.2.0 uwsgi==2.0.20

3.8、装nginx

sudo apt install nginx

通过浏览器访问 192.168.31.99,看到下面内容,即表示安装成功。

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图10


———- 第四部分 部署与上线调试 ———-

4.1、测试nginx

nginx配置文件的位置在 /etc/nginx/sites-available/ 目录下

sudo service nginx reload # nginx 重新加载配置文件 sudo service nginx restart # 相当于执行 stop + start sudo service nginx start sudo service nginx stop

我的reload 好像总有问题,这里提供两个杀进程的命令

kill -9 xxxx // xxxx为端口号 一般为4位数字 killall -9 nginx // 直接删除和 nginx 有关的所有进程

* 刚开始一直将软件发布在 /home 目录下,一直有问题,无法访问,后来把网站放在 /var/www 目录下,静态网站瞬间就可以访问了,不知道 nginx 是不是对这个目录有特殊的设置。这里就不深究了,希望大家不要也掉这个坑里。

server { listen 8000; // 监听端口 root /var/www/web; // 需要发布的目录 index login.html index.html index.htm index.nginx-debian.html; // 打开网站默认显示的页面名称 location / { // 设定根目录 # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; // 设定404 页面 } }

配置文件的内容也特别简单,可以说是什么都没有做,css、js、jpg、mp4 访问一切正常。

4.2、测试uWSGI

uWSGI 是一个快速的、纯C语言开发的、自维护的、对开发者友好的 WSGI 服务器,旨在提供专业的 Python web应用发布和开发。

大多数 python 程序如 django flask 都使用 uwsgi 来发布应用程序,但不得不说配置uwsgi的过程实在是有点繁琐了。

1、下载安装

安装方法很多,这里先选 ubuntu 最常用的 apt 安装

apt install uwsgi

2、单文件发布

在任意目录新建 test.py 文件,内容为:

def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"]

这里写一下心路历程

i、网上大部分的发布代码都是这样的,几个月之前我还用过,但实现在不行了

uwsgi --http :8000 --wsgi-file ./test.py uwsgi: option '--http' is ambiguous; possibilities: '--http-socket' '--http-socket-modifier1' '--http-socket-modifier2' '--http11-socket' '--https-socket' '--https-socket-modifier1' '--https-socket-modifier2' getopt_long() error 

报错的意思是 –http 的参数改变了 …

ii、于是换成了这样,结果依然报错,意思是 –wsgi-file 这个选项有问题

uwsgi --http-socket :8080 --wsgi-file test.py uwsgi: unrecognized option '--wsgi-file' getopt_long() error

iii、查资料显示 –wsgi-file 参数是和uwsgi的插件有关,于是在apt上查了一下,果然有

,直觉告诉我我应该需要的是 python3 的插件,二话不说,安装

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图11

sudo apt install uwsgi-plugin-python3 

然后运行命令

uwsgi --http-socket :8001 --plugin python3 --wsgi-file ./test.py

终于跑起来了,要知道几个月前还不是这样呢?为什么改变会这么大?

4.3、测试 django

测试方法是进入 Python3,import django ,无反应即表示成功

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图12

i、通过默认应用测试django程序,在控制台界面进行操作

cd // 进入当前账户的个人目录 django-admin startproject django_test // 新建一个项目,名称为 django_test cd django_test // 进入 django_test 目录 python3 manage.py runserver // 运行项目 python3 manage.py runserver 0.0.0.0:9000 // 开启远程访问的启动方式

看到下面的页面即表示启动成功

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图13

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图14

看到这个报错页面就表示成功了,但是由于django的设置默认不允许远程访问,因此报错。

修改settings.py 里的allowed_hosts = [] 为allowed_hosts = [‘*’],即可开启远程访问,

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图15

设置成功后,将看到下面的图片。

如果是本机直接访问127.0.0.1:9000,不用修改即可看到下面界面。

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图16

4.4、uwsgi 通过命令行方式启动django

uwsgi --http-socket :9000 --plugin python3 --wsgi-file ./django_test/wsgi.py

一次搞定,显示了火箭的界面

此处证明 django 没问题,uwsgi 没问题

4.5、nginx 和uwsgi 命令行方式联动发布

nginx配置文件如下:

server { listen 80 default_server; // ip_v4监听接口 listen [::]:80 default_server; // ip_v6监听接口 charset utf-8; // 中文编码 location /{ include /etc/nginx/uwsgi_params; // nginx 安装目录下有这个文件 // 表示动态数据通过UWSGI方式解析 // 需根据实际安装位置更改 uwsgi_pass 127.0.0.1:8001; // 内部 uwsgi 设定的监听接口 uwsgi_read_timeout 2; // 超时时间 } }

uwsgi方面,我们通过一个命令行来启动,为:

uwsgi --socket :8001 --plugin python3 --wsgi-file ./django_test/wsgi.py

说明:

上面的nginx配置表示,对外监听 80 端口,将uwsgi请求发送到本机的 8001端口;

下面这行表示启动了 uwsgi 程序,只接受来自socket(接口)的请求,不接受浏览器直接访问,并通过 ./django_test/wsgi.py 文件进行解析、发布;

这一步成功了就基本成功80%了

4.6、nginx 和 uwsgi ini文件方式联动发布

通过 INI 的方式可以实现对接 nginx ,进而实现开机自动启动,因此通过 ini 方式启动 django 非常重要。废话不说,直接上代码uwsgi.ini 内容如下(最简代码):

[uwsgi] # 使用nginx连接时使用 socket= :8001 # 项目目录 chdir=/root/django_test # 项目中wsgi.py文件的目录,相对于项目目录 module = django_test.wsgi:application pythonpath = /usr/bin plugin = python3

* socket 为对接 nginx 的接口地址,上面已说,不再赘述;
** module 为wsgi启动文件的位置,后面的 application 貌似在刚开始的时候可以不加,但一旦增加多个app 以后可能会无法解析,所以默认还是加上;
*** pythonpath 不是必须,但由于每台设备安装的位置不一样,还是加上保险;
**** plugin = python3 是刚才命令行里加的那句话,如果没有的话会解析不出来报错

4.6、uwsgi 设置自启动

这块只是copy了别人的代码,居然就一次成功了,稳定性赞!

sudo vim /etc/systemd/system/uwsgi.service
[Unit] # 服务名称,应该可以随意 Description=HTTP Interface Server After=syslog.target [Service] # 一个进程状态发送的方式 KillSignal=SIGQUIT # uwsgi.ini文件是你项目下的uwsgi.ini ,就是之前启动 ini 的那一句命令的完全路径版本 ExecStart=/usr/bin/uwsgi --ini /root/django_test/uwsgi.ini # 自动重启 Restart=always # 服务器内部进程通讯的一种模式 Type=notify NotifyAccess=all StandardError=syslog [Install] WantedBy=multi-user.target

将该服务加入到systemd中,重启系统即可实现自启动

systemctl enable /etc/systemd/system/uwsgi.service

管理命令如下:

service uwsgi restart // uwsgi 进程重启 service uwsgi stop // uwsgi 进程停止 service uwsgi start // uwsgi 进程启动

========== 问题汇总 ==========

1、有时启动 nginx 报错,直接运行 nginx 显示

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error) nginx: [emerg] bind() to [::]:80 failed (98: Unknown error) nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Unknown error) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error) nginx: [emerg] bind() to [::]:80 failed (98: Unknown error) nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Unknown error) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error) nginx: [emerg] bind() to [::]:80 failed (98: Unknown error) nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Unknown error) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error) nginx: [emerg] bind() to [::]:80 failed (98: Unknown error) nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Unknown error) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error) nginx: [emerg] bind() to [::]:80 failed (98: Unknown error) nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Unknown error) nginx: [emerg] still could not bind() 

果断 killall -9 nginx,然后直接运行 nginx,即可。

2、通过 INI 文件启动时,有时会有莫名错误,– unavailable modifier requested: 0 –,如下图:

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图17

通过浏览器访问显示502错误。

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图18

解决办法是在 ini 文件里加上一句话 plugin = python3
python3 的名字和 apt install xxx 里的名字保持一致有的版本可能没有3字,自行摸索吧。
这个问题又导致了至少几个小时的投入,最终还是解决了问题。

3、找不到django 应用

在不同平台部署的时候,往往在测试环境一切正常,换了一个系统就会各种报错,我在ubuntu上遇到最多的报错就是无法找到 django应用,如下图:

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图19

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图20

手把手教你 – ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程插图21

类似这样吧的问题,在其他配置没错的情况下往往是找不到路径造成的

比如在编写环境,我们一般用下面代码新增路径

import sys sys.path.append('../')

在生产环境,路径要写绝对路径,不是相对路径

原文链接:https://blog.csdn.net/tacity/article/details/124549903

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享