CentOS7安装python生产环境

1. 安装 Mysql

添加 MySQL YUM 源

$wget 'https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm'

$sudorpm -Uvh mysql57-community-release-el7-11.noarch.rpm

$yum repolist all | grepmysql

mysql-connectors-community/x86_64MySQL Connectors Community         36

mysql-tools-community/x86_64MySQL Tools Community            47

mysql57-community/x86_64MySQL 5.7 Community Server         187

安装最新版本

$sudoyum installmysql-community-server

启动服务

$sudo service mysqld start

$sudo systemctl start mysqld #CentOS 7

$sudo systemctl status mysqld

● mysqld.service - MySQL Community Server

  Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)

  Active: active (running) since Sat 2017-05-27 12:56:26 CST; 15s ago

 Process: 2482 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)

 Process: 2421 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)

 Main PID: 2481 (mysqld_safe)

  CGroup: /system.slice/mysqld.service

      ├─2481 /bin/sh /usr/bin/mysqld_safe --basedir=/usr

      └─2647 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/...

说明已经正在运行中了

修改密码

$ mysql -uroot -p

这里有要求你输入密码,Mysql安装时会生成一个默认密码,使用 grep "temporary password" /var/log/mysqld.log 命令,返回结果最后引号后面的字符串就是root的默认密码

mysql> ALTERUSER'root'@'localhost'IDENTIFIED BY'NewPassword';

修改编码

在 /etc/my.cnf 中设置默认的编码

[client]

default-character-set = utf8

[mysqld]

default-storage-engine = INNODB

character-set-server = utf8

collation-server = utf8_general_ci #不区分大小写

collation-server = utf8_bin #区分大小写

collation-server = utf8_unicode_ci #比 utf8_general_ci 更准确

创建数据库

mysql> CREATEDATABASE CHARACTERSETutf8;

2. 安装python3

CentOS 7 默认安装了 Python 2,当需要使用 Python 3 的时候,可以手动下载 Python 源码后编译安装。

安装 Python 3

sudo mkdir /usr/local/python3# 创建安装目录

$ wget --no-check-certificate https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz # 下载 Python 源文件

# 注意:wget获取https的时候要加上:--no-check-certifica

$ tar -xzvf Python-3.6.2.tgz # 解压缩包

$ cd Python-3.6.2 # 进入解压目录

sudo ./configure --prefix=/usr/local/python3# 指定创建的目录

sudo make

sudo make install# 编译安装

执行./configure时可能会报错,configure: error: no acceptable C compiler found in $PATH,这是因为未安装合适的编译器,安装下就好了,

sudo yum install gcc-c++ (使用sudo yum install gcc-c++时会自动安装/升级gcc及其他依赖的包。)

编译时报错 ModuleNotFoundError: No module named '_ctypes',3.7版本需要一个新的包libffi-devel,安装此包之后再次进行编译安装即可

解决方法:sudo yum -y install libffi-devel

重新编译安装即可

若在安装前移除了/usr/bin下python的文件链接依赖,此时yum无法正常使用,需要自己下载相关软件包安装,为节省读者时间,放上链接

#wget http://mirror.centos.org/centos/7/os/x86_64/Packages/libffi-devel-3.0.13-18.el7.x86_64.rpm

#rpm -ivh libffi-devel-3.0.13-18.el7.x86_64.rpm

安装完成后重新进行make install,结束后再次配置相关文件的软连接即可

配置两个版本共存

创建 python3 的软链接:

$ sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python3

这样就可以通过 python 命令使用 Python 2, python3 来使用 Python 3。

3.安装 pip

$ sudoyum -y installepel-release # 首先安装 epel 扩展源

$ sudoyum -y installpython-pip # 安装 python-pip

$ sudoyum clean all # 清除 cache

通过这种方式貌似只能安装 pip2,想要安装 Python 3 的 pip,可以通过以下的源代码安装方式。

# 下载源代码

$ wget --no-check-certificate https://github.com/pypa/pip/archive/9.0.1.tar.gz

$ tar -zvxf 9.0.1.tar.gz  # 解压文件

