手把手教你 – 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
sudo passwd root
sudo passwd root

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

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

2.1、开启 root 用户远程登录

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

vim /etc/ssh/sshd_config
vim /etc/ssh/sshd_config
vim /etc/ssh/sshd_config

PermitRootLogin prohibit-password 改为: PermitRootLogin yes

service sshd restart
service sshd restart
service sshd restart

即可实现远程访问。

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

2.3、修改固定IP地址

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

sudo apt install net-tools
sudo apt install net-tools
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
sudo netplan apply
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 //更新本地软件到最新版
sudo apt-get update //更新包版本信息 sudo apt-get upgrade //更新本地软件到最新版
sudo apt-get update //更新包版本信息 sudo apt-get upgrade //更新本地软件到最新版

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

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

3.2、安装ssh

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

sudo apt install ssh
sudo apt install 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
sudo apt install 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
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 
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
sudo apt install python3-pip
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
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
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
sudo apt install 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
sudo service nginx reload # nginx 重新加载配置文件 sudo service nginx restart # 相当于执行 stop + start sudo service nginx start sudo service nginx stop
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 有关的所有进程
kill -9 xxxx // xxxx为端口号 一般为4位数字 killall -9 nginx // 直接删除和 nginx 有关的所有进程
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 页面 } }
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 页面 } }
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
apt install uwsgi
apt install uwsgi

2、单文件发布

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

def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"]
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"]
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
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 
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
uwsgi --http-socket :8080 --wsgi-file test.py uwsgi: unrecognized option '--wsgi-file' getopt_long() error
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
sudo apt install uwsgi-plugin-python3 
sudo apt install uwsgi-plugin-python3

然后运行命令

uwsgi --http-socket :8001 --plugin python3 --wsgi-file ./test.py
uwsgi --http-socket :8001 --plugin python3 --wsgi-file ./test.py
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 // 开启远程访问的启动方式
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 // 开启远程访问的启动方式
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
uwsgi --http-socket :9000 --plugin python3 --wsgi-file ./django_test/wsgi.py
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; // 超时时间 } }
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; // 超时时间 } }
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
uwsgi --socket :8001 --plugin python3 --wsgi-file ./django_test/wsgi.py
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
[uwsgi] # 使用nginx连接时使用 socket= :8001 # 项目目录 chdir=/root/django_test # 项目中wsgi.py文件的目录,相对于项目目录 module = django_test.wsgi:application pythonpath = /usr/bin plugin = python3
[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
sudo vim /etc/systemd/system/uwsgi.service
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
[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
[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
systemctl enable /etc/systemd/system/uwsgi.service
systemctl enable /etc/systemd/system/uwsgi.service

管理命令如下:

service uwsgi restart // uwsgi 进程重启 service uwsgi stop // uwsgi 进程停止 service uwsgi start // uwsgi 进程启动
service uwsgi restart // uwsgi 进程重启 service uwsgi stop // uwsgi 进程停止 service uwsgi start // uwsgi 进程启动
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()
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() 
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('../')
import sys sys.path.append('../')
import sys sys.path.append('../')

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

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

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