pytho3
需要python3。
创建项目的虚拟环境
1 | py -3 -m venv env |
安装flask
1 | pip install flask |
在自己项目的虚拟环境下安装,这样不影响别人的项目
创建一个app.py文件
1 | #!/usr/bin/env python |
运行
1 | python .\app.py |
启动成功
1 | Serving Flask app 'app' |
默认是启动在5000端口

看到有个告警,
说现在使用的这个模式用于开发环境调试,部署线上需要使用WSGI替代。
倒也不影响我们学习。
如果要解决,就修改代码为WSGI模式:
1 | from flask import Flask |
需要安装gevent
1 | pip install gevent |
配置文件结构
1 | ... #全局块 |
可以转化为下面的图

整个conf文件是一个全局块下
配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等
可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
配置虚拟主机的相关参数,一个http块中可以有多个server。
配置请求的路由,以及各种页面的处理情况。一个server块中可以配置多个location块
1 |
|
1 | events { |
1 | http |
1 | server { |
其实listen 也可以配上ip。ip:port的形式。当listen出现了ip时,server_name就失去了意义。我们一般不会这么用。
匹配的请求会转到root指定的路径。
这里root可以用相对路径,也可以是绝对路径。
相对路径是相对ng的安装目录的,最好不要用,就用绝对路径,不容易出错。
1 | location / { |
当一个请求,多个location都可以匹配时,会选择匹配长度最长的那个。
创建对应的数据目录
/data/ng/html目录用来放网页
/data/ng/img目录用来放图片
1 | mkdir -p /data/ng/html /data/ng/img |

注意上面localtion中的写法。root /data/ng;写成/data/ng/也是可以的
我们的请求是/img/xx.jpg
ng会到/data/ng/img下去找xx.jpg。也就是说路径会进行拼接。
如果root写成/data/ng/img,那就找不到了。404

location代理转发时,使用proxy_pass转发到真实的后端服务
把上面的例子改为
1 | location / { |
如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也带上。
1 |
|
更常用的用法是转发到upstream
1 | location /api/ { |
upstream里可以写多个后端服务地址,这才是负载均衡的核心
1 | # 负载均衡配置,定义一个upstream |
1 | #nginx的upstream目前支持4种方式的分配 |
如果把各个域名的配置全部放在一起会很乱。通常我们会每个域名的配置单独作为一个配置文件
新建文件夹(用来存放nginx自定义配置文件)
1 | mkdir -p /usr/local/nginx/conf/conf.d |
在nginx的配置文件(默认/usr/local/nginx/conf/nginx.conf)中加入
1 | include /usr/local/nginx/conf/conf.d/*.conf |
1 | /usr/local/nginx/sbin/nginx -V |

有这个说明已经有了ssl模块。
上传ssl证书
目录随意
配置nginx.conf
1 | server { |

这种会直接下载pdf

这种会直接在浏览器内展示
在linux下一切皆文件。
每建立一个tcp都会打开一个文件句柄,所以高并发的web场景下,如果代码写的有问题,没有及时释放资源,很可能会遇到open files过多的问题。
解决这个问题有两条路
修改最大文件句柄数的麻烦点在于要修改的参数比较多。而且这几个参数之间还有耦合关系。
首先有这几个参数要改
nr_open的默认值是1024*1024 (1048576)。对于绝大多数系统都够了。
所以我上面写了这个不一定要改。
如果要改,不要使用 下面这种方式
1 | echo '1100000' > /proc/sys/fs/nr_open |
因为重启,这种设置就会失效。建议使用修改/etc/sysctl.conf的方式
1 | # vi /etc/sysctl.conf |
修改soft nofile 和 hard nofile的方法
1 | # vi /etc/security/limits.conf |
hard和soft设置成一样的,因为实际生效的值会按二者里最低的来
file-max 这个参数只限制非 root 用户。当发生文件打开过多时,使用普通用户无法使用 ps,kill 等命令,就是这个原因。所以遇到这种情况直接用 root 去 kill 就行了
file-max一般为内存大小(KB)的10%来计算,如果使用shell,可以这样计算
1 | grep MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}' |
另外,注意一点。
修改了fiel-max最好同步修改下inode-max
inode-max 约等于 3或4 倍file-max。
否则可能改好了文件句柄数的问题,后面与会遇到inode不足的问题。
有人喜欢使用ulimit命令来修改open_files。因为这样比较方便。
不建议这样做,因为ulimit修改的配置,重启都会失效。
ulimit就用来查看就好了。
ulimit提供对shell及其启动的进程的可用资源(包括文件句柄, 进程数量, core文件大小等)的控制。
这是进程级别的, 也就是说系统中某个session及其启动的每个进程能打开多少个文件描述符, 能fork出多少个子进程等… 。
我觉得比较稳妥点的修改方法是干脆都直接用 conf 文件的方式来改。这样比较统一,也比较安全。
1 | # vi /etc/sysctl.conf |
另一条路就是我们配置的参数够大了,但是还是出现告警,那就是运行的某个进程有问题,所以要找到他。
显示现在打开的总的文件数
1 | cat /proc/sys/fs/file-nr |
应该加上告警,达到80%了需要告警。
查看openfiles最多的进程
1 | lsof -Ki|awk '{print $2}'|sort|uniq -c|sort -n -r|head -6 |
这个命令可能会执行的很长时间,因为告警的时候文件数已经很多了,统计出来需要时间。
所以一定要在收到告警时就进行处理。千万不用等到句柄数都用完了,那时候命令可能都执行不了了。
无法修改 /etc/resolv.conf 的问题
Linux系统/etc/resolv.conf文件为只读模式,且无法更改权限
/etc/resolv.conf 为只读模式
使用 chmod +w /etc/resolv.conf 命令修改权限会报如下的错:
chmod: changing permissions of `/etc/resolv.conf’: Operation not permitted
1
解决方法:
使用 chattr 命令可以解除这个限制
首先先查看一下属性
sudo lsattr /etc/resolv.conf
sudo chattr -i /etc/resolv.conf
chmod +w /etc/resolv.conf
1
2
3
4
5
6
7
这时候就可以修改/etc/resolv.conf文件了
————————————————
版权声明:本文为CSDN博主「VilsonYuan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013690521/article/details/108140942











