Python之Django项目部署到Linux
部署环境
- ** Python 3.7.9 + Django 3.1.7 + Gunicorn + Nginx + CentOS8 **
准备CentOS8
root用户下安装相应的编译工具
1 | yum -y groupinstall "Development tools" |
1 | yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel |
1 | yum install -y libffi-devel zlib1g-dev |
1 | yum install zlib* -y |
1 | yum install gcc |
1 | yum install -y pcre-devel |
安装Python3
下载和解压
下载安装包到路径:/user/local/download
1
tar -zxvf Python-3.7.9.tgz
1
cd Python-3.7.9
配置
指定安装路径:/usr/local/python3
1
./configure --prefix=/usr/local/python3 --enable-optimizations --with-ssl
参数解释:
- 第一个指定安装的路径,不指定的话,安装过程中可能软件所需要的文件复制到其他不同目录,删除软件很不方便,复制软件也不方便.
- 第二个可以提高python10%-20%代码运行速度.
- 第三个是为了安装pip需要用到ssl,后面报错会有提到.
Suse Linux无网络情况下如果缺少c或gcc,则按此链接安装。
- 编译
1
make
- 安装
1
make install
创建软链接
1 | ln -s /usr/local/python3/bin/python3 /usr/bin/python |
1 | ln -s /usr/local/python3/bin/pip3 /usr/bin/pip |
如果链接已存在,可删除已有链接
1 | rm -rf /usr/bin/python3 |
测试
1 | python --version |
或
1 | python -V |
如果出现下面错误:
localhost:/usr/local/download/Python-3.7.9 # python --version
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Python 3.7.9
则在文件系统的etc目录下的profile文件中加入下面的语句:
1 | vi /etc/profile |
1 | export PYTHONHOME=/usr/local/python3/lib/python3.7 |
如果出现下面错误:
Python 3.7.9 (default, Mar 8 2021, 14:58:53)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
Traceback (most recent call last):
File "/etc/pythonstart", line 7, in <module>
import readline
ModuleNotFoundError: No module named 'readline'
则执行下面命令安装:
zypper in zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
测试和安装pip3
1 | pip --version |
或
1 | pip -V |
有时安装完python后,缺少pip,可用以下方法尝试安装。
方法一:安装setuptools
- 下载
1
wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz#md5=c607dd118eae682c44ed146367a17e26
- 解压
1
tar -zxvf setuptools-19.6.tar.gz
- 进入
1
cd setuptools-19.6/
- 编译
1
python3 setup.py build
- 安装
1
python3 setup.py install
- 创建软连接
1
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
- 查看pip3版本
1
pip3 -V
方法二:get-pip.py
- 下载get-pip.py 文件
https://pip.pypa.io/en/stable/installing/ - python get-pip.py
- 重新安装python3
如果缺少zlib,安装方法:
curl -O http://www.zlib.net/zlib-1.2.11.tar.gz
tar xvfz zlib-1.2.11.tar.gz
./configure
sudo make && sudo make install
安装Django
1 | pip install django==3.1.7 |
其它Django配置参考Python之Django项目部署到Windows
配置MySQL
安装mysqlclient依赖
1 | pip install mysqlclient |
报错解决:
OSError: mysql_config not found
从No match for argument: gcc-devel 到centos8 的dnf
安装时报错ModuleNotFoundError: No module named ‘_ctypes’的解决办法:
1 | yum install libffi-devel |
然后重新编译安装python
配置Oracle
必需组件:cx_Oracle、Oracle Instant Client
cx_Oracle 使用 pip install cx-Oracle==8.0.1
安装即可。
Oracle Instant Client(Oracle提供的一个简单访问Oracle的组件)
- 从官网下载
下载时检查Oracle数据库的版本以及系统类型,下载相应的文件,如Oracle11.2,centos7.9下载instantclient-basic-linux.x64-11.2.0.4.0.zip
和instantclient-sdk-linux.x64-11.2.0.4.0.zip
。 - 解压两个压缩包到同一目录
instantclient_11_2
下 - 拷贝
instantclient_11_2
到CentOS7目录/usr/local/oracle
下 - 配置环境变量
./bash_profile
文件添加内容:1
vi /root/.bash_profile
使配置生效:1
2export ORACLE_HOME=/usr/local/oracle/instantclient_11_2
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME1
source /root/.bash_profile
- 创建快捷键
1
2
3cd $ORACLE_HOME
ln -s libclntsh.so.11.2 libclntsh.so
ln -s /usr/local/oracle/instantclient_11_2 /usr/local/oracle/instantclient_11_2/lib - 添加共享目录
打开配置文件:添加下面内容:1
vi /etc/ld.so.conf
执行命令使生效:1
/usr/local/oracle/instantclient_11_2
最后,测试是否正常,或重启服务器后再测试。1
ldconfig
配置SQL Server
必需组件:unixODBC、Microsoft ODBC Driver 11 for linux
ODBC驱动安装
用于数据库连接的驱动:
1 | yum -y install unixODBC* |
微软ODBC for linux驱动安装
- 官网下载地址
如果你需要更高版本的驱动程序请转到官网下载,附官网地址(建议旧版安装成功后再选择性升级) - 解压并验证安装条件以下为验证信息
1
2
3
4cd /usr/local/download
tar -zxvf sqlncli-11.0.1790.0.tar.gz
cd sqlncli-11.0.1790.0
./install.sh verify查看依赖包1
2
3
4
5
6
7
8
9
10Microsoft SQL Server ODBC Driver V1.0 for Linux Installation Script
Copyright Microsoft Corp.
Starting install for Microsoft SQL Server ODBC Driver V1.0 for Linux
Checking for 64 bit Linux compatible OS ..................................... OK
Checking required libs are installed ........................................ OK
unixODBC utilities (odbc_config and odbcinst) installed ..................... OK
unixODBC Driver Manager version 2.3.0 installed ......................... FAILED
unixODBC Driver Manager configuration correct ...................... NOT CHECKED
Microsoft SQL Server ODBC Driver V1.0 for Linux already installed .. NOT CHECKED
See /tmp/sqlncli.10874.17476.965/install.log for more information about installation failures.1
ldd lib64/libsqlncli*
如果遇到没有找到的依赖环境组件,如1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24linux-vdso.so.1 => (0x00007fff973fe000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f2deb899000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f2deb695000)
librt.so.1 => /lib64/librt.so.1 (0x00007f2deb48c000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007f2deb21a000)
libuuid.so.1 => /lib64/libuuid.so.1 (0x00007f2deb015000)
libodbcinst.so.1 => /lib64/libodbcinst.so.1 (0x00007f2deae02000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f2deab1a000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f2dea8cd000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f2dea5c4000)
libm.so.6 => /lib64/libm.so.6 (0x00007f2dea2c2000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f2dea0ac000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2de9e8f000)
libc.so.6 => /lib64/libc.so.6 (0x00007f2de9acc000)
libz.so.1 => /lib64/libz.so.1 (0x00007f2de98b6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2dec053000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f2de96b1000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f2de947e000)
libltdl.so.7 => /lib64/libltdl.so.7 (0x00007f2de9274000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f2de9065000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f2de8e61000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f2de8c47000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f2de8a1f000)
libpcre.so.1 => /usr/local/lib/libpcre.so.1 (0x00007f2de8802000)libodbcinst.so.1 => not found
,可以建立个此缺少环境组件名称的软连接并指向此环境组件的高版本,如:完成后可以使用ldd再次验证,确认全部可行后再进行下一步:1
2cd /usr/lib64
ln -s libodbcinst.so.2.0.0 libodbcinst.so.11
ldd lib64/libsqlncli*
- 正式安装
使用install安装命令进行安装:声明文件敲空格阅读,最后输入1
./install.sh install --force
YES
同意安装(注意YES必须使大写):如果出现目录1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Enter YES to accept the license or anything else to terminate the installation: YES
Checking for 64 bit Linux compatible OS ..................................... OK
Checking required libs are installed ........................................ OK
unixODBC utilities (odbc_config and odbcinst) installed ..................... OK
unixODBC Driver Manager version 2.3.0 installed ......................... FAILED
unixODBC Driver Manager configuration correct ...................... NOT CHECKED
Microsoft SQL Server ODBC Driver V1.0 for Linux already installed .. NOT CHECKED
Microsoft SQL Server ODBC Driver V1.0 for Linux files copied ................ OK
Symbolic links for bcp and sqlcmd created ................................... OK
Microsoft SQL Server ODBC Driver V1.0 for Linux registered ........... INSTALLED
Install log created at /tmp/sqlncli.2486.13833.4245/install.log.
One or more steps may have an *. See README for more information regarding
these steps.
/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0
,表示驱动安装完成。 - 配置unixOBDC
1
vi /etc/odbcinst.ini
1
2
3
4
5[SQL Server Native Client 11.0]
Description=Microsoft SQL Server ODBC Driver V1.0 for Linux
Driver=/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0
Threading=1
UsageCount=1
django 配置
进入Django项目目录,修改配置文件 vi setting.py
,在数据库配置项中配置以下信息(基本和Windows配置一样)
1 | DATABASES = { |
配置完成后需要重启uwsgi服务才生效。
安装MySQL5.7
解压安装包
1
tar -zxvf mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz
1
mv mysql-5.7.32-linux-glibc2.12-x86_64 /usr/local/mysql
创建mysql用户组和用户
1
groupadd mysql
1
useradd -r -g mysql mysql
创建数据目录并赋予权限
创建目录1
mkdir -p /data/mysql
赋予权限
1
chown mysql:mysql -R /data/mysql
通常都会将数据存放目录外置到别的目录,这样子升级mysql不会影响历历史数据。
修改配置文件
1
vim /etc/my.cnf
把默认的内容删掉,改为下面的内容即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
#character config
character_set_server=utf8mb4
symbolic-links=0
explicit_defaults_for_timestamp=true
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8初始化数据库
1
cd /usr/local/mysql/bin/
1
./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --user=mysql --initialize
查看root用户密码
1
cat /data/mysql/mysql.err
初始化完成后,默认会生成一个root用户的密码,在最后位置。这里要记住,后面登录的时候需要使用。
启动
使用systemd管理mysql,先创建服务文件mysql.service
1 | vi /usr/lib/systemd/system/mysql.service |
输入以下内容:
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
使文件生效
1 | systemctl daemon-reload |
最后,启动mysql服务
1 | service mysql start |
登录mysql,修改root用户的密码
bin目录下
1 | ./mysql -u root -p |
密码为初始化的时候生成的随机密码串。
1 | SET PASSWORD = PASSWORD('123456'); |
1 | ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER; |
1 | FLUSH PRIVILEGES; |
依次执行上面三条命令,这里密码设置为123456。
远程连接
如果报没权限,因为我们的root用户默认只能够本机访问,这里要开放下,登录mysql,执行如下三条命令即可.
- 访问mysql库
1
use mysql
- 使root能再任何host访问
1
update user set host = '%' where user = 'root';
1
FLUSH PRIVILEGES;
自动备份
创建数据库
1 | CREATE DATABASE `database_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; |
安装Gunicorn
Gunicorn 绿色独角兽’是一个Python WSGI UNIX的HTTP服务器。这是一个pre-fork worker的模型,从Ruby的独角兽(Unicorn )项目移植。该Gunicorn服务器大致与各种Web框架兼容,只需非常简单的执行,轻量级的资源消耗,以及相当迅速。
Gunicorn 服务器作为wsgi app的容器,能够与各种Web框架兼容(flask,django等),得益于gevent等技术,使用Gunicorn能够在基本不改变wsgi app代码的前提下,大幅度提高wsgi app的性能。
执行安装命令
1 | pip install gunicorn |
创建软连接
1 | ln -s /usr/local/python3/bin/gunicorn /usr/bin/gunicorn |
启动
Gunicorn可以以三种方式读取配置信息。
第一种方式:从framework定义的配置信息中读取,目前只对 Paster 框架有效。本方式较少用到。
第二种方式:在命令行中定义,命令行中定义的配置信息将会覆盖掉框架中定义的相同的参数名的值。
第三种方式:将所有的参数信息,放到一个python文件中,只要是在命令行中可以定义的参数中,在配置文件中都可以定义。
命令行启动
命令行有哪些参数可以通过gunicorn -h 查到。
常用的有:
参数 短参数 说明 默认值
–bind -b 绑定服务的IP和端口号。
–workers INT -w 工作线程数量 1
–backlog 服务器中在pending状态的最大连接数,即client处于waiting的数目。超过这个数目, client连接会得到一个error。建议值64-2048。
–worker_connections 客户端最大同时连接数。只适用于eventlet, gevent工作方式。
–pidfile pid存储文件路径。
–access-logfile FILE 访问日志文件
–error-logfile FILE –log-file 错误日志文件
–daemon -D 后台运行 False
–worker-class -k 有 sync, eventlet(并发), gevent, tornado, gthread选项 sync(同步)
–reload 当代码有修改时,自动重启workers。适用于开发环境。
–reload_extra_files 扩展reload配置,增加templates,configurations等文件修改监控。
–check_config 检查配置
进入项目根目录下执行:
1 | gunicorn cam.wsgi:application -w 2 -b 127.0.0.1:8000 |
cam.wsgi:application cam是你django工程的名称,后面不用改
-w –workers 意思是要启动的进程数量
-b –bind 绑定的IP地址和端口
-k –worker-class 启动的worker类型(gthread,sync,eventlet,gevent,tornado),默认是同步阻塞方式启动
配置文件启动
在项目根目录下创建配置文件 gunicorn-config.py
(与setting.py同级目录)
1 | # 配置详解地址:https://blog.csdn.net/wenboyu/article/details/103083395?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_v2~rank_aggregation-1-103083395.pc_agg_rank_aggregation&utm_term=gunicorn+%E5%8F%82%E6%95%B0%E9%85%8D%E7%BD%AE&spm=1000.2123.3001.4430 |
启动可在任意路径下执行:
1 | gunicorn cam.wsgi:application -k gthread -c /usr/local/cam/gunicorn-config.py |
开机启动
编辑启动文件
1 | vi /etc/rc.d/rc.local |
加入以下内容
1 | gunicorn cam.wsgi:application -k gthread -c /usr/local/cam/gunicorn-config.py |
服务启动
建立服务文件
1 | vi /usr/lib/systemd/system/gunicorn.service |
粘入下面内容:
1 | [Unit] |
注意:systemd 不接受非绝对路径执行命令,需要依赖bush-ism,如:
/bin/bash -c 'gunicorn cam.wsgi:application -k gthread -c /usr/local/cam/gunicorn-config.py'
,否则会出现 Executable path is not absolute 的问题 (systemctl status gunicorn.service 中)
使服务文件生效
1 | systemctl daemon-reload |
启动服务
1 | systemctl start gunicorn.service |
访问
安装Nginx
安装教程:Nginx下载和安装
其中,在 server
里增加下面配置:
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://127.0.0.1:8000; #gunicorn
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static {
alias /usr/local/cam/statics; # your Django project's static files - amend as required
}
开启防火墙
为了安全,建议开启防火墙,只允许指定端口。