Linux中 Nginx+uwsgi部署flask项目 Nginx负载均衡 反向代理

Nginx是一款自由的、开源的、高性能HTTP服务器和反向代理服务器。

  1. 轻量级,同样起web服务,比 apache占用更少的内存及资源
  2. 抗并发, nginx处理请求是异步非阻塞的,而 apache则是阻塞型的,在高并发下 nginx能保持低资源低消耗高性能;官方測试能够支撑5万并发连接,实际生产环境中能跑到2-3万并发连接
  3. 配置文件非常简单,风格和程序一样進俗易懂
  4. 提供负载均衡、反向代理,支持 rewrite,支持gzip压缩
  5. 稳定性高,宕机概率微乎其微
  6. 开源,可免费使用

安装Nginx

来源于

https://www.cnblogs.com/taiyonghai/p/6728707.html

  1. 下载相关组件
[root@localhost src]# wget http://nginx.org/download/nginx-1.10.2.tar.gz
省略安装内容...
[root@localhost src]# wget http://www.openssl.org/source/openssl-fips-2.0.10.tar.gz
省略安装内容...
[root@localhost src]# wget http://zlib.net/zlib-1.2.11.tar.gz
省略安装内容...
[root@localhost src]# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz
省略安装内容...
  1. 安装Nginx及相关组件
openssl安装

[root@localhost src]# tar zxvf openssl-fips-2.0.10.tar.gz
省略安装内容...
[root@localhost src]# cd openssl-fips-2.0.10
[root@localhost openssl-fips-2.0.10]# ./config && make && make install
省略安装内容...

pcre安装

[root@localhost src]# tar zxvf pcre-8.40.tar.gz
省略安装内容...
[root@localhost src]# cd pcre-8.40
[root@localhost pcre-8.40]# ./configure && make && make install
省略安装内容...

zlib安装

[root@localhost src]# tar zxvf zlib-1.2.11.tar.gz
省略安装内容...
[root@localhost src]# cd zlib-1.2.11
[root@localhost zlib-1.2.11]# ./configure && make && make install
省略安装内容...

nginx安装

[root@localhost src]# tar zxvf nginx-1.10.2.tar.gz
省略安装内容...
[root@localhost src]# cd nginx-1.10.2
[root@localhost nginx-1.10.2]# ./configure && make && make install
省略安装内容...
  1. Nginx基本操作
