docker中使用nginx

web框架

说服务器,肯定离不开网站,先说一下python中常用来做web的框架。
django:大而全,主力
flask:轻量,什么功能都没有全靠插件
tornado:异步非阻塞 吞吐率1200/s

一说到吞吐或系统性能,就得说一下go语言,go和docker肯定是时代的步伐,go高并发的语言,就是它二次开发的docker,go内置了goroutine(轻量级的协程) 不跟你搞什么进程线程。要搞就搞最轻量最快的并发。

nginx在这里插入图片描述

curl -I www.jd.com可以查看网站用的服务器,比如上图阿里就是用的自己的服务器。
再说一个web服务器,它能做什么呢?
两个字:定位

web开发为什么要使用nginx?
在python的web开发中,
单纯的靠uwsgi + django来完成并部署一个web网站,稍微上了3W就顶不住,并且uwsgi对静态文件的处理效率低下,项目中的static文件会在网页上显示错误或排版问题。这时,就需要一个处理静态文件高效的nginx顶uwsgi前面,nginx还有负载均衡作用,并且它自己就能顶10W+的并发。

docker中nginx使用
没有使用docker之前,我去安装nginx真的是踩坑无数,可算安装并正常使用来部署了一个电商项目。但是自从有了docker我再也不想安装任何东西了,要啥跑啥不好吗,还非要去安装干嘛,所以直接说docker跑的nginx的使用,安装的nginx正常适用。
一定要注意:docker跑的nginx容器,进入后,/etc/nginx/nginx.conf不是配置文件!!!!我想知道docker的nginx加个这个文件是为了故意让我们走弯路吗?我之前一直挂载在这个nginx.conf上,后来才知道,这个nginx.conf是管http块,其实,docker跑的nginx真正的配置文件在con.f里的default.conf,它里面只有server配置,所以挂载要挂这个default.conf,另外,挂载后你就从server开始写,别去管其他了,我现在才反应过来docker这样设计nginx其实就是为了让我们专心的去配置虚拟主机,每个虚拟主机里有个比较重要的就是root /usr/share/nginx/html,就是常说的主站,你把某些静态资源放主站文件夹里,可以直接通过它的文件名访问到,index是只有ip端口时的默认返回资源,主站可以自己修改。

无论是docker跑的还是安装的,注意:
1、nginx的工作进程数(worker_processes)以宿主机cpu核数为准。
2、nginx是c写的,所以配置文件格式也是c语言格式,每行配置语句末尾要加分号。
3、http控制nginx核心功能,server创建虚拟主机,可以有多个server,在下面会详细讲到nginx的多虚拟主机。
4、nginx它有个gzip on 即网络上它压缩资源后再传输。
5、root参数是定义网站根目录,你可以不写html,自己创建个网站根目录,把绝对路径写上去。
6、error_page 401 402 403 404 /40x.html,错误页面的location不用加,没人会去故意访问。这个/40x.html的意思是出现40几的错误就到这个虚拟主机的根目录下去找40x.html这个文件。50几的状态码同理。这些页面你可以去百度找但是记得更改default.conf后要docker restart生效。

nginx多虚拟主机
1、nginx就是为了让你少花钱,比如我买一台服务器,我要买个域名,我可以搭多个网站的代码上去,一台虚拟主机我用来卖衣服,另一台我用来卖片,还有一台我卖鞋。。。。如果nginx没有虚拟主机功能,即你一个nginx只允许一个站点,那我有几个网站就得买几个服务器。而虚拟主机就是用server来声明,它们可以是不同域名端口相同,也可以是不同端口域名相同,还有基于ip的负载均衡就不说了

**小实验(不同域名端口相同的多个虚拟主机):
我是这样的,在服务器上我用docker跑的nginx,并把服务器的8006映射到nginx容器的80。
server{页面1}:我服务器备案的真实域名,主站在docker容器的/usr/share/nginx/html
server{页面2}:由于我只有一个公网域名,只有通过hosts文件配置域名,转到我服务器的ip。如果你服务器有多个域名就不用利用hosts文件,直接摆上真实域名。比如:服务器ip www.yuechuan.lan
server{页面3}:同页面2
在这里插入图片描述
这3个虚拟主机,通过它里面的的三个域名来访问,但是得加上:8006,因为我是用docker跑的,我域名:8006才是访问的docker容器中的nginx,端口映射嘛。

nginx的代理功能
1、一说代理就有正向反向:正向代理就是常说的代理,它最常见的例子就是VPN,简单地说,某个目的网站是我直接访问不了的国外网站,我知道我想要访问的那个目的国外网站,我浏览器输入的是那个国外网站,其实这个请求会交给一个中间人,但是我并不知道实际是中间人在帮我去找国外服务器拿数据。反向代理压根我就不知道真正服务器的地址,意思就是我主站就没有暴露,安全系数高了,现在我输入不了国外目的网站只有这个中间人的ip端口,我直接去找这个中间人拿。nginx做广泛的应用,就是做反向代理。
即我请求代理服务器nginx,nginx根据路由去分发到各自的web服务器(uwsgi)。

2、nginx反向代理如果只代理到一台服务器,用proxy_pass,代理一台,除了安全系数外,基本没啥用。
在这里插入图片描述
3、nginx反向代理更多会做负载均衡,即转发的不是一台,而是一个服务器池(集群,我拿好多个服务器来跑我的同一个uwsgi代码)。那么请求到了这儿,nginx到底向这个池里的那个uwsgi转发呢,这就是nginx的负载均衡算法,第一个请求nginx转到第一个uwsgi,第二个请求nginx转到第二个uwsgi。。。。。反正不会让代理池中的uwsgi闲着,就好比前面是一个人抬集装箱,负载均衡是一群人抬集装箱,这个集装箱就代表用户的请求量。

4、nginx负载均衡池:
a、默认算法是轮循。
b、也可以使用weight权重算法,权越重交给你处理的次数越多。
c、也可以用ip_hash算法负载,但是我总觉得不均衡。还是用weight直接点。
在这里插入图片描述

发布了3 篇原创文章 · 获赞 0 · 访问量 137

猜你喜欢

转载自blog.csdn.net/qq_37623764/article/details/104927634