当前位置:   article > 正文

2024最新从0部署Django项目(nginx+uwsgi+mysql)

2024最新从0部署Django项目(nginx+uwsgi+mysql)

云服务器

我这里用的是腾讯云免费试用的2H4Gcentos服务器(后升级为2H8G,保险一点提高内存)

因为网上很多关于django部属的教程都是宝塔啊,python版本控制器啊这种的,我也误打误撞安装了宝塔面板,但这里我只是简单初始化了一下,然后就删除了

(因为它自带安装了nginx和php,mysql啥的,弄得环境很混乱,下载了如果不熟练宝塔操作的话建议删除宝塔,删除的时候要sudo一下

[wget http://download.bt.cn/install/bt-uninstall.sh],[sh bt-uninstall.sh]

它会自己将额外下载的软件都删掉),

后续其他安装软件,配置环境,部署都是通过命令行+pycharm操作,不使用宝塔提供的建站功能。

原因是原版的python版本控制器已经下架,其次现在的宝塔python项目建站对于配置项目环境非常不便,比如我们不想要服务器自带的3.6版本python,并且有大量的其他库需要安装,这时候宝塔提供的python安装版本不属于一个实际的环境,也就是说我们能得到这个版本的python,但是并无法将其当做环境配置。(据我了解好像通过软链接或者其他办法可以修改系统环境)

服务器配置

anaconda

其实不在服务器上的话,大多数人应该自己本地都有anaconda的,由于服务器上环境实在是需要虚拟环境,不管是哪种部属办法,所以我们这里还是用anaconda来管理虚拟环境,也方便了后续pycharm中选择环境

这里要先自己创建一个文件夹存放anaconda,有宝塔面板的话相当于也可以图形化界面操作,没有的话如果用腾讯云提供的在线命令行窗口也可以进行图形化界面操作,如果是其他ssh方式连接的命令行就需要mkdir了

最新的linux安装anaconda指令(不sudo不行)

sudo wget https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh

这条命令得到的.sh文件会直接存放在当前文件夹下,也就是提前要自己cd改好当前路径

确定当前文件夹下有.sh文件,执行命令

bash Anaconda3-2024.02-1-Linux-x86_64.sh

然后按回车开始阅读相关条例,大概要一直按到15.12,(可以按住回车不放)

到这里的时候可以输入yes了,然后会提供安装路径选择,这时候可以填上刚刚创建的文件夹了,也可以直接回车,我看这个路径就是我们用户路径下就没改了,直接按得回车

新建一个窗口后打开时就会有一个默认的用户base环境了

运行一个简单的conda指令检测安装环境是否正确

创建自己指定版本的conda虚拟环境(这里以3.9为例)

conda create -n env_name python=3.9

激活环境:conda activate env_name

这里的env_name是自己取的,激活的时候要与创建的时候名字一致


nginx

我腾讯云服务器上的系统仓库中没有nginx,不能直接执行yum install nginx

直接从nginx官网下载源文件压缩包进行操作,我选择了稳定版本1.24.0

>cd ~

>wget http://nginx.org/download/nginx-1.24.0.tar.gz

>tar -zxvf nginx-1.24.0.tar.gz

>cd cd nginx-1.24.0

>./configure --prefix=/usr/local/nginx --with-http_ssl_module  // 解压到/usr/local/nginx文件夹下,并且支持ssl

>make

>sudo make install

输入nginx -v看配置是否正确

我这里是遇到了好几类错误

1.关于库文件找不到(如openssl相关库)

2.日志文件找不到,打不开,无权限...

3.启动时nginx权限不够,无法绑定默认端口(80)

1.第一个问题我的解决方案是,通过find命令,找到对应的库,设置软链接

[以nginx: error while loading shared libraries: libcrypto.so.3: cannot open shared object file: No such file or directory为例]

①sudo find / -name "libcrypto.so.3"

②sudo ln -s /home/lighthouse/anaconda3/lib/libcrypto.so.3 /usr/lib64/libcrypto.so.3

注意:

第二步左侧的路径是执行第一步后,命令行输出的众多路径中选择一条(避免后续出现权限不足的问题,如果有home路径下的可选项尽量都选home路径下的)

2.第二个问题我的解决方案是,如果文件不存在,那就创建文件,如果文件夹不存在就创建文件夹,如果没权限,就直接将权限开到最大

>>创建文件的方法我就省略了,提一下开放权限的命令

cd /usr/local/nginx/

chmod -R 777 logs 

注意:

这里的777是最高权限的一个代码,不要改

logs是你要开放权限的文件夹

3.第三个问题,使用vim进入配置文件将监听端口改为8080

具体vim指令进入文件后的操作如上图所示

(另:80端口也行,好像用sudo指令启动就不会报错)

还有可能遇到pid文件不存在的情况,pid一般由nginx启动自己生成,是为了防止重复启动,表示nginx进程已经存在的标识文件,所以这个文件不存在的问题一般不用管

这里再附上几个测试用的指令

ps ajx|grep nginx  //我的服务器好像是一直有一条记录,启动后会有四条

//查看80端口使用情况(正常情况未启动时应该没有记录输出)

netstat -tuln | grep :80

//查看nginx版本

nginx -v

//检查配置文件的正确性

nginx -t

//根据指定配置文件启动nginx(不要打多余的空格,每个间隔一个空格即可)

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

//友好退出nginx

/usr/local/nginx/sbin/nginx -s quit

//暴力退出nginx

/usr/local/nginx/sbin/nginx -s stop

以上除了三、四条执行不需要sudo以外,如果遇到指令不被允许执行的情况自行添加sudo

执行上面的启动指令之后,

看到这个页面,nginx的正确配置以及启动就结束了


项目python环境配置

先启动conda环境,输入conda list如果找不到指令的话,进入~/.bashrc,在末尾添加conda可执行文件的环境变量(这里也是通过vim指令修改)

export PATH=~/anaconda3/bin:$PATH

然后source ~/.bashrc,尝试conda activate env_name

系统提示让我输入conda init指令,输入完后又提示我要重启对话框,然后来到如下页面

注意这里的区别,有base则证明conda是启动了的,可以执行相关conda命令

然后activate我们的环境变量名称 conda activate env_name

此时进入到我们Django项目下找到requirements.txt文件(将项目文件上传到服务器的方法有很多,且没什么需要注意的点,这里就自行查找)

导出requirements.txt的方法(进入项目根目录)

pip install pipreqs

pipreqs .

在进入项目目录后,确保当前路径下存在requirements.txt文件

执行pip install -r requirements.txt


安装uwsgi

pip install uwsgi 报错:(python3.9版本)

ERROR: Could not build wheels for uwsgi, which is required to install pyproject.toml-based projects

解决办法:更换安装指令(不要信网上其他的安装办法,安一堆结果还是各种环境错误)

(conda指令yyds!!!)

conda install uwsgi

配置uwsgi.ini文件

在项目根目录下创建该文件(project/project/uwsgi.ini)

uwsgi --stop uwsgi.pid //根据pid文件停止uwsgi服务

uwsgi --ini uwsgi.ini //根据uwsgi.ini启动uwsgi服务(要cd到配置文件的上级目录)

配置nginx.conf文件

  1. http {
  2. #其他内容
  3. upstream Django{
  4. server 127.0.0.1:8001;
  5. }
  6. server {
  7. listen 80;
  8. server_name *.*.*.*;#这里写服务器ip
  9. charset utf-8;
  10. location /media {
  11. alias /home/lighthouse/PocketGen/media;
  12. }
  13. location /static{
  14. alias /home/lighthouse/PocketGen/static;
  15. }
  16. #access_log logs/host.access.log main;
  17. location / {
  18. uwsgi_pass Django;#这里要和upstream对应
  19. include uwsgi_params;
  20. }
  21. }
  22. }

uwsgi.ini里的配置项只能多尽量不要少于我的

比如pidfile是用来停止uwsgi服务的,不然有点麻烦

其次log文件是帮助我们在debug=false情况下很好排查错误的地方

其他的配置也都有一定作用,需要修改可以自行查找相关资料

后续配置问题补充:

启动nginx发现一直502 bad gateway

查看uwsgi.log发现

uwsgi-invalid-request-block-size invalid request block size: *** (max 4096)...skip

解决办法:

nginx配置文件:添加两行:

uwsgi_buffer_size 16k;

uwsgi_busy_buffers_size 24k;

uwsgi.ini添加一行:

buffer-size = 32768 // 这个数值可以根据需求继续加大

后续配置问题补充:

打开网页无法正常加载对应静态文件

问题原因:nginx自身权限不足,需要在配置文件第一行改(补)写一行:

user root;


MySQL安装及配置

这里附上三篇保姆级教程,基本解决配置的全过程,且是24年最新的

http://t.csdnimg.cn/nCsAG

http://t.csdnimg.cn/cr3cC

http://t.csdnimg.cn/jOkPJ

留一句心得:凡是莫名其妙不可以执行的命令,用sudo有奇效

如果安装遇到这个错误在教程中有解决办法,补充执行一条命令即可,其他命令无需重复执行,且不影响mysql的正常使用

登录时遇到:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

处理办法:

通过指令找到该文件,并设置软链接即可

find / -name mysql.sock

ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

软链接重启机器后概率会失效,最好还是去设置环境变量

命令总结:

ps -ef | grep mysql        //查看mysql进程

netstat -tlnp | grep mysql //查看mysql启动端口(默认3306)

systemctl start mysqld.service //启动mysql

systemctl stop mysqld.service //结束

systemctl restart mysqld.service //重启

mysql -uroot -ppassword //root为用户名,password为密码,登录命令

use mysql; //进入mysql数据库(有分号)

quit //退出mysql

大多数教程都是教navicat的连接方式,我这里附上dbeaver的连接方式

因为也是完全自己一个人尝试了很久试出来的

连接后大致看到的就是这样

导入本地数据库(导入已有数据)

先创建一个数据库,为了方便导入,数据库的名字也和本地取一样的(导出sql文件的时候会带有数据库名字的信息)

执行第一次python manage.py makemigrations

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.

这是我在本地没见过的报错,查找相关资料以后得出解决步骤:

//安装mysql驱动并指定为清华源

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pymysql

//settins.py中对照修改好对应信息,host不用改

  1. DATABASES = {
  2. 'default':
  3. {
  4. 'ENGINE': 'django.db.backends.mysql', # 数据库引擎
  5. 'NAME': '', # 数据库名称
  6. 'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
  7. 'PORT': 3306, # 端口
  8. 'USER': 'root', # 数据库用户名
  9. 'PASSWORD': '', # 数据库密码
  10. }
  11. }

//settings.py同级目录下找到__init__.py文件,写入以下代码

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

剩下执行时django会帮我们检查项目中所有的导包问题,环境问题,以及语法错误

只需要对应做好环境配置修改即可

同时注意,清空各个app中的migrations文件,以便于有一个干净的数据库操作记录

然后执行migrate,显示信息应该大致相同

通过migrate创建出我们所有需要用的数据库表,然后本地只导出我们自己使用的那部分表的数据进行插入就好了

不熟悉导入导出操作的可以本地用自己本地数据库创建一个新库,模拟导入导出的过程,感受一下


PyCharm连接服务器

用pycharm连接服务器的好处在于有代码或者文件的更改能实时对应上服务器的状态,方便后续网站资源的更改和代码的修改

首先需要一个pycharm专业版,能够支持ssh连接,然后就是找一篇浏览高的博客(doge)

这里Pycharm连接我感觉对于Django项目的需求不是很大吧,服务器环境配好之后,后续代码小改的话,用本地run server 测试就够了,服务器只是方便后续上线供公网访问

大致的操作就是这样了,不用pycharm的话,项目中期可以试着将项目版本挂上去试试能不能跑,后期最终版确定之后,可能有新加的静态文件,可能有数据库的改动,省事的操作就是将老项目文件删了,然后重新收集一下静态文件,把数据库也全部删了,重新迁移一次。


(以上纯扯淡,虽然说不连,但还是连了

说下为什么还是连了,因为我项目文件有好几个G,而传统的文件传输方式都不支持大文件的传输,压成zip也不行,后来想起pycharm传zip再unzip可行,而且比较快,所以花了几分钟连了一下(之前连过两次,花了几个小时,也算是小小成长了一波!)

一、打开项目的python解释器,添加(选择ssh方式)

主机就是服务器的ip,用户一般添root,然后填密码啥的

二、选择conda虚拟环境

找到conda可执行文件,一般在bin目录下,名字就叫conda

然后加载已有的环境,选自己配好的那个就行

三、选择项目映射路径(这里是方便进行自动上传文件,自己选个位置就行了)

实在还没懂,点击链接查看图文教程


项目的额外事项

celery

前置的环境配置就是pip install 一堆,配置完之后再pip install 缺什么装什么就行

celery配置教程1

celery配置教程2

启动worker的指令,在项目根目录下

celery -A celery_task worker -l INFO

推荐后台启动,不然每次connection一断,worker也停了

Celery启动与停止教程

ps -ef | grep celery

redis

centos7无痛安装redis教程,最省事的一集

无需考虑gcc编译器版本不够,符合大部分服务器的初始配置

1.启动redis服务

redis-server

2.查看redis的启动状态

ps aux|grep redis

3.进入redis测试连接状态

redis-cli(服务启动了的话,左边就会显示运行的ip以及端口)

ping

关机后重启需要注意的点

  1. mysql启动文件用的软链接,得重新定向一下
  2. nginx和uwsgi可以直接用正常方法启动
  3. redis记得启动
  4. worker记得启动

到这里项目基本已经可以上线运行服务了,完结撒花~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/558730
推荐阅读
相关标签
  

闽ICP备14008679号