设为首页 收藏本站
查看: 940|回复: 0

[经验分享] Flask+Nginx+Gunicorn+Redis+Mysql搭建一个小站

[复制链接]

尚未签到

发表于 2016-10-19 10:14:24 | 显示全部楼层 |阅读模式

首先简单介绍一下这几个东东。


Flask是一个轻量级的Web应用框架, 基于Werkzeug和 Jinja2模板引擎,使用Python编写,可扩展强。

Nginx是一个高性能的 HTTP 和反向代理服务器,在高并发方面表现非常不错。

Gunicorn 是一个Python WSGI UNIX的HTTP服务器,从Ruby的独角兽(Unicorn )项目移植,能与很多Web框架兼容,只需非常简单的执行,轻量级的资源消耗,以及相当迅速。

Redis是一个高性能的key-value存储系统,支持集合、列表、字典等复杂的数据结构,数据既可以保存在内存中也可以持久化到硬盘,对关系数据库起到很好的补充。


前段时间做了个图片类网站,目前已上线,使用到了这几个东东。算起来学习python后台开发有4个月了,但是水平还是菜鸟级别,所以本文也就简单讲讲配置问题以及该项目的架构,如有错误,请各位看官指正。由于是小站,目前访问人数也不是特别多,现在就一台服务器。前端使用nginx做反向代理和动静分离(把css、js、image、html等静态文件直接通过nginx转发,不通过后端处理),后端使用gunicorn+flask的方式,刚开始就直接使用flask跑,但是有一次就出现502了,发现由于flask是单进程处理请求的,不像Tornado的异步,同时访问的人数稍微过多,就会出现阻塞的情况,导致nginx出现502的问题。gunicorn可以指定多个工作进程,底层实现应该是通过调用fork函数创建子进程,这样就可以很好的利用服务器多核的特性了,实现并发功能。进程数应该指定多少呢,可以参考gunicorn官网上的一个例子:workers
= multiprocessing.cpu_count() * 2 + 1。为了减少服务端的压力,对访问比较多的页面做了静态化处理,然后把访问和变化都比较频繁的数据使用redis做缓存处理,关系数据库使用的是mysql,网站的图片使用CDN的。


flask和redis的安装就不讲述了,也十分简单,下面主要讲nginx和gunicorn的配置。
1.安装和配置nginx

首先安装pcre,让安装Nginx支持rewrite,这个功能还是挺重要的

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.20.tar.bz2

bzip2 -d pcre-8.20.tar.bz2

tar xvf pcre-8.20.tar

cd pcre-8.20.tar/

./configure

sudo make && sudo make install


安装nginx

wget http://sysoev.ru/nginx/nginx-1.0.0.tar.gz

tar zxvf nginx-1.0.0.tar.gz

cd nginx-1.0.0

./configure

sudo make && sudo make install

启动nginx

sudo /usr/local/nginx/sbin/nginx

关闭nginx

sudo /usr/local/nginx/sbin/nginx -s stop

重启nginx

sudo /usr/local/nginx/sbin/nginx -s reload

或者

sudo kill -HUP `cat /usr/local/nginx/logs/nginx.pid`

( kill -HUP 杀掉某进程 并重新读取配置文档 启动该进程)


测试:打开浏览器,输入ip,如果一切正常将会看到:Welcome to nginx!

可能会出现的问题:

启动nginx时出现

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

解决办法:

ps -ef | grep nginx查看nginx是否已启动

如果已经启动:sudo kill -9 ‘nginx pid’

否则 sudo netstat -nltp查看80端口被哪个应用给占了

然后sudo kill -9 pid


配置nginx

假设我的应用监听的端口是8888,本机ip是192.168.60.146,修改hosts文件,添加:

192.168.60.146 www.app.com

这样你在本机访问www.app.com这个域名的时候,系统就不会提交到DNS域名解析服务器,而是直接访问配置的IP地址192.168.60.146,十分方便,但是hosts是不支持通配符的,像*.app.com,这样就无法设置二级域名了,解决方案可以参考我的这篇文章http://codingnow.cn/unix/431.html。

接下来就要配置当用户访问www.app.com这个域名时,如何能访问到我们的应用呢,此时就需要配置nginx了。


建立用户及用户组


sudo /usr/sbin/groupadd zjh  
sudo /usr/sbin/useradd -g zjh zjh
配置nginx.conf,一般位于/usr/local/nginx/conf/目录下#运行用户组和用户
user zjh zjh;
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志及PID文件
error_log logs/error.log;
pid logs/nginx.pid;
#工作模式及连接数上限
events {
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型,类型由mime.types文件定义
include mime.types;
default_type application/octet-stream;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log off;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
#必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#开启gzip压缩
gzip on;
gzip_min_length 1000;
gzip_proxied any;
gzip_types text/plain text/css text/xml
application/x-javascript application/xml
application/atom+xml text/javascript
#连接超时时间
keepalive_timeout 65;
proxy_read_timeout 200;
proxy_next_upstream error;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
include sites/*.conf;
}

在/usr/local/nginx/conf/目录下创建一个sites目录,里面存放具体应用的配置文件,便于管理。这里创建app.conf,内容如下server {
#侦听80端口
listen 80;
#定义使用www.xx.com访问
server_name www.app.com;
client_max_body_size 10M;
#设定本虚拟主机的访问日志
access_log logs/app.log main;
#默认请求
location / {
#请求转向本机ip:8888
proxy_pass http://192.168.60.146:8888;
proxy_redirect off;
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 ~.*(js|css|png|gif|jpg|mp3|ogg)$ {
root /home/zhoujianghai/temp/data/app/medias/;
}
#配置静态页面转发
location ~.*(html)$ {
root /home/zhoujianghai/temp/data/app/app_static_pages/;
}
}

重启nginx,在浏览器访问:www.app.com 就会访问到你的应用程序了  

2. 安装和配置Gunicorn


sudo easy_install gunicorn

  

编写配置文件gunicorn.conf

workers = 4

bind = ’192.168.60.146:8888′

proc_name = ‘app’

pidfile = ‘/tmp/app.pid’


执行:


gunicorn --config gunicorn.conf app:app

解释一下app:app,前面的app代表当前运行的module名,也就是文件名,后面的app是创建的Flask对象。当然我实际的项目中module名不是app,这里只是作为demo。现在你可以通过ps -ef | grep app

来查看有多少app进程。
下面是一个最简单的flask应用demo:app.py,因为使用gunicorn来运行,所以就没有调用run方法。关于Flask的快速入门可以参考这一篇:http://codingnow.cn/python/409.html#!/usr/bin/env python
#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from flask import Flask
app = Flask(__name__)
  

  转载请注明来自:Alex
Zhou,本文链接:http://codingnow.cn/python/539.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-288341-1-1.html 上篇帖子: 转载--[数据库] MySQL汉字字段按拼音排序 下篇帖子: MySQL数据库中char与varchar性能分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表