本站消息

  出租广告位,需要合作请联系站长

  今日名言-想象你自己对困难作出的反应,不是逃避或绕开它们,而是面对它们,同它们打交道,以一种进取的和明智的方式同它们奋斗 。——马克斯威尔·马尔兹

  今日名言-用谅解、宽恕的目光和心理看人、待人。人就会觉得葱笼的世界里,春意盎然,到处充满温暖。——蔡文甫


+关注
已关注

分类  

python(8)

java(2)

标签  

python(5)

java(1)

日期归档  

暂无数据

基于CentOS7+Nginx+Daphne+uWSGI+Django3.2+supervisor+mysql8的服务器生产环境部署(一)

发布于2021-07-25 07:12     阅读(580)     评论(0)     点赞(8)     收藏(2)


CentOS7+Nginx+Daphne+uWSGI+Django3.2+supervisor+mysql8的服务器生产环境部署 (一)

1. 部署Nginx+uWSGI+Django+mysql

本次服务器部署在腾讯云服务器上CVM上,实例型号如下:
在这里插入图片描述
这里也先说明一下各工具之间的关系以及完成的功能:

Nginx完成代理转发的功能,可以将不同的请求链接转发到不同的服务器上去处理,再将处理得结果返回到各自请求端,可以提高服务器的负载均衡能力。uwsgi的存在在我的理解中是可以更好地支持并发访问和处理,提供多进程多线程服务,充分调动多核cpu的计算性能。因为django原生是单线程的,django的server默认是多线程的。至于mysql,项目中用到该数据库而已,也可以使用别的数据库,在setting.py中配置好就行。

1.1 安装Python3.7,更新yum并创建软链

本云服务器安装镜像的时候自带python2.7.5,但项目使用的是python3.7,所以这里直接升级系统的python版本并用py37创建虚拟环境,升级python:

$ cd /usr/local
$ wget http://npm.taobao.org/mirrors/python/3.7.10/Python-3.7.10.tgz
$ tar -xzf Python-3.7.10.tgz
$ mkdir python3
$ cd Python-3.7.10
$ ./configure --prefix=/usr/local/python3
#升级yum
$ yum update -y
#防止出现丢失的依赖导致的错误,把下面这些包也一起安装了。
$ yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel tk-devel
$ make
$ make install

在/usr/bin路径下创建python37软链(-s),指向已安装的python37~

$ ln -s /usr/local/python3/bin/python3 /usr/bin/python37

在/usr/bin路径下创建pip3软链(-s),指向已安装的pip37~

$ ln -s /usr/local/python3/bin/pip3 /usr/bin/pip37

可以使用python3 -V; python37 -V 查看版本,分别是3.6.8和3.7.10(python3和原始的软链设置有关,没
有python3也没关系,我们用的是python37)

1.2 创建虚拟环境

# 配置并载入 Python3 虚拟环境~
$ cd /opt
# 使用python37作为启动避免冲突, py37 为虚拟环境名称, 可自定义~
$ python37 -m venv py37
# 退出虚拟环境可以使用   deactivate   命令
$ source /opt/py37/bin/activate
(py37) $ cd py37
(py37) $ ls
bin  include  lib  lib64  pyvenv.cfg
# 载入环境后默认以下所有命令均在该虚拟环境(py37) 中运行,且虚拟环境内的python和pip已经对应系统的python37和pip37。可以用-V确认版本。~~
(py37) $ pip install --upgrade pip setuptools

1.3 安装uwsgi

# uwsgi需要使用gcc环境编译否则无法安装成功
$ yum install gcc -y

# 激活django环境
(py37) $ pip install uwsgi