$ cd pip-9.0.1

$ python3 setup.py install# 使用 Python 3 安装

创建链接:

$ sudo ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

升级 pip

$ pip install--upgrade pip

4. 安装 gunicorn

Gunicorn (独角兽)是一个高效的Python WSGI Server,通常用它来运行 wsgi application(由我们自己编写遵循WSGI application的编写规范) 或者 wsgi framework(如Django,Paster),地位相当于Java中的Tomcat。 WSGI就是这样的一个协议:它是一个Python程序和用户请求之间的接口。WSGI服务器的作用就是接受并分析用户的请求,调用相应的python对象完成对请求的处理,然后返回相应的结果。 简单来说gunicorn封装了HTTP的底层实现,我们通过gunicorn启动服务,用户请求与服务相应都经过gunicorn传输

创建虚拟环境

cd /home/www/blog(到项目目录下)

mkdir venv

python3 -m venv venv

激活虚拟环境:

source venv/bin/activate

然后根据 requirements.txt 文件安装依赖包:

pip3 install -r requirements.txt

安装gunicorn:

pip3 install gunicorn

在项目根目录创建一个wsgi.py文件拷贝入项目测试环境manage.py中的启动代码,不再通过manage.py启动服务,那只在开发的时候使用

启动服务:

gunicorn -w 4 -b 127.0.0.1:8000 wsgi:app(项目目录名)

5. 安装 Nginx

nginx 是一个高性能的web服务器。通常用来在前端做反向代理服务器。所谓正向与反向(reverse),只是英文说法翻译。代理服务,简而言之,一个请求经过代理服务器从局域网发出,然后到达互联网上服务器,这个过程的代理为正向代理。如果一个请求,从互联网过来,先进入代理服务器,再由代理服务器转发给局域网的目标服务器,这个时候,代理服务器为反向代理(相对正向而言)。

正向代理:{ 客户端 ---》 代理服务器 } ---》 服务器

反向代理:客户端 ---》 { 代理服务器 ---》 服务器 }

{} 表示局域网

nginx既可以做正向,也可以做反向。

$ yum -y install nginx

启动 nginx 服务

$ service nginx start

停止 nginx 服务

$ service nginx stop

重启 nginx 服务

$ service nginx restart

平滑重启

nginx配置改动了,可以重新加载而不用先关闭再打开

$ nginx -s reload

启动后 ,在浏览器中 输入服务器的 ip 地址,就可以看到nginx欢迎页,到这里 yum 安装 nginx 就完成了。

添加配置

nginx的配置文件为: /data/web/nginx/conf/nginx.conf(默认:/etc/nginx/nginx.conf)

