一、部署说明
部署Python语言开发的web项目
Centos7.5 + Nginx + Python + Django + uwsgi + MySQL
uwsgi作用是把Python变成一个服务
二、部署流程
- Nginx安装:
略。
- MySQL5安装:
使用的工具包版本:cmake-3.6.0-rc1.tar.gz boost_1_59_0.tar.gz mysql-5.7.27.tar.gz
以上版本已经过测试,工具包保存在腾讯微云和U盘,其他版本慎重选择
说明:安装MySQL5只能使用boost_1_59_0.tar.gz,安装MySQL8需要安装最新版的boost
官网:cmake.org boost.org
1)安装依赖包
yum -y install ncurses-devel gcc-* bzip2-* bison
yum -y install gcc-*
2)安装cmake工具(MySQL使用cmake命令代替configure来配置)
wget https://cmake.org/files/v3.6/cmake-3.6.0-rc1.tar.gz
tar xf cmake-3.6.0-rc1.tar.gz
cd cmake-3.6.0-rc1
./configure
make -j4
make install
cmake --version
3)放好boost库文件,编译时会自动解压
wget https://dl.bintray.com/boostorg/release/1.59.0/source/boost_1_59_0.tar.gz
mkdir /usr/local/boost #没有就创建
cp boost_1_59_0.tar.gz /usr/local/boost/
4)安装MySQL
①下载MySQL5.7.27源码包,(采用源码安装)
②tar xf mysql-5.7.27.tar.gz
③cd mysql-5.7.27
-----------------------编译-----------------
④
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_DEBUG=0 -DWITH_EMBEDDED_SERVER=1 -DDOWNLOAD_BOOST=1 -DENABLE_DOWNLOADS=1 -DWITH_BOOST=/usr/local/boost
---------------------------------------------
cmake .
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql #指定安装路径
-DMYSQL_DATADIR=/usr/local/mysql/data #指定数据目录
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock #指定sock文件路径
-DWITH_INNOBASE_STORAGE_ENGINE=1 #安装Innodb存储引擎
-DWITH_MYISAM_STORAGE_ENGINE=1 #安装myisam存储引擎
-DENABLED_LOCAL_INFILE=1 #允许使用Load data命令从本地导入数据
-DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci #安装所有字符集,默认字符集utf-8,校验字符
-DWITH_DEBUG=0 #关闭DEBUG
-DWITH_EMBEDDED_SERVER=1 #生成一个libmysqld.a(.so)的库,这个库同时完成了MySQL服务与客户端API
-DDOWNLOAD_BOOST=1 -DENABLE_DOWNLOADS=1 -DWITH_BOOST=/usr/local/boost #允许boost,允许下载boost库文件
-------------------
如果编译过程出错,想重新配置,先`rm -f CMakeCache.txt`再重新配置即可,如果还不行,就删除刚刚解压的mysql-5.7.27目录,重新编译
⑤4核同时工作继续编译:make -j4
如果出现`c++: 编译器内部错误:已杀死(程序 cc1plus)`可能是内存不足,增加内存再试
⑥make install
⑦初始化
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chmod 755 /etc/init.d/mysql
useradd -s /sbin/nologin -r mysql
chown mysql.mysql /usr/local/mysql/ -R #下面的ln语句一起复制
ln -sf /usr/local/mysql/bin/* /usr/bin/
ln -sf /usr/local/mysql/lib/* /usr/lib/
ln -sf /usr/local/mysql/libexec/* /usr/local/libexec
ln -sf /usr/local/mysql/share/man/man1/* /usr/share/man/man1
ln -sf /usr/local/mysql/share/man/man8/* /usr/share/man/man8
⑧ vim /etc/my.cnf
修改5个地方:basedir、 datadir、 socket、 log-error、 pid-file
⑨ 生成root的临时密码,记住这个密码
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
5)启动测试
/etc/init.d/mysql start
isof -i :3306
修改密码:mysql_secure_installation 删除匿名用户
登录:mysql -u root -p12345678
- Python安装:
①下载:
wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz
②解压:
tar xf Python-3.7.4.tar.xz
③编译:
yum -y install gcc-* openssl-* libffi-devel sqlite-devel
./configure --enable-optimizations --with-openssl=/usr/bin/openssl
④安装:
make -j4
make install
⑤完成
可执行文件安装路径:/usr/local/lib/Python3.7
输入:Python3进行测试
升级pip:pip3 install --upgrade pip
可以选择删除安装文件夹:rm -rf Python3.7.4
⑥装虚拟环境 pip3 install virtualenv
virtualenv是一个创建隔绝的Python环境的工具。virtualenv创建一个包含所有必要的可执行文件的文件夹,用来使用Python工程所需的包
因为用Python开发了好几个项目,每个项目使用的环境和插件都不一样,这样就需要来回装插件和卸插件,
如果有了虚拟化环境,就把Python虚拟成多个环境,每个项目使用一个环境
附一般使用方法:
1.比如某项目,需要独立Python环境,先创建目录:
mkdir myproject; cd myproject;
2.使用命令`virtualenv`创建一个独立的Python运行环境,参数--no-site-packages表示不复制所有已经安装在系统的Python环境中的第三方包,得到干净的Python环境
virtualenv --no-site-packages venv
3.新建的Python环境放在当前目录下的venv目录,可以用source进入该环境
source venv/bin/activate
4.注意到命令提示符变了,有个(venv)
前缀,表示当前环境是一个名为venv
的Python环境,
在venv
环境下,用pip
安装的包都被安装到venv
这个环境下,系统Python环境不受任何影响。也就是说,venv
环境是专门针对myproject
这个应用创建的
退出当前的venv
环境,使用deactivate
命令:
deactivate
⑦安装Django
pip3 install django==2.2
- 发布网站
实验结果:访问127.0.0.1出现Django的欢迎界面,直接访问127.0.0.1:9090不会出现Django的欢迎界面,不知道为什么
Django项目所在路径:/usr/local/nginx/html/myweb
wsgi文件所在路径在项目下的:myweb/wsgi.py myweb.wsgi
所用的Python虚拟环境:/usr/local/nginx/html/myweb/venv
①安装uwsgi
uwsgi是服务器和服务端应用程序的通信协议,规定了怎么把请求转发给应用服务器和返回
uWSGI是一个web服务器,它实现了WSGI协议、uwsgi、http等协议。
Nginx中HTTPUwsgiModule的作用是与uWSGI服务器进行交换。
Nginx和uWSGI交互就必须使用同一个协议。而上面说了uwsgi支持fastcgi,uwsgi,http协议,这些都是nginx支持的协议
只要大家沟通好使用哪个协议,就可以正常运行了。
pip3 install uwsgi
②编辑uwsgi配置文件,添加uwsgi账户
useradd -s /sbin/nologin -r uwsgi
mkdir /etc/uwsgi
vim /etc/uwsgi/uwsgi.ini
----------
[uwsgi]
uid = uwsgi //uwsgi服务所有者
gid = uwsgi //uwsgi服务所有组
socket=127.0.0.1:9090 //监听的端口,相当于Django项目的8000端口,这里改成了9090
master = true //启动主进程
vhost = true //多站模式,可以发布多个网站
no-site = true //多站模式时不设置入口模块和文件
workers = 2 //子进程数
reload-mercy=10 //平滑的重启
vacuum=true //退出、重启时清理文件
max-requests=1000 //开启10000个进程后,自动respawn下,处理多少个请求后,重新生成一个请求
limit-as=512 //将进程的总内存量控制在512M
buffer-size = 30000
pidfile = /var/run/uwsgi9090.pid //pid文件,用于下面的脚本启动、停止该进程
daemonize = /var/log/uwsgi9090.log //uwsgi运行日志
pythonpath = /usr/local/nginx/html/myweb/venv/lib/python3.7/site-packages #该项目的Python虚拟环境中的Django包所在目录,加入到Python环境变量
--------------
③启动uwsgi
uwsgi --ini /etc/uwsgi/uwsgi.ini
netstat -ntpl
④停止uwsgi
cat /var/run/uwsgi9090.pid
101445
kill -9 101445
⑤启停uwsgi的脚本
vim /etc/init.d/uwsgi
chmod 755 /etc/init.d/uwsgi
⑥脚本使用
/etc/init.d/uwsgi status
/etc/init.d/uwsgi start
/etc/init.d/uwsgi stop
--------------
#! /bin/sh
DESC="uwsgi daemon"
NAME=uwsgi
DAEMON=/usr/local/bin/uwsgi
CONFIGFILE=/etc/uwsgi/$NAME.ini
PIDFILE=/var/run/{$NAME}9090.pid
SCRIPTNAME=/etc/init.d/$NAME
FIFOFILE=/tmp/uwsgififo
set -e
[ -x "$DAEMON" ] || exit 0
do_start() {
if [ ! -f $PIDFILE ];then
$DAEMON $CONFIGFILE || echo -n "uwsgi already running"
else
echo "The PID is exist..."
fi
}
do_stop() {
if [ ! -f $PIDFILE ];then
$DAEMON --stop $PIDFILE || echo -n "uwsgi not running"
rm -f $PIDFILE
echo "$DAEMON STOPED."
else
echo "The $PIDFILE doesn't found"
fi
}
do_reload() {
if [ -p $FIFOFILE ];then
echo w > $FIFOFILE
else
$DAEMON --touch-workers-reload $PIDFILE || echo -n "uwsgi can't reload"
fi
}
do_status() {
ps aux|grep $DAEMON
}
case "$1" in
status)
echo -en "Status $NAME: "
do_status
;;
start)
echo -en "Starting $NAME: "
do_start
;;
stop)
echo -en "Stopping $NAME: "
do_stop
;;
reload|graceful)
echo -en "Reloading $NAME: "
do_reload
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload}" >&2
exit 3
;;
esac
exit 0
---------------
Nginx发布网站
nginx配置文件
`访问127.0.0.1出现Django的欢迎界面`
-----
server {
listen 80;
server_name localhost;
#access_log logs/abc.log main;
location / { //此处配置的是动态页面的处理,即类似交给127.0.0.1:8000端口进行处理,静态页面或文件另配一个location
include uwsgi_params;
uwsgi_pass 127.0.0.1:9090;
uwsgi_param UWSGI_SCRIPT myweb.wsgi; //uwsgi运行的参数1:Django项目中的uwsgi.py文件的位置,相当于myweb/wsgi.py
uwsgi_param UWSGI_CHDIR /usr/local/nginx/html/myweb; //uwsgi运行的参数2:Django项目的路径
index index.html index.htm;
client_max_body_size 35m; //客户端最大请求体大小
#下面是线上优化方案,可以直接用
#uwsgi_cache_valid 1m;
#uwsgi_temp_file_write_size 64k;
#uwsgi_busy_buffers_size 64k;
#uwsgi_buffers 8 64k;
#uwsgi_buffer_size 64k;
#uwsgi_read_timeout 300;
#uwsgi_send_timeout 300;
#uwsgi_connect_timeout 300;
}
}
---