ocker nginx 配置反向代理和负载均衡[通俗易懂]

ocker nginx 配置反向代理和负载均衡

大家好,又见面了,我是你们的朋友全栈君。

1. 获取及配置nginx  

  如果需要全站通过docker部署,那么nginx或许是不可或缺的。通过配置nginx,可以迅速实现负载均衡和反向代理服务。值得一提的是,docker官网恰好也有nginx镜像。通过以下命令获取:

$ docker pull nginx:latest
  • 1

  nginx镜像的配置和正常使用时是一样的,一般都是在/etc/nginx/conf.d目录下建立自己的filename.cnf文件即可。不同的,docker nginx通过挂载的方式将配置文件应用到nginx。 
  例如,我在本地$HOME/nginx/conf.d文件夹下建立default.cnf文件,文件内容:

upstream backends {
    server app1:8080; server app2:80801; } server { listen 80; listen 443 ssl; server_name example.com; # SSL # ssl on; # 只允许ssl方式访问 ssl_certificate /etc/ssl/certs/example.pem; ssl_certificate_key /etc/ssl/certs/example.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1 www.huarenyl.cn.1dasheng178.com/ TLSv1.2; ssl_prefer_server_ciphers on; #proxy to webs location ~.*/ { 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; proxy_pass http://backends; # 这里设置你要代理的ip+端口 

其中, 
upstream backends {}:实现了名称为backends的负载均衡。可存在多个,如有需要,还可以自行创建其他。 
listen 80:监听80端口。 
listen 443 ssl;监听443端口,并且开启ssl。 
ssl_certificate, ssl_certificate_key:加载ssl证书。他们指定的是镜像中ssl证书文件的位置,推荐将证书放到如上位置。他们后面的几个配置,都是ssl的默认配置,不需要修改。 
location ~.*/{}:nginx文件路径的正则匹配,将外部对服务器的访问,自动分配到docker应用程序容器,交给这些应用程序处理请求。

  这个文件实现了简单地http访问、https访问,以及简单地负载均衡(将外部对服务器的请求,随机地分配到app1和app2这两个容器处理)。

2. 启动nginx

  通过upstream的配置,我们看到,nginx还关联着其他两个容器:app1、app2,并且需要能够和这两个容器相互通信。所以,启动nginx之前,需要先启动其他两个容器,这样通过命令行纪委不方便,我们通过docker-compose的编写配置文件的方式来启动nginx。 
  文件内容如下: 
docker-compose.yml 

version: "3"
services:
  nginx:
    image: nginx
    container_name: www.boshenyl.cn nginx
    depends_on:
      - todolist ports: - "443:443" # https访问端口 - "80:80" # http访问端口 volumes: - $HOME/etc/nginx/conf.www.wanmeiyuele.cn d:/etc/nginx/conf.d # 挂载配置文件 - $HOME/etc/ssl/certs:/etc/ssl/certs # 挂载证书文件 links: - app1 # 相当于 docker run 中的 --link - app2 app1: # 镜像服务的名称(不指定container_name,docker-compose在此基础上构建名称) image: web # 既然是负载均衡,那么启动的镜像必然是相同的 container_name: app1 # 这样写是必要的,否则docker-compose将采用默认命名方式 ports: - "8080:8080" # 端口映射不是必要的。详情请连接docker的通信 app2: image: web container_name: app2 ports: - "8081:8081" # 端口映射不是必要的。详情请连接docker的通

  在以上文件所在的目录运行以下命令,即可启动nginx,体验配置结果了:

$ docker-compose www.233077.cn    www.233077.cn     up -d
  • 1

 

需要注意地地方:


1. nginx镜像暴露了两个端口,80443。如果需要通过http的方式访问,一定要映射80端口;如果需要通过https的方式访问,一定要映射443端口。默认同时映射就好了,更新配置方便。 
2. docker-compose中指定镜像的名字,使用container_name属性。 

我看了网上的很多教程,都没有提到nginx的启动问题,尤其是端口映射。如果你启动时,没有映射443端口,单独配置http访问或者https访问,不会发生任何问题,一旦要配置二者可以同时访问,或者http重定向到https,必要会出现问题。常见的为,本地curl出现如下结果:

curl: (35) gnutls_handshake() failed: An unexpected TLS packet was received.
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/107588.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 深度好文 | 深圳IT人力外包客户如何做好外包客户的征询?

    深度好文 | 深圳IT人力外包客户如何做好外包客户的征询?1、询问公司的人数、技术团队及技术人员分布情况。2、公司的项目情况。(产品型or项目型、项目简单介绍、项目所处阶段、项目配备人员、预计开发周期、项目远期规划)3、采用外包的原因。(人员编制、项目紧急、招聘流程满、技术招聘能力不足、项目周期性、不愿养太多技术人员等)4、是否接触过外包、有无外包人员、最长外派多久了。5、职位需求、数量、周期、是否自备电脑。Java人员外包、web前端外包、Androi…

  • ICMP协议详解

    ICMP协议详解ICMP协议详解ICMP协议是一个网络层协议。一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。所以我们就需要一种协议来完成这样的功能–ICMP协议。ICMP协议的功能ICMP协议的功能主要有:1.确认IP包是否成功到达目标地址2.通知在发送过程中IP包被…

  • 什么是海外镜像点?

    什么是海外镜像点?

  • [EE261学习笔记] 4.常用的几个傅里叶变换相关公式

    [EE261学习笔记] 4.常用的几个傅里叶变换相关公式在本文开始前,需要说明一点,以下推导出的各项公式,只是为了实际计算中方便,并不都有其对应的物理意义。首先,我们写出符号f−(t)=f(−t)f−(t)=f(−t)f^-(t)=f(-t),显然,对于奇函数而言,f−=−ff−=−ff^-=-f;对于偶函数而言,f−=ff−=ff^-=f。根据前文傅里叶变换推导,我们知道…

  • 什么是java构造函数_什么是java构造函数

    什么是java构造函数_什么是java构造函数构造函数是面向对象中的一员,构造函数可以叫做构造器,它的函数名与类名相同,不用定义返回值类型,也没有具体的返回值。构造函数是在构建创造时对象时调用函数,作用是可以给对象进行初始化,创建对象都必须要通过构造函数初始化。一个类中如果没有定义过构造函数,那么该类会有一个默认的空参数构造函数。如果在类中定义了指定的构造函数,那么该类中的默认构造函数就没有了。我们人出生的时候,有些人一出生之后再起名字的,但…

  • 蓝桥杯真题总结(蓝桥杯考什么)

    Python获取每一位的数字,并返回到列表:方法一:whilevalue:result.append(value%10)value=value//10#逆序,按正常的顺序返回result.reverse()方法二:list(map(int,str(value)))方法三:#divmod()是内置函数,返回整商和余数组成的元组result=[]whilevalue:value,r=divmod(value,1

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号