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的包更新和升级命令
sudo apt-get update //更新包版本信息 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 下载源
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,看到下面内容,即表示安装成功。
———- 第四部分 部署与上线调试 ———-
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 的插件,二话不说,安装
sudo apt install uwsgi-plugin-python3
然后运行命令
uwsgi --http-socket :8001 --plugin python3 --wsgi-file ./test.py
终于跑起来了,要知道几个月前还不是这样呢?为什么改变会这么大?
4.3、测试 django
测试方法是进入 Python3,import django ,无反应即表示成功
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 // 开启远程访问的启动方式
看到下面的页面即表示启动成功
看到这个报错页面就表示成功了,但是由于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配置文件如下:
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 –,如下图:
通过浏览器访问显示502错误。
解决办法是在 ini 文件里加上一句话 plugin = python3
python3 的名字和 apt install xxx 里的名字保持一致有的版本可能没有3字,自行摸索吧。
这个问题又导致了至少几个小时的投入,最终还是解决了问题。
3、找不到django 应用
在不同平台部署的时候,往往在测试环境一切正常,换了一个系统就会各种报错,我在ubuntu上遇到最多的报错就是无法找到 django应用,如下图:
类似这样吧的问题,在其他配置没错的情况下往往是找不到路径造成的
比如在编写环境,我们一般用下面代码新增路径
import sys sys.path.append('../')
在生产环境,路径要写绝对路径,不是相对路径
原文链接:https://blog.csdn.net/tacity/article/details/124549903