• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

- ubuntu 22.04 + django4.0 + uwsgi + nginx 配置完整流程

武飞扬头像
tacity
帮助1

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

学新通

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

1.1、下载安装包:

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

制作启动盘:

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

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

学新通

1.3、安装 ubuntu 22.04

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

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

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

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

学新通


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

2.1、设定root密码

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

sudo passwd root

学新通

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

sudo netplan apply

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

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

学新通

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


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

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

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

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

学新通

3.2、安装ssh

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

sudo apt install ssh

3.3、在本机安装 SFTP 软件

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

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

学新通

3.4、 安装redis

sudo apt install redis

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

3.5、安装python3

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

3.6、修改 pip3 下载源

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

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,看到下面内容,即表示安装成功。

学新通


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

4.1、测试nginx

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

  1.  
    sudo service nginx reload # nginx 重新加载配置文件
  2.  
    sudo service nginx restart # 相当于执行 stop start
  3.  
    sudo service nginx start
  4.  
    sudo service nginx stop

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

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

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

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

配置文件的内容也特别简单,可以说是什么都没有做,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 文件,内容为:

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

这里写一下心路历程

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

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

报错的意思是 --http 的参数改变了 ...

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

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

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

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

学新通

sudo apt install uwsgi-plugin-python3

然后运行命令

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

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

4.3、测试 django

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

学新通

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

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

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

学新通

学新通

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

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

学新通

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

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

学新通

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

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

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

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

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

nginx配置文件如下:

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

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 内容如下(最简代码):

  1.  
    [uwsgi]
  2.  
    # 使用nginx连接时使用
  3.  
    socket= :8001
  4.  
     
  5.  
    # 项目目录
  6.  
    chdir=/root/django_test
  7.  
     
  8.  
    # 项目中wsgi.py文件的目录,相对于项目目录
  9.  
    module = django_test.wsgi:application
  10.  
     
  11.  
    pythonpath = /usr/bin
  12.  
     
  13.  
    plugin = python3

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

4.6、uwsgi 设置自启动

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

sudo vim /etc/systemd/system/uwsgi.service
  1.  
    [Unit]
  2.  
    # 服务名称,应该可以随意
  3.  
    Description=HTTP Interface Server
  4.  
     
  5.  
    After=syslog.target
  6.  
     
  7.  
    [Service]
  8.  
    # 一个进程状态发送的方式
  9.  
    KillSignal=SIGQUIT
  10.  
     
  11.  
    # uwsgi.ini文件是你项目下的uwsgi.ini ,就是之前启动 ini 的那一句命令的完全路径版本
  12.  
    ExecStart=/usr/bin/uwsgi --ini /root/django_test/uwsgi.ini
  13.  
     
  14.  
    # 自动重启
  15.  
    Restart=always
  16.  
     
  17.  
    # 服务器内部进程通讯的一种模式
  18.  
    Type=notify
  19.  
     
  20.  
    NotifyAccess=all
  21.  
     
  22.  
    StandardError=syslog
  23.  
     
  24.  
    [Install]
  25.  
    WantedBy=multi-user.target
学新通

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

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

管理命令如下:

  1.  
    service uwsgi restart // uwsgi 进程重启
  2.  
    service uwsgi stop // uwsgi 进程停止
  3.  
    service uwsgi start // uwsgi 进程启动

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

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

  1.  
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error)
  2.  
    nginx: [emerg] bind() to [::]:80 failed (98: Unknown error)
  3.  
    nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Unknown error)
  4.  
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error)
  5.  
    nginx: [emerg] bind() to [::]:80 failed (98: Unknown error)
  6.  
    nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Unknown error)
  7.  
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error)
  8.  
    nginx: [emerg] bind() to [::]:80 failed (98: Unknown error)
  9.  
    nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Unknown error)
  10.  
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error)
  11.  
    nginx: [emerg] bind() to [::]:80 failed (98: Unknown error)
  12.  
    nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Unknown error)
  13.  
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error)
  14.  
    nginx: [emerg] bind() to [::]:80 failed (98: Unknown error)
  15.  
    nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Unknown error)
  16.  
    nginx: [emerg] still could not bind()
学新通

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

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

学新通

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

学新通

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

3、找不到django 应用

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

学新通

学新通

学新通

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

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

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

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhaagi
系列文章
更多 icon
同类精品
更多 icon
继续加载