Flask+Nginx+Gunicorn+Redis+Mysql搭建一个小站

2024-02-24 04:58

本文主要是介绍Flask+Nginx+Gunicorn+Redis+Mysql搭建一个小站,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先简单介绍一下这几个东东。
Flask是一个轻量级的Web应用框架, 基于Werkzeug和 Jinja2 模板引擎,使用 Python编写,可扩展强。
Nginx是一个高性能的 HTTP 和 反向代理服务器,在高并发方面表现非常不错。
Gunicorn 是一个Python WSGI UNIX的HTTP服务器,从Ruby的独角兽(Unicorn )项目移植,能与很多Web框架兼容,只需非常简单的执行,轻量级的资源消耗,以及相当迅速。
Redis是一个高性能的key-value存储系统,支持集合、列表、字典等复杂的数据结构,数据既可以保存在内存中也可以持久化到硬盘,对关系数据库起到很好的补充。

前段时间做了个小站,目前已上线,使用到了这几个东东。算起来学习python后台开发有4个月了,但是水平还是菜鸟级别,所以本文也就简单讲讲配置问题以及该项目的架构,如有错误,请各位看官指正。由于是小站,目前访问人数也不是特别多,每天几十万IP,所以现在就一台服务器。前端使用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了。

建立用户及用户组

?
1
2
sudo /usr/sbin/groupadd zjh 
sudo /usr/sbin/useradd -g zjh zjh

配置nginx.conf,一般位于/usr/local/nginx/conf/目录下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#运行用户组和用户
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,内容如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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

?
1
sudo easy_install gunicorn

编写配置文件gunicorn.conf
workers = 4
bind = ‘192.168.60.146:8888′
proc_name = ‘app’
pidfile = ‘/tmp/app.pid’

执行:

?
1
gunicorn --config gunicorn.conf app:app

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

?
1
ps -ef |  grep app

来查看有多少app进程。
下面是一个最简单的flask应用demo:app.py,因为使用gunicorn来运行,所以就没有调用run方法。关于Flask的快速入门可以参考这一篇:http://codingnow.cn/python/409.html

?
1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
#coding=utf-8
import sys
reload (sys)
sys.setdefaultencoding( 'utf-8' )
from flask  import Flask
app  = Flask(__name__)
来自: http://codingnow.cn/server/539.html

这篇关于Flask+Nginx+Gunicorn+Redis+Mysql搭建一个小站的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/741009

相关文章

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析