Nginx+uwsgi+Django实现本地服务器部署发布

目录

安装相关软件包

安装python3.9

安装依赖包

shell 复制代码
yum install libffi-devel -y
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

安装openssl
这里安装的是1.1.1w的版本

shell 复制代码
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz

然后再编译make 安装

shell 复制代码
tar -zxvf openssl-1.1.1w.tar.gz
 
cd openssl-1.1.1w
 
./config --prefix=/usr/local/openssl #如果此步骤报错,需要安装perl以及gcc包
 
make && make install
 
mv /usr/bin/openssl /usr/bin/openssl.bak
 
ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl
 
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig -v # 设置生效

查看系统的当前openssl版本

openssl version -a

卸载默认的python3.6

shell 复制代码
rpm -qa|grep python3|xargs rpm -ev --allmatches --nodeps       卸载pyhton3
whereis python3 |xargs rm -frv           删除所有残余文件
shell 复制代码
或者下载到本地,再上传更快一些。
wget https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz
tar -zxvf Python-3.9.16.tgz
cd Python-3.9.16
./configure --prefix=/usr/local/python3 --with-openssl=/usr/local/openssl 
编译安装
make 
make install
ln -sf /usr/local/python3/bin/python3.9 /usr/bin/python3
python3 
分别检查:
which python
which python3
whereis python 或者whereis python3
也可以检查
同时检查 pip3 和pip
which pip3
which pip
默认没有pip命令,所以还要建立连接一下,yum install pip就有
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
ln -s /usr/local/python3/bin/pip /usr/bin/pip

来源这个小伙伴 linux安装python3.9

Nginx安装

Nginx安装可以看我之前写的博客 Nginx的安装启动和停止

环境准备

1、导出python安装包

python 复制代码
pip freeze > requirements.txt

2、关闭生产环境,在settings文件夹设置(后面uwsgi部署的时候关闭)

python 复制代码
DEBUG = False
ALLOWED_HOSTS = ['*'] # 设置访问白名单

3、收集静态文件

python 复制代码
# settings.py文件配置
STATIC_ROOT = os.path.join(BASE_DIR,"bosszhipin_static")
python 复制代码
# 收集静态文件,但媒体文件没有被收集
(myvenv) PS D:\PycharmProjects\code\BossZhiPin> python manage.py collectstatic
2757 static files copied to 'D:\PycharmProjects\code\BossZhiPin\bosszhipin_static'.

4.服务器拉取git项目代码

python 复制代码
[root@server bosszhipin]# git clone XX.git

5.创建虚拟环境

shell 复制代码
# 安装虚拟环境
pip3 install virtualenv
或
pip3 install virtualenv -i https://pypi.tuna.tsinghua.edu.cn/simple

# 链接一下虚拟环境,不然找不到路径
rm /usr/local/bin/virtualenv  
ln -s /usr/local/python3/bin/virtualenv /usr/local/bin/virtualenv

# 创建虚拟环境
[root@server bosszhipin]# virtualenv myvenv 或python3 -m venv myenv

# 激活虚拟环境
[root@server bosszhipin]# source myvenv/bin/activate
(myvenv) [root@server bosszhipin]# 

# 退出虚拟环境
(my_venv) [root@server bosszhipin]# deactivate

6.导入三方模块,使用aliyun镜像源加载

shell 复制代码
(myvenv) [root@server bosszhipin]# pip3 install -i https://mirrors.aliyun.com/pypi/simple -r requirements.txt 
# 安装mysqllient需要安装mysql开发库
yum install mysql-devel

7.数据库导入

禁用mysql8.0

shell 复制代码
[root@server BossZhiPin]# yum-config-manager --disable mysql80-community

启用mysal5.7

shell 复制代码
[root@server BossZhiPin]# yum-config-manager --enable mysql57-community
mysql 复制代码
mysql> create database bosszhipin;
Query OK, 1 row affected (0.01 sec)

# 关闭InnoDB严格模式
mysql> set global innodb_strict_mode  = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> use bosszhipin;
Database changed

mysql> source bosszhipin.sql;
Query OK, 0 rows affected (0.00 sec)

8、跳过密码检查

bash 复制代码
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"

9、启动就可以访问成功

bash 复制代码
(myvenv) [root@server bosszhipin]# python manage.py runserver 192.168.40.150:9995

部署uwsgi

WSGI是什么?

WSGI(Web Server Gateway Interface)服务器是一种 Web 服务器,它实现了 WSGI 规范,允许 Python Web 应用程序与服务器进行通信。WSGI 规范定义了一种标准的接口,用于连接 Python Web 应用程序和 Web 服务器之间的通信,使得不同的 Web 框架和 Web 服务器能够互相配合运行

