当前位置: 首页 > 编程日记 > 正文

CentOS 部署 flask项目

原文地址

最近在学习 python,使用 flask 实现了个个人博客程序,完了想部署到服务器上。因为是新手,一路磕磕绊绊最终把它基本搞定。网上资料对新手感觉都不太友好,都是零零碎碎的,所以我整理了一下,一方面作为我自己的记录,方便以后查阅,另一方面也希望能帮助到跟我一样的新手。

前提

  1. 有一个服务器(不然搞毛),购买可以参考优质国外vps推荐

  2. 有个人域名(当然,你可以直接使用 IP访问,但有点奇怪不是?购买域名可以去GoDaddy

1.安装git

可以选择 github 或者Bitbucket,当然你也可以自己搭建 git服务器,但我觉得没啥必要,我选择Bitbucket,主要是因为它私有库免费

sudo yum install git
复制代码

后续就跟我们本地开发没什么区别了,配置 ssh key,clone代码,就不展开了,项目目录建议放在 /home/www/

2. 安装 Mysql

添加 MySQL YUM 源

$wget 'https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm'
$sudo rpm -Uvh mysql57-community-release-el7-11.noarch.rpm
$yum repolist all | grep mysqlmysql-connectors-community/x86_64 MySQL Connectors Community                  36
mysql-tools-community/x86_64      MySQL Tools Community                       47
mysql57-community/x86_64          MySQL 5.7 Community Server                 187复制代码

安装最新版本

$sudo yum install mysql-community-server
复制代码

启动 MySQL 服务

$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> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
复制代码

修改编码

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

[client]default-character-set = utf8[mysqld]default-storage-engine = INNODBcharacter-set-server = utf8collation-server = utf8_general_ci #不区分大小写collation-server = utf8_bin #区分大小写collation-server = utf8_unicode_ci #比 utf8_general_ci 更准确复制代码

创建数据库

mysql> CREATE DATABASE <datebasename> CHARACTER SET utf8;
复制代码

3. 安装python3 pip3

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及其他依赖的包。)

配置两个版本共存

创建 python3 的软链接:

$ sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python3
复制代码

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

安装 pip

$ sudo yum -y install epel-release # 首先安装 epel 扩展源
$ sudo yum -y install python-pip # 安装 python-pip
$ sudo yum 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/pip /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文件

from app import create_appapplication = create_app('production')if __name__ == '__main__':application.run()
复制代码

不再通过manage.py启动服务,那只在开发的时候使用

启动服务:

gunicorn -w 4 -b 127.0.0.1:8000 wsgi:application
复制代码

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 地址,就可以看到

到这里 yum 安装 nginx 就完成了

添加配置

nginx的配置文件为:/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照抄

gunicorn和nginx关系:

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

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

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

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 进程管理
复制代码

在blog 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

$ sudo supervisord -c supervisor.conf  
$ sudo supervisorctl start blog
复制代码

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

7. fabric

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

安装 fabric

pip install fabric
复制代码

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

import os
from fabric.api import local, env, run, cd, sudo, prefix, settings, execute, task, put
from fabric.contrib.files import exists
from contextlib import contextmanagerenv.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
def source_virtualenv():with prefix("source {}".format(VENV_PATH)):yielddef update():with cd('/home/www/blog/'):sudo('git pull')def restart():with cd(DEPLOY_DIR):if not exists(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))if not stop_result.failed:kill_result = sudo("pkill supervisor")if not kill_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
def deploy():execute(update)execute(restart)复制代码

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

fab deploy
复制代码

相关文章:

Linux系统JDK安装和配置

以下步骤均为root登录状态下进行执行。 一、卸载JDK Linux会自带JDK&#xff0c;如果不使用自带版本的话需要卸载。 1、卸载系统自带的jdk版本 查看自带的jdk #rpm -qa | grep gcj 看到如下信息&#xff1a; libgcj-4.1.2-44.el5 java-1.4.2-gcj-compat-1.4.2.0-40jpp.1…

4000字,详解 Python 操作 MySQL 数据库!

作者 | 黄伟呢出品 | 数据分析与统计学之美本文的重点&#xff0c;就是教会大家&#xff0c;如何用Python来操作MySQL数据库。1. 通用步骤其实&#xff0c;这里有一个通用步骤&#xff0c;都是写死了的&#xff0c;大家照做就行。# 1. 导入相关库 import pymysql# 2. 链接MySQL…

php跨域共享session

、 $gb_DBHOSTname "127.0.0.1"; //主机的名称或是IP地址 02 $gb_DBname "dbname"; //数据库名称 03 $gb_DBuser "username"; //数据库用户名称 04 $gb_DBpass "pwd"; //数据库密码 05 $gb_COOKIE_DOMAIN .a.com; 06 $SESS_DBH …

centos6 防火墙iptables操作整理

使用语句 前言: iptables的启动文件位置再: /etc/init.d/iptables , srevice iptables调用的就是这里的执行文件 查看防火墙状态 service iptables status开启防火墙 service iptables start 关闭防火墙 service iptables stop永久关闭防火墙(开机不启动) chkconfig i…