若出现以下错误
在这里插入图片描述
在这里插入图片描述
(参考https://blog.csdn.net/m0_37886429/article/details/86700665
原因是缺少_ctypes模块,其实是没有安装libffi-devel 和 tk-devel,是上面升级python的时候没有升级好,在执行完这条语句之后

$ yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel

没有对python重新进行make install,遂在这里再次安装python。
报错之后首先退出虚拟环境然后重新安装所需要的包再安装python

$ yum install libffi-devel tk-devel
$ cd /usr/local/Python-3.7.10
$ make install
#再次激活虚拟环境
$ source /opt/py37/bin/activate
$ pip install uwsgi

安装成功
在这里插入图片描述
如果依旧报错,那么尝试安装python3-devel,然后再make install 和uwsgi

$ yum install python3-devel
#或者(centos8之后开始dnf)
$ dnf install python3-devel

1.4 安装mysql并新建数据库"xxxxx"(项目所使用的数据库名字)

$ cd /usr/local
$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.13-1.el7.x86_64.rpm-bundle.tar
$ tar -xvf mysql-8.0.13-1.el7.x86_64.rpm-bundle.tar
$ ls

在这里插入图片描述
按照这个顺序安装rpm -ivh common–>lib–>client–>server

$ rpm -ivh mysql-community-common-8.0.13-1.el7.x86_64.rpm
$ rpm -ivh mysql-community-libs-8.0.13-1.el7.x86_64.rpm

报错:
在这里插入图片描述
解决:删掉mariadb-libs(centos7之后默认有mariadb,是mysql的分支)

$ yum remove mysql-libs
$ rpm -ivh mysql-community-libs-8.0.13-1.el7.x86_64.rpm
$ rpm -ivh mysql-community-libs-compat-8.0.13-1.el7.x86_64.rpm
$ rpm -ivh mysql-community-client-8.0.13-1.el7.x86_64.rpm
$ rpm -ivh mysql-community-server-8.0.13-1.el7.x86_64.rpm

报错:
在这里插入图片描述
解决:安装numactl

$ yum install numactl
$ rpm -ivh mysql-community-server-8.0.13-1.el7.x86_64.rpm

Mysql安装成功

通过运行以下命令来启动MySQL服务并使它在启动时自动启动:

$ systemctl enable --now mysqld

检查MySQL服务器是否正在运行,请输入:

$ systemctl status mysqld

安装完之后自动生成密码,执行下面命令获取临时密码

$ grep 'temporary password' /var/log/mysqld.log
#复制临时密码
$ mysql -u root -p
Enter password: //粘贴

修改自己的密码为xxxxxxxxxx

mysql> ALTER user 'root'@'localhost' IDENTIFIED BY 'xxxxxxxxxx';
#新建数据库 videos,项目里的数据库名字就是videos,可改名字记得改settings.py中的配置
mysql> CREATE DATABASE videos;   

1.5 安装Nginx

$ vim /etc/yum.repos.d/nginx.repo


[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

$ yum -y install nginx
$ systemctl enable nginx  #使它在服务器启动时自动启动

1.6 安装项目所需的依赖

按需安装,这里是我按照自己需求安装的依赖

$ pip install django==3.2
$ pip install channels==3.0.3
$ pip install pymysql==1.0.2  #使用mysql则必须安装这个
$ pip install numpy==1.20.2
$ pip install opencv-python==4.5.2.52
$ yum install mesa-libGL.x86_64 //opencv-python 依赖

1.7 上传项目至服务器并做相关配置

本地使用7zip压缩项目
首先压缩为tar,在tar的基础上再压缩为gzip,然后上传到服务器

$ cd /opt
$ tar zxvf app_backen 001.tar.gz

注意确认三个文件的配置:

  • 确认settings.py文件已经做了以下修改:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
STATIC_URL = '/static/'

# 指定静态资源所在的目录
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

# 设置收集静态资源的路径(部署时使用)
STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static/')

上面的设置告诉uwsgi去搜集哪些静态资源,将静态资源搜集到哪里。

  • settings.py里面对mysql配置的修改
    配置好mysql之后(主要是修改密码等),需要执行命令迁移数据库到服务器,自动生成数据表等内容。
$ python manage.py migrate

在这里插入图片描述

数据库移植完之后别忘了创建一个管理员账号
在这里插入图片描述

  • 另一个需要修改的地方是uwsgi.ini在1.8 配置Uwsgi并启动Django中修改。

1.8 配置Uwsgi并启动Django

参考uwsgi文档

1.8.1 新建用户组和用户

为了方便后期与外部的沟通合作以及方便Nginx服务器的部署(防止服务器漏洞被提权所以指定权限受限的用户启动服务器),这里首先创建几个用户组,分别是npu,www,两个用户组。首先用到了www用户组新建用户并安装nginx服务器。
新建用户组:


[root@VM-0-8-centos /]# groupadd -g 103 www
[root@VM-0-8-centos /]# groupadd -g 101 npu

新建用户:

  • www用来启动uwsgi
  • john自用,是由管理员权限的用户(尽量不用root),之后登录都使用john登录,可以使用su-命令(sudo)切换到root和su john切换回john。
$ useradd -s /bin/bash -g www www
$ useradd -s /bin/bash -g npu -G root john     //加入npu组和root组,查看group的时候可以看到两个组里面都有john这个用户
$ passwd www
New password: xxxxxxxxxx
$ passwd john
New password: xxxxxxxxxx

#查看用户情况
$ cat /etc/passwd
$ cat /etc/group
$ cat /etc/shadows

1.8.2 两种方式

Uwsgi启动项目有两种方式,一种是命令行启动,一种是使用Django项目文件中的uwsgi.ini配置文件启动。由于命令行启动需要输入很多配置信息,这里直接使用uwsgi.ini启动。
在manage.py 同目录下(项目根目录),新建uwsgi.ini配置文件,这里上传的Django项目中已经有这个文件,打开该配置文件可以看到配置信息,最好每次启动前对配置信息确认一下。

$ cd /opt/app_backen001/app_backen 
$ ls
'~'           bpmonitor    logs        media         shape_predictor_68_face_landmarks.dat   templates   uwsgi.ini
 app_backen   helloworld   manage.py   __pycache__   static                                  test.mat
$ vim uwsgi.ini


 # uwsig使用配置文件启动
[uwsgi]
# 项目所在的根目录
chdir=/opt/app_backen001

# 主应用的application,
module=app_backen.wsgi:application

#the local unix socket file than commnuincate to Nginx
# 指定sock的文件路径,这个sock文件会在nginx的uwsgi_pass配置,用来nginx与uwsgi通信       
# 支持ip+port模式以及socket file模式
#socket=%(chdir)/uwsgi.sock           
socket=127.0.0.1:9001

# 指定IP端口,web访问入口,也是监听端口,若使用uwsgi启动django,这一项可以不配置
# http=0.0.0.0:8000

# 指定多个静态文件:static目录和media目录,也可以不用指定该静态文件,在nginx中配置静态文件目录
# uwsgi有自己的配置语法,详细可参考官网,无需写绝对路径,可以用循环、判断等高级配置语法
for =static
static-map=/static=%(chdir)/%(_)   #设置静态搜集映射,放到static文件夹中。
endfor =

# 启动uwsgi的用户名和用户组(从用户组而不是root启动防止漏洞导致服务器被入侵)
uid=www
gid=www

# 启用主进程
master=true

# 进程个数       
processes = 16
# 最少进程数(启动时进程数为该值)
cheaper = 2
# 每个进程的子进程数 ,worker进程数一般是cpu核心数
workers=4
# 线程数
threads =4
procname-prefix-spaced=app_backen                # uwsgi的进程名称前缀

# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true

# 序列化接受的内容,如果可能的话
thunder-lock=true

# 启用线程
enable-threads=true

# 设置一个超时,用于中断那些超过服务器请求上限的额外请求
harakiri=60

# 设置缓冲
post-buffering=4096

# 设置日志目录
daemonize=%(chdir)/uwsgi.log

# uWSGI进程号存放,用来控制uwsgi服务
pidfile=%(chdir)/uwsgi.pid

#monitor uwsgi status  通过该端口可以监控 uwsgi 的负载情况
# 支持ip+port模式以及socket file模式
# stats=%(chdir)/uwsgi.status          #启动后在命令行可以直接curl 127.0.0.1:8001访问。
stats = 127.0.0.1:8001

#设置每个工作进程处理请求的上限,达到上限时,将回收(重启)该进程。可以预防内存泄漏
max-requests=5000

接下来可以通过uwsgi启动项目,根据ini文件,会自动提取static文件并且进行其他的初始化设置等。

$ uwsgi --ini uwsgi.ini


# 启动后打印的信息,可以看到static静态文件和media媒体资源目录被uWSGI索引
[uWSGI] getting INI configuration from uwsgi.ini
[uwsgi-static] added mapping for /static => /opt/app_backen210628/app_backen/static
[uwsgi-static] added mapping for /static => /opt/app_backen210628/app_backen/media


# 运行后,自动参数日志、进程,建议自行查看日志文件内容,了解更多uwsgi
$ ls
'~'           bpmonitor    logs        media         shape_predictor_68_face_landmarks.dat   templates   uwsgi.ini   uwsgi.pid
 app_backen   helloworld   manage.py   __pycache__   static                                  test.mat    uwsgi.log

此时可以看到已经有uwsgi.pid并且可以看到log,已经可以成功启动项目
在这里插入图片描述
若启动失败,显示端口已被占用,如下:
在这里插入图片描述
直接杀死占用端口的uwsgi再重新启动即可

$ fuser -k 8000/tcp
#停止uwsgi服务的命令
$ uwsgi --stop uwsgi.pid

在这里插入图片描述
另外,log中显示uwsgi还出现了一个警告
在这里插入图片描述
由于传输的数据中有图片和视频,解决掉这个警告比较好。

$ yum install mailcap

在这里插入图片描述
解决

1.9 配置Nginx并启动Uwsgi

在conf.d中添加自定义的配置文件 app_backen.conf

$ cd /etc/nginx/conf.d
$ touch app_backen.conf
$ vim app_backen.conf


upstream app_backen{
   # nginx通过socket在环回接口地址的9001端口与本地的uWSGI进程通信
   # 支持ip:port模式以及socket file模式
   #server unix:/opt/mywebapp/uwsgi_conf/uwsgi.sock;
   server 127.0.0.1:9001;
}
server {

    listen 9090;   #监听端口
    server_name xxxxxxxxxx; #定义网站域名
    
    access_log /var/log/nginx/access.log;
    charset utf-8;
  
    gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    location / {
        # nginx转发动态请求到uWSGI
        include uwsgi_params;
        uwsgi_connect_timeout 20; 
        uwsgi_pass bpmonitor_app;
    }
    
    # 如果写成/static/,nginx无法找到项目静态文件路径
    location /static {
        alias /opt/app_backen001/static;
    }
}

$ service nginx restart #重启nginx
$ systemctl status nginx.service #查看日志

若报错
在这里插入图片描述
解决方法:
除了用1.8中提到的fuser -k
还可以查看端口或者查看进程
停掉80端口服务,或者杀死进程
在启动nginx服务

$ netstat -anpt
$ kill -9 xxxxx #xxxxx前面不加-

在这里插入图片描述

#重新启动
$ service nginx restart 
$ systemctl status nginx.service

在这里插入图片描述

修改前端IP请求地址,测试是否链接成功。测试期间可能出现各种错误,根据日志中显示的不同错误查看nginx和uwsgi的配置有无错误。

#查看nginx运行情况
$ systemctl status nginx.service
#查看nginx日志
$ cd /var/log/nginx
#查看nginx的配置
$ cd /etc/nginx
#查看nginx文档
$ vim /usr/sbin/nginx

这里可能出现一个错误:
*157 client intended to send too large body: 3303835 bytes, client: 61.150.4
解决办法就是在nginx的我们自定义的配置文件/etc/nginx/nginx.conf中找到http下方的内容,加上
client_max_body_size 200m;
这里设置200MB,考虑到我传输的数据比较大。

注:如果执行 cat /etc/nginx/nginx.conf , 可以看到nginx的主配置文件。其中默认包含一句:include /etc/nginx/conf.d/*.conf
在这里插入图片描述
即从我们刚刚配置文件的目录conf.d导入所有的conf配置文件,因此还有另一种配置nginx的方式,那就是在我们的项目文件中新建conf配置文件并将conf的路径include到这个主配置文件中。

至此完成使用Nginx和uwsgi启动Django项目,也配置完了mysql数据库,django项目中基于http连接请求的部分可以正常运行。第二篇文章会完成基于websocket连接部分的部署,链接在此:基于CentOS7+Nginx+Daphne+uWSGI+Django3.2+supervisor+mysql8的服务器生产环境部署(二)

原文链接:https://blog.csdn.net/m0_47634756/article/details/119028344



所属网站分类: 技术文章 > 博客

作者:小酷狗

链接:http://www.pythonpdf.com/blog/article/419/04c6956f2176067c957c/

来源:编程知识网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

8 0
收藏该文
已收藏

评论内容:(最多支持255个字符)