WSGI 服务器负责接收来自客户端的 HTTP 请求,并将这些请求传递给绑定的 Python Web 应用程序进行处理,然后将处理结果返回给客户端。

步骤

1、安装 uWSGI

bash 复制代码
(myvenv) [root@server bosszhipin]# pip3 install uwsgi

2、创建 uWSGI 配置文件

Django 项目目录下,创建一个 uWSGI 配置文件。需要指定 Django 应用程序的位置、监听的端口、工作进程数量等信息。

bash 复制代码
(myvenv) [root@server bosszhipin]# cat uwsgi.ini 
[uwsgi]
# 开启主进程
master = true
# 指定工作进程数
processes = 2
# 指定线程数
threads = 2
# 指定项目目录
dir = /root/tools/boss/bosszhipin
# wsgi.py文件位置
wsgi-file = %(dir)/BossZhiPin/wsgi.py
# socket 任意IP地址
socket = 0.0.0.0:8000
# 测试访问
#http = 0:9995
# 日志
log = %(dir)/logs/error.log
chmod-socket = 660
# 退出后清理程序
vaccum = true
max-requests = 1000
# uwsgi的运行状态
status = %(dir)/uwsgi.status
# uwsgi的进程
pidfile = %(dir)/uwsgi.pid                        

3、启动 uWSGI 服务器
使用创建的 uWSGI 配置文件来启动 uWSGI 服务器。

bash 复制代码
(myvenv) [root@server bosszhipin]# uwsgi --ini uwsgi.ini 
停止
uwsgi --stop uwsgi.pid

4、配置 Web 服务器
配置一个 Web 服务器来充当反向代理,将请求从 Web 服务器传递到 uWSGI 服务器,以Nginx为例。

nginx中配置一个server块

nginx 复制代码
# 需要以root用户启用,不然收集的静态文件访问不了
    server {
        listen       80;
        server_name  192.168.40.150;
        location / {
            uwsgi_pass 127.0.0.1:8000; # uwsgi运行端口一样
            include uwsgi_params;
        }
        # 静态文件路径
        location /static/ {
            alias /root/tools/boss/bosszhipin/bosszhipin_static/; # 收集静态文件的位置
        }
        # 媒体资源路径   该路径的资源是不会收集的,需要映射到资源的真实路径
        location /bossApp/media/ {
            alias /root/tools/boss/bosszhipin/media/;
        }
     }

windows配置域名解析(C:\Windows\System32\drivers\etc)

bash 复制代码
192.168.40.150 bosszhipin.dataanalysis.com

可以访问,部署成功

遇到的问题

1、sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)") (Background on this error at: https://sqlalche.me/e/20/e3q8)

这个问题提示数据库密码错误,第一台本地服务器的MySQL版本是8,按道理我可以直接用mysql -uroot -p密码直接登录,应该是没有问题的。看了很多网上很多答案是说密码、权限、django配置其它的,这些操作也都做了,但还是没有解决。

于是换一台安装MySQL5.7版本的服务器,因为我的django配置的数据库也是5.7。但还是出现同样的问题,可能大概率是配置的问题,只能用下面这种方法先执行一下,跳过数据库检查,可以连接成功。

bash 复制代码
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"

2、配置Nginx和UWSGI时要注意细节,要保证它们通信的端口一致,服务是否启动

3、访问Nginx出现403Forbidden错误

这种情况就是权限不够导致的,解决方法为将配置文件的用户更改为root,然后重启nginx即可解决:

nginx 复制代码
user root
bash 复制代码
nginx -s reload

4、保证本地的python环境和服务器的python环境一致,也避免踩坑

相关推荐
粤海科技君11 分钟前
如何使用腾讯云GPU云服务器自建一个简单的类似ChatGPT、Kimi的会话机器人
服务器·chatgpt·机器人·腾讯云
傲骄鹿先生21 分钟前
阿里云centos7.9服务器磁盘挂载,切换服务路径
服务器·阿里云·磁盘
有谁看见我的剑了?1 小时前
Ubuntu 22.04.5 配置vlan子接口和网桥
服务器·网络·ubuntu
infiniteWei1 小时前
【Lucene】全文检索 vs 顺序扫描,为何建立索引比逐个文件搜索更高效?
django·全文检索·lucene
德育处主任Pro1 小时前
『Django』APIView基于类的用法
后端·python·django
编程一生1 小时前
回调数据丢了?
运维·服务器·前端
2401_850410838 小时前
文件系统和日志管理
linux·运维·服务器
一只哒布刘10 小时前
NFS服务器
运维·服务器
苹果醋310 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
Wx-bishekaifayuan11 小时前
django电商易购系统-计算机设计毕业源码61059
java·spring boot·spring·spring cloud·django·sqlite·guava