案例

 一、部署说明

  部署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;
}
}
---
原文地址:https://www.cnblogs.com/staff/p/11511135.html