django+uwsgi+nginx+前后端分离+centos部署一览

  • 150
  • 2023年5月28日16:49:31

话不多说,我们开始。

前置说明

  • 使用nginx反向代理静态文件
  • django仅提供api服务
  • 数据库可以使用内置的sqlite,也提供mysql的配置,根据情况自己选择即可
  • 系统centos7.9,防火墙开启80端口
  • uwsgi部署django服务,高并发

准备

django配置文件要修改一下

DEBUG = False
ALLOWED_HOSTS = ['*']

# 数据库配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
        'CONN_MAX_AGE': 60,
    }
}
# 中文支持
LANGUAGE_CODE = 'zh-hans'
# 上海时区
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
# 不使用UTC时间
USE_TZ = False

# 允许跨域配置
CORS_ORIGIN_ALLOW_ALL = True
# 指明在跨域访问中,后端是否支持对cookie的操作
CORS_ALLOW_CREDENTIALS = True

# 收集各个app的static文件到根目录,python manage.py collectstatic
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

如果你想用mysql,那么数据库配置如下:

# pip3 install pymysql
# 然后在项目的根的init.py文件里写入下面2行代码
# import pymysql
# pymysql.install_as_MySQLdb()
# 再配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '数据库名',
        'USER':'用户名',
        'PASSWORD':'密码',
        'HOST':'节点ip',
        'PORT':3306,
        'CHARSET':'utf8'
    }
}

mysql的安装不赘述,网上资料太多,可以参考:https://blog.csdn.net/xiaoxiaochunmei/article/details/127801648
也可以使用宝塔安装。

如果你用pg数据库,你可以通过下面的命令快速安装

pip3 install psycopg2-binary
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install -y postgresql11-server
sudo /usr/pgsql-11/bin/postgresql-11-setup initdb
sudo systemctl enable postgresql-11
sudo systemctl start postgresql-11

对应的配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': '5432'
    }
}

使用pg的话可以通过options参数指定schema,不指定默认为public。

导出依赖

使用pip freeze > requirements.txt命令
或者pycharm——工具——同步python要求里可以自动生成requirement.txt将依赖说明文件导出到项目根目录

上传代码

登录服务器,新建/home/web/目录,将项目代码和requirement.txt丢上去

安装python3

自带的python是2.7的,咱们需要安装python3,推荐使用源码编译的方式安装,yum上的python3版本较低,官方也没提供预编译版本。
源码下载:https://www.python.org/downloads/source/, 选择Download Gzipped source tarball
上传到/home下,执行:

# 升级openssl,必要
yum install -y gcc gcc-c++ autoconf automake zlib zlib-devel pcre-devel
wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz
tar zxvf openssl-1.1.1t.tar.gz
cd openssl-1.1.1t
./config
make
make install

yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y
tar zxvf /home/Python-3.10.11.tgz
cd Python-3.10.11
./configure
make
make install

第一个yum install是安装编译工具的,如果系统比较简洁的话会导致编译失败所以手动安装一下编译工具链,实测几分钟即可安装编译完成。
输入python3 -V,显示Python 3.10.11,安装成功!

安装依赖

我们cd到requirement.txt的目录,执行命令安装依赖:
pip3 install -r requirements.txt -i https://pypi.douban.com/simple
此处使用豆瓣源加速,很快就能安装好。

安装uwsgi

uwsgi是推荐的的django部署服务器,能大大提高django服务的并发性能。

pip3 install uwsgi

配置uwsgi

在项目根目录下创建uwsgi.ini,内容如下:

[uwsgi]
#服务监听8888端口,选择任意一个未被占用的即可
http = :8888
#配置项目路径,django项目的所在目录
chdir = /home/web/server
#配置wsgi接口模块文件路径,server是django项目下settings.py同级的wsgi文件的目录
module = server.wsgi:application
#配置启动的进程数,越高则并发性能越好,看机器配置能否承载
processes = 2
enable-threads=true
#配置每个进程的线程数,越高则并发性能越好,看机器配置能否承载
threads = 2
#配置启动管理主进程
master = True
#配置存放主进程的进程号文件的位置,放项目目录即可
pidfile = /home/web/server/uwsgi.pid
vacuum = True
lazy-apps = True
log-reopen = True
socket-timeout = 3600
# 后台日志,放项目目录即可
daemonize = /home/web/server/uwsgi.log

初始化数据库

执行以下命令,自动创建django模型对应的数据库。

python manage.py makemigrations
python manage.py migrate

收集静态文件

执行命令收集静态文件

运行 python3 manage.py collectstatic ,自动将各app下的static文件夹复制到根目录static下(例如drf的)

(在Debug模式下django会自动加载静态资源目录)

生产环境,需要用nginx代理static目录
执行好后我们发现在项目同级多了个static目录,里面多了许多静态文件。如果你使用模板,那么到此就收集完成,如果你是前后端分离项目,那么需要单独处理dist目录。

运行uwsgi

使用命令启动uwsgi和django服务

uwsgi --ini uwsgi.ini文件的路径

安装nginx

nginx的作用是代理静态文件,nginx处理静态文件的性能远超django

安装nginx

yum install nginx -y
nginx

很快就安装好,我们在/etc/nginx/conf.d/下新增web.conf(后缀必须是.conf,前面无所谓),内容如下

server {
    listen       80;
    server_name  localhost;

    location / {
       # web服务静态目录, 此处填写static目录或者前端编译的dist目录
        root   /home/web/server/dist;
        try_files $uri $uri/ /index.html;
        index index.html index.htm;
    }

    # 此处将api的请求转发到http://127.0.0.1:8888/api(也就是uwsgi地址),这两处的的api根据你的后端接口的前缀自行修改
    location /api {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 后端的真实接口
        proxy_pass http://127.0.0.1:8888/api;
    }
}

检查配置的正确性:
nginx -t
重启nginx:
nginx -s reload

收尾

防火墙注意要开启80端口。
此时我们访问ip,发现已经能看到前端页面,说明nginx代理成功
file
查看接口也有数据,uwsgi部署的后端服务也正常运行。
至此,部署结束。

本文来自凡蜕博客(https://blog.ysboke.cn), 转载请带上地址.。
匿名

发表评论

匿名网友