server {

    listen 80;

    server_name adisonhyh.com;

    location / {

        proxy_pass http://127.0.0.1:8000;

        proxy_set_header Host $host;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

}

监听http默认的端口号80

server_name:个人网站域名

把请求代理到本机的8000端口(gunicorn启动服务指定的端口) 剩下proxy_set_header照抄

重启nginx服务器:/data/web/nginx/sbin/nginx -s reload

gunicorn和nginx关系:

gunicorn 可以单独提供服务,但生产环境一般不这样做。首先静态资源(jscssimg)会占用不少的请求资源,而对于 gunicorn 来讲它本身更应该关注实际业务的请求与处理而不应该把资源浪费在静态资源请求上;此外,单独运行 gunicorn 是没有办法起多个进程多个端口来负载均衡的。

nginx 的作用就是弥补以上问题,首先作为前端服务器它可以处理一切静态文件请求,此时 gunicorn 作为后端服务器,nginx 将会把动态请求转发给后端服务器,因此我们可以起多个 gunicorn 进程,然后让 nginx 作均衡负载转发请求给多个 gunicorn 进程从而提升服务器处理效率与处理能力。最后,nginx 还可以配置很多安全相关、认证相关等很多处理,可以让你的网站更专注业务的编写,把一些转发规则等其它业务无关的事情交给 nginx 做。

配置好后打开本地浏览器,输入域名,应该就能访问了。

gunicorn进程控制

启动Gunicorn之后,会发现gunicorn启动的web服务,无论怎么使用kill -9 进程号都是无法杀死gunicorn,因为是预先fork,只要一个进程死掉就会重新拉起另一个进程,这时候就需要找到父进程,发送kill信号。

1、获取进程树

pstree -ap|grep gunicorn

2、重启进程

kill -HUP 8326(子进程PID)

#重启之后可以看到父进程PID是不变的,子进程会生成新的PID

3、关闭进程

kill -9 8137(父进程PID)

6.supervisor

如果你需要进程一直执行,若该进程因各种原因中断,也会自动重启的话,supervisor是一个很好的选择。 supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中就好了。此时被管理进程被视为supervisor的子进程,若该子进程异常终端,则父进程可以准确的获取子进程异常终端的信息,通过在配置文件中设置autostart=true,可以实现对异常中断的子进程的自动重启。

安装 supervisor

$ pip install supervisor

$ echo_supervisord_conf > supervisor.conf  # 生成 supervisor 默认配置文件

$ vim supervisor.conf            # 修改 supervisor 配置文件,添加 gunicorn 进程管理

在项目目录 supervisor.conf 配置文件底部添加 (注意我的工作路径是 www/home/blog/ )

[program:blog]

command=/home/www/blog/venv/bin/gunicorn -w4 -b0.0.0.0:8000 wsgi:application  ;supervisor启动命令

directory=/home/www/blog                         ; 项目的文件夹路径

startsecs=0                                ; 启动时间

stopwaitsecs=0                              ; 终止等待时间

autostart=false                              ; 是否自动启动

autorestart=false                             ; 是否自动重启

stdout_logfile=/home/www/blog/logs/gunicorn.log              ; log 日志

stderr_logfile=/home/www/blog/logs/gunicorn.err              ; 错误日志

使用 supervsior 启动 gunicorn

$ sudosupervisord -c supervisor.conf

$ sudosupervisorctl start blog

在浏览器地址栏输入配置的地址即可访问网站。

7. fabric

我们使用fabric实现远程操作和部署。Fabric 是一个 Python 下类似于 Makefiles 的工具,但是能够在远程服务器上执行命令。

安装 fabric

pip install fabric

在项目目录下新建一个fabfile.py文件

importos

fromfabric.api importlocal, env, run, cd, sudo, prefix, settings, execute, task, put

fromfabric.contrib.files importexists

fromcontextlib importcontextmanager


env.hosts =['204.152.201.69']

env.user ='root'

env.password ='****'#密码

env.group ="root"


DEPLOY_DIR ='/home/www/blog'

VENV_DIR =os.path.join(DEPLOY_DIR, 'venv')

VENV_PATH =os.path.join(VENV_DIR, 'bin/activate')


@contextmanager

defsource_virtualenv():

  with prefix("source {}".format(VENV_PATH)):

    yield


defupdate():

  with cd('/home/www/blog/'):

    sudo('git pull')


defrestart():

  with cd(DEPLOY_DIR):

    ifnotexists(VENV_DIR):

      run("virtualenv {}".format(VENV_DIR))

    with settings(warn_only=True):

      with source_virtualenv():

        run("pip install -r {}/requirements.txt".format(DEPLOY_DIR))

        with settings(warn_only=True):

          stop_result =sudo("supervisorctl -c {}/supervisor.conf stop all".format(DEPLOY_DIR))

          ifnotstop_result.failed:

            kill_result =sudo("pkill supervisor")

            ifnotkill_result:

              sudo("supervisord -c {}/supervisor.conf".format(DEPLOY_DIR))

              sudo("supervisorctl -c {}/supervisor.conf reload".format(DEPLOY_DIR))

              sudo("supervisorctl -c {}/supervisor.conf status".format(DEPLOY_DIR))

              sudo("supervisorctl -c {}/supervisor.conf start all".format(DEPLOY_DIR))


@task

defdeploy():

  execute(update)

  execute(restart)

现在代码如果更新了,可以直接在本地执行远程部署了

fab deploy

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容