最近在做毕业设计的时候搞了一下,记录一下。
环境 在使用 app run
去跑 flask 项目的时候,会出现这么一句话:
WARNING: This is a development server. Do not use it in a production deployment.
大概意思就是,不要用这种方式部署到生产环境中,之前我倒是直接就是这么部署的,但是明显会感觉部分操作会发生卡顿,因此这里顺着网上大部分的方法去解决一下这个问题。
代理 请移步正向代理和反向代理
Nginx windows配置 我之前一直以为Nginx只是一个Web框架,但是它可以作反向代理使用,并且可以用于负载均衡,下面介绍配置方法。
windows 系统我是使用 phpstudy 然后在 Nginx 安装目录下的 conf 目录下可以找到一个 nginx 的配置文件,默认如下:
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 #user nobody; worker_processes 4; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 40960; } 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; # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} map $time_iso8601 $logdate { '~^(?<ymd>\\d{4}-\\d{2}-\\d{2})' $ymd; default 'date-not-found'; } include vhosts/*.conf; # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} client_max_body_size 50m; client_body_buffer_size 60k; client_body_timeout 60; client_header_buffer_size 64k; client_header_timeout 60; error_page 400 /error/400.html; error_page 403 /error/403.html; error_page 404 /error/404.html; error_page 500 /error/500.html; error_page 501 /error/501.html; error_page 502 /error/502.html; error_page 503 /error/503.html; error_page 504 /error/504.html; error_page 505 /error/505.html; error_page 506 /error/506.html; error_page 507 /error/507.html; error_page 509 /error/509.html; error_page 510 /error/510.html; keepalive_requests 100; large_client_header_buffers 4 64k; reset_timedout_connection on; send_timeout 60; sendfile_max_chunk 512k; server_names_hash_bucket_size 256; } error_log D:/phpstudy_pro/WWW crit; worker_rlimit_nofile 100000;
#
表示注释,那一行就不算了,但是我们可以看到默认第一行被注释了,大概是因为 windows 并没有很严格的权限,通常就是当前用户的权限运行的 Nginx,而在 Linux 系统中,通常只有 root 用户有权限修改这个文件,并且所有服务最终都是 root 去开启的,如果我们不在这里指定用户,那么 web 权限就是 root,因此 Linux 安装目录下,第一行通常就是 user www-data
。
events 类里面规定了一个 connections
数量,应该是同时连接的最大数量。
http 类里面就规定了一些http的默认请求,比如 404 页面应该显示啥之类的,如果不指定应该是会用默认的,就是我们所看到的,最上面一行字加上最下面的 nginx 版本号。
在这个目录下,还有一个目录叫 vhosts
,里面是我们可以配置反向代理的配置文件。
为了作好负载均衡,我们可以让静态目录的资源都让Nginx去处理,动态请求转发给 flask 即可,下面是我在 windows 下面的配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 server { listen 80; server_name localhost; root "D:/phpstudy_pro/WWW"; location ~ ^\/static\/.*$ { root C:\Users\xia0ji233\Desktop\Home\python\毕业设计; } location / { #flask监听的位置(不对外) proxy_pass http://127.0.0.1:5000; #这里也很重要,把请求的原始信息暴露给藏在后面的flask,避免其没有办法获取用户真正的ip地址 proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
第一个 location,我们匹配 http 请求行 /static/
,匹配到了直接转发我们指定目录下的文件。
其它我们一律转发给 flask,用 proxy_pass 去设置代理即可。
Linux配置 方法其实都差不多,下面给出我在Linux下面的配置,这里Linux下面的 Nginx 配置文件在的目录是 /etc/nginx/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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 user app; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL Settings ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } #mail { # # See sample authentication script at: # # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript # # # auth_http localhost/auth.php; # # pop3_capabilities "TOP" "USER"; # # imap_capabilities "IMAP4rev1" "UIDPLUS"; # # server { # listen localhost:110; # protocol pop3; # proxy on; # } # # server { # listen localhost:143; # protocol imap; # proxy on; # } #}
而其它的配置文件在 /etc/nginx/conf.d/*.conf
,这个名字可以随便命名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 server { listen 9999; root /app; server_name localhost; location ~ ^\/static\/.*$ { root /app; } location / { proxy_pass http://127.0.0.1:5000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
这里对外暴露 9999 端口,反向代理本地 5000 端口。