启动
[root@localhost ~]# /usr/local/nginx/sbin/nginx
停止/重启
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop(quit、reload)
命令帮助
[root@localhost ~]# /usr/local/nginx/sbin/nginx -h
验证配置文件
[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
配置文件
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
 启动nginx  使用`ps -ef | grep nginx`查看nginx进程是否启动
 启动成功 访问本地127.0.0.1  会出现Nginx的欢迎界面

uwsgi安装

通过pip安装

pip install uwsgi

uwsgi配置文件
在我们的项目目录中创建一个uwsgi.ini配置文件
我的配置文件如下

[uwsgi]
uid=root  #使用权限
pid=root
socket = 127.0.0.1:8008  #地址和端口号
http=0.0.0.0:8000   #http监听
harakiri = 300   #超时设置
pidfile=/opt/CowRestAPI/uwsgi.pid    #指定pid文件的位置,记录主进程的pid号
vacuum=true   #当服务器退出的时候自动清理环境,删除unix socket文件和pid文件
limit-post= 67108864  #限制HTTP请求体的大小
chair=/opt/CowRestAPI  #项目的目录
thunder-lock = true    #序列化接受的内容
master = true    #主进程
wsgi-file = /opt/CowRestAPI/api.py   #载入wsgi-file
callable = app  #callable指出的是具体执行.run方法的那个实体的名字,一般而言都是app=Flask(__name__)的,所以这里是app
processes = 1 #进程数量
threads = 4  #线程数量
daemonize = /opt/CowRestAPI/uwsgiserver.log   #使用进程在后台运行,并打印日志
touch-reload = /opt/CowRestAPI/api.py   #flask的启动文件
stats = 0.0.0.0:8080   #指定的地址开启状态服务
buffer-size = 32768     #设置用于uwsgi包解析的内部缓存区大小。默认是4k
在不使用Nginx的情况下 
需要配置http=0.0.0.0:8000 (本地)
或者输入自己的公网IP加端口
在自己的项目目录下 
使用`uwsgi uwsgi.ini`启动项目
然后访问自己的 ip + 端口 可以正常访问自己的项目
使用uwsgi+Nginx的情况下
需要配置socket不能使用http

Nginx的配置文件

在自己下载的nginx文件中会有一个nginx.conf
我的nginx配置文件如下
部分也有注释说明可以参考
nginx.conf

user root;   #使用指定用户
#user  nobody;
worker_processes  auto;   #使用的worker进程数

#error_log  logs/error.log;  #错误日志问价
#error_log  logs/error.log  notice;  #日志级别
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;   #存放进程pid

events {
    worker_connections  1024;  #每个worker最大连接数默认1024
}

http {
    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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    fastcgi_buffers 8 128k;
    send_timeout 60;
    
    server {
        listen  80;     #监听的端口 可以添加多个 listen   81
        #listen   81;
        server_name 47.93.37.167;    #自己的公网ip  本地直接localhost        Nginx可以监听多个域名
        client_max_body_size 10m;    #最大的报文,默认1m
        rewrite /baidu/(.*) https://baidu.com;    #重定向 访问/baidu/...就会跳转指定的url页面
        location / {
                include uwsgi_params;    #说明与uwsgi进行连接
                uwsgi_param UWSGI_CHDIR  /opt/CowRestAPI;  #项目目录
                uwsgi_param UWSGI_SCRIPT api:app;  #api为flask项目启动文件,app是run方法的那个实体的名字,一般而言都是app=Flask(__name__)的
                uwsgi_pass 127.0.0.1:8008; #此处的ip和端口需要和uwsgi配置文件中的socket一样,才能建立连接
                }
        location - /\secret\/(.*)$ {
        	  return 403;         #访问secret 返回403 隐藏
        }   
        }
}

如果访问出现nginx 504 Gateway Time-out的错误
一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致504 Gateway Time-out
  现在的网站, 尤其某些论坛有大量的回复和很多内容的, 一个页面甚至有几百K
  默认的fastcgi进程响应的缓冲区是8K, 我们可以设置大点
  在nginx.conf里, 加入:
  fastcgi_buffers 8 128k
  这表示设置fastcgi缓冲区为8×128k
  当然如果您在进行某一项即时的操作, 可能需要nginx的超时参数调大点, 例如设置成60秒:
  send_timeout 60;
  我只是调整了这两个参数, 结果就是没有再显示那个超时, 可以说效果不错
  如果还有此类问题可以参考以下链接

https://www.cnblogs.com/xiamidong/p/4105583.html

nginx的location配置详解

语法规则: location [=|~|~*|^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配
~*  开头表示不区分大小写的正则匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

https://www.cnblogs.com/sign-ptk/p/6723048.html

反向代理

http {
    include       mime.types;
    default_type  application/octet-stream;
    
    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    fastcgi_buffers 8 128k;
    send_timeout 60;
    
    server {
        listen  80;     #监听的端口 可以添加多个 listen   81
        #listen   81;
        server_name localhost; 
        
        location / {
                proxy_pass http://192.168.1.101:9000;  #反向代理
                #以下是一些反向代理的配置可删除
		        proxy_redirect             off; 
		        #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
		        proxy_set_header           Host $host; 
		        proxy_set_header           X-Real-IP $remote_addr; 
		        proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for; 
		        client_max_body_size       10m; #允许客户端请求的最大单文件字节数
		        client_body_buffer_size    128k; #缓冲区代理缓冲用户端请求的最大字节数
		        proxy_connect_timeout      300; #nginx跟后端服务器连接超时时间(代理连接超时)
		        proxy_send_timeout         300; #后端服务器数据回传时间(代理发送超时)
		        proxy_read_timeout         300; #连接成功后,后端服务器响应时间(代理接收超时)
		        proxy_buffer_size          4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
		        proxy_buffers              4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
		        proxy_busy_buffers_size    64k; #高负荷下缓冲大小(proxy_buffers*2)
		        proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
                }
        }
}

Nginx负载均衡 反向代理

Nginx.conf 其中的设置

http {
    include       mime.types;
    default_type  application/octet-stream;
    
    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    fastcgi_buffers 8 128k;
    send_timeout 60;
    
    upstream nginx_test {
    	   #ip_hash      #只访问到了一台  保持session的一致性  
	 	   server 192.168.1.101:9000 weight=1 max_fails=5 fail_timeout=20s;     
	 	   #设置健康检查和超时时间  加上down 暂时不参与负载
	 	   server 192.168.1.102:9000 weight=3;  #两台服务ip weight代表比重 越大访问次数越多
     }
    
    server {
        listen  80;     #监听的端口 可以添加多个 listen   81
        #listen   81;
        server_name localhost; 
        rewrite /baidu/(.*) https://baidu.com;    #重定向 访问/baidu/...就会跳转指定的url页面
        location / {
                proxy_pass http://nginx_test;
                }
        }
}

猜你喜欢

转载自blog.csdn.net/weixin_42784553/article/details/86226504