分布式计算开源框架Hadoop入门实践

在SIP项目设计的过程中&#xff0c;对于它庞大的日志在开始时就考虑使用任务分解的多线程处理模式来分析统计&#xff0c;在我从前写的文章《Tiger Concurrent Practice --日志分析并行分解设计与实现》中有所提到。但是由于统计的内容暂时还是十分简单&#xff0c;所以就采用M…

网络配置文件、命令详解

一、网络服务、配置文件二、ifconfig常用命令三、route常用命令四、ip命常用命令五、其他一、网络服务、配置文件修改网络服务配置文件不会立即生效&#xff0c;重启网络服务或主机后生效且永久有效1、配置文件1.1、网络配置文件&#xff1a;/etc/sysconfig/network[rootTESTHO…

面了一个大佬,一看就背了很多面试题

2021都说工作不好找&#xff0c;其实也是对开发人员的要求变高了。正好前段时间自己有整理了一些Java后端开发面试常问的高频考点问题做成一份PDF文档&#xff08;1000道高频题&#xff09;&#xff0c;同时也整理一些图文解析及笔记。今天在这免费分享给大家&#xff0c;希望大…

swift的特点

swift与OC的区别&#xff1a; swift是一门强语言&#xff0c;而OC是一门弱语言。强语言比弱语言更加严谨 每写一行代码系统都会自动检测是否有错误&#xff0c;这样就减少了运行后出错的可能。swift支持开源&#xff0c;所以可以引用到其他语言开发的项目中&#xff0c;OC是闭源…

Apache模块开发helloworld无错版

环境&#xff1a;CentOS 5.4 第一步&#xff1a;安装Apache的apxs 首先来介绍下apache的一个工具apxs。apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具&#xff0c;用于编译一个或多个源程序或目标代码文件为动态共享对象&#xff0c;使之可以用由mod_so提供的LoadM…

Golang+Python 实现安全动态开机密码+服务器存储

作者 | 李秋键 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 引言&#xff1a; 如果谈到近几年来新起的语言&#xff0c;必然离不开Python语言和Go语言&#xff0c;正如python在人工智能领域的发展火热&#xff0c;Go语言在服务器并发处理也有着非常优势。 Go语言…

《中国顶尖技术团队访谈录·第二季》发布

卷首语&#xff08;InfoQ中国总编辑 崔康&#xff09;\\在提笔写这篇卷首语的时候&#xff0c;我们刚刚为InfoQ中国过完八岁生日。回溯到2007年的3月28日&#xff0c;InfoQ中文站正式上线运营&#xff0c;从此中国的IT技术人有了一个崭新的学习和成长的平台&#xff0c;InfoQ中…

record-09 ATM 过程思想 综合练习

#__author: hasee #date: 2018/1/16 # user_info.txt包含内容&#xff1a; # zhangsan1 123456 3500 # zhangsan2 123456 4000 # zhangsan3 123456 4500 # zhangsan4 123456 5000 # zhangsan5 123456 5500 # zhangsan6 123456 6000 # zhangsan7 123456 6500 # zhangsan8 12345…

在ApacheHTTPD服务器中使用DSO完全分析

Apache HTTP 服务器是一个模块化&#xff08;或说积木式&#xff09;的程序&#xff0c;管理员可以选择一些模块来增加服务器的某些功能。这些模块&#xff0c;可以在创建服务器程序时静态地编译到httpd服务器的二进制代码中&#xff0c;也可以编译成一些独立于服务器程序的Dyn…

apache 2.4.12 + tomcat 7.0.61 + jk connectors 1.2.40实现tomcat负载均衡集群

实验环境&#xff1a; CentOS 5.11 final hostname&#xff1a;T1.getg.com IP地址&#xff1a;192.168.50.138软件准备&#xff1a; CentOS Linux 5.*系统光盘中的“Development tools”工具包组 jdk-8u45-linux-x64.tar.gz pcre-8.36.tar.gz apr-util-1…

有哪些新手程序员不知道的小技巧?

提到新手程序员&#xff0c;大家想到的第一个词可能就是&#xff1a;刷题。尤其是通过LeetCode刷题&#xff0c;想必新手程序员们都经历过这一步&#xff0c;甚至不少人认为只要在LeetCode上刷的题目够多&#xff0c;就一定能够进阶为大神。但是&#xff0c;不难发现&#xff0…

cocostudio UI编辑器中UITextField输入框控件光标

http://www.cocoachina.com/bbs/read.php?tid194533

在apache中使用 memcache 来作 session 存储

session.save_handler memcache session.save_path "tcp://127.0.0.1:11211" 使用多个 memcached server 时用逗号","隔开&#xff0c;并且和 Memcache::addServer() 文档中说明的一样&#xff0c;可以带额外的参数"persistent"、"weigh…

Android WebView访问SSL证书网页(onReceivedSslError)

Android WebView访问https SSL证书网页&#xff0c;如淘宝&#xff0c;需要在onReceivedSslError添加SSL支持 webview.setWebViewClient(new WebViewClient() {Overridepublic void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {// 不要使用su…

改名 Meta,打元宇宙牌,老龄化的 Facebook 能否再换新颜

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 美东时间10月28日周四&#xff0c;在名为 Facebook Connect 的年度大会上&#xff0c;Facebook 宣布&#xff0c;Facebook 将公司名称更改为“Meta”&#xff0c;这个新名字反映了该公司在社交媒体之外…

Android NDK开发之旅31 FFmpeg音频解码

###前言 #####基于Android NDK开发之旅30--FFmpeg视频播放这篇文章&#xff0c;我们已经学会视频解码基本过程。这篇文章就对音频解码进行分析。 #####音频解码和视频解码的套路基本是一样的&#xff0c; 否则怎么会做到音视频同步播放呢&#xff1f; ###1.FFmpeg音视解码过程分…

整理了 65 个 Matplotlib 案例,这能不收藏?

作者|周萝卜来源|萝卜大杂烩Matplotlib 作为 Python 家族当中最为著名的画图工具&#xff0c;基本的操作还是要掌握的&#xff0c;今天就来分享一波文章很长&#xff0c;高低要忍一下&#xff0c;如果忍不了&#xff0c;那就收藏吧&#xff0c;总会用到的。启用和检查交互模式在…

负载均衡工具haproxy安装,配置,使用

一&#xff0c;什么是haproxy HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代 理&#xff0c;支持虚拟主机&#xff0c;它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点&#xff0c;这些站点通常又需要会话保持或七层处理。HAProxy运…

【文章】本站收集与转载文章目录

1.关于推荐系统中的特征工程 2.Java程序员最喜欢的11款免费IDE编辑器 3.人工智能和机器学习领域的一些有趣的开源项目 4.微软发布Project Oxford&#xff0c;供Azure户免费集多项功能 5.微软推Azure机器学习工具&#xff1a;Algorithm Cheat Sheet

L09-10老男孩Linux运维实战培训-Nginx服务生产实战应用指南05(架构解决方案)

nginx的多实例设置首先说一下nginx后面加的参数的说明 -s 后面加reload 就是重新加载的意思和apache的graceful同样的效果 -v 小写的v显示版本号后退出 -V大写的V显示nginx的版本号和配置环境 -t 就是test的意思&#xff0c;检查配置文件是否正确 -c 后面配置文件的地址&#x…

linux中的apachectl是什么命令

apachectl是Apache HTTP服务器的前端程序。其设计意图是帮助管理员控制Apache httpd后台守护进程的功能。apachectl脚本有两种操作模式。首先&#xff0c;作为简单的httpd的前端程序&#xff0c;设置所有必要的环境变量&#xff0c;然后启动httpd &#xff0c;并传递所有的命令…

数据库性能优化1——正确建立索引以及最左前缀原则

1. 索引建立的原则用于索引的最好的备选数据列是那些出现在WHERE子句、join子句、ORDER BY或GROUP BY子句中的列。仅仅出现在SELECT关键字后面的输出数据列列表中的数据列不是很好的备选列SELECTcol_a <- 不是备选列FROMtbl1 LEFT JOIN tbl2ON tbl1.col_b tbl2.col_c <-…

深度学习发展下的“摩尔困境”,人工智能又将如何破局?

前不久&#xff0c;微软和英伟达推出包含5300亿参数的语言模型MT-NLG&#xff0c;这是一款基于 Transformer 的模型被誉为“世界上最大、最强的生成语言模型”。 毫无疑问&#xff0c;这是一场令人印象深刻的机器学习工程展示。 然而&#xff0c;我们是否应该对这种大型模型趋势…

Kotlin学习笔记-基础语法

去年学习过一遍Kotlin&#xff0c;相比java而言&#xff0c;Kotlin确实有许多方便的地方&#xff0c;但是学习之后一直没有真正拿来写项目&#xff0c;很久不用很多东西都已经忘记了。最近Google宣布Kotlin成为Android开发的官方语言之后&#xff0c;Kotlin突然变得火热起来&am…

英特尔王锐:软硬件并驾齐驱,开发者是真英雄

北京时间10月28日&#xff0c;英特尔On技术创新峰会在北京举办。在此次峰会上&#xff0c;英特尔公司高级副总裁、英特尔中国区董事长王锐对外宣告了英特尔拥抱开发者&#xff0c;回归技术创新的决心和信心。 英特尔此前提出&#xff0c;四大超级技术力量赋能数字化的变革&…

基于html5海贼王单页视差滚动特效

分享一款基于html5海贼王单页视差滚动特效是一款流行滑落网页特效代码。效果图如下&#xff1a; 在线预览 源码下载 实现的代码&#xff1a; <div class"top"><div class"top_main center"><ul id"scene" class"scene&quo…