liu 发布的文章

使用Docker部署Guacamole


Apache Guacamole 是一个无客户端的远程桌面网关。它支持标准协议,如 VNC、RDP 和 SSH,甚至还支持k8s、telnet连接。它可以在任何有网络的地方连接上你的服务器和Windows主机。可以同时连接多个终端,并且能够无缝切换。


部署教程


安装docker

首先需要安装Docker,使用官方一键安装脚本部署或者在线安装,已安装的直接忽略


yum install docker-ce


systemctl start docker.service 


systemctl enable docker.service 


拉取镜像

docker pull guacamole/guacamole

docker pull  guacamole/guacd

docker pull mysql

 查看镜像


docker image ls



部署mysql

运行docker容器


docker run  -d --name mysql -e MYSQL_ROOT_PASSWORD=guacamole mysql

Guacamole程序不会自动初始化数据库,运行MySQL之后需要手动初始化数据库,而Guacamole提供了数据库文件,只需要生成导入就可以了。

生成数据库文件:


docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > initdb.sql

这一步完成后当前目录下会生成一个initdb.sql的文件,将它复制到MySQL容器内


docker cp initdb.sql mysql:/

复制完成之后进入MySQL容器初始化数据库


# 进入MySQL容器:

docker exec -it mysql bash

 

# 在容器内运行,进入数据库

 mysql -uroot -psim

 

# 创建一个数据库:

mysql > create database guac;

 

# 选择数据库:

mysql > use guac;

 

# 导入数据:

mysql > source /initdb.sql

至此,完成了数据库初始化


部署Guacd

Guacd是Apache Guacamole网络应用程序使用的本地服务器端代理,运行Guacd:


docker run --name guacd -d guacamole/guacd

部署Guacdmole

运行Guacdmole:


docker run --name guacamole --link guacd:guacd \

    --link mysql:mysql         \

    -e MYSQL_DATABASE=guac \

    -e MYSQL_USER=root    \

    -e MYSQL_PASSWORD=guacamole \

    -d -p 9090:8080 guacamole/guacamole

运行起来后大概初始化十秒钟,在浏览器打开 http://ip:9090/guacamole



默认账号密码均为:guacadmin


添加session

打开settings




然后进入



添加相应的信息




就可以了点击相应的标签进入界面了


传说中guacamole的RDP支持设备重定向功能,经实测,设备重定向功能和mstc的设备本地资源不是一回事儿,mstc中的本地资源是可以将使用mstc的计算机上的资源映射到远程虚拟机上,而guacamole的RDP的设备重定向仅仅是将guacamole server上的目录映射到虚拟机上,如下图:




这里“虚拟盘路径”实际上是guacamole服务器上的一个目录,

实际效果如下图所示


————————————————


                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

                        

原文链接:https://blog.csdn.net/weixin_48227918/article/details/132632049


运维 | Nginx Proxy Manager反向代理工具

简介

Nginx Proxy Manager(以下简称 NPM)就是一个 Nginx 的代理管理器,它最大的特点是简单方便。


即使是没有 Nginx 基础的小伙伴,也能轻松地用它来完成反向代理的操作,不需要自己写复杂的nginx配置,而且因为自带面板,操作极其简单。


Nginx Proxy Manager 后台还可以一键申请 SSL 证书,并且会自动续期,方便省心。


官方网站:https://nginxproxymanager.com/

官方快速安装:https://nginxproxymanager.com/guide/#quick-setup


准备工作

服务器


Vultr 注册:https://www.vultr.com/

Racknerd 注册:https://my.racknerd.com/


域名注册与解析


域名注册:https://www.namesilo.com

域名解析:https://www.cloudflare.com


SSH 连接工具(可选,推荐)


FinalShell下载:http://www.hostbuf.com/t/988.html


快速使用

环境搭建

我们推荐按照 Docker 官方文档安装 Docker 和 Docker Compose,因为部分 Linux 发行版软件仓库中的 Docker 版本可能过旧。


Docker 安装文档

Docker Compose 安装文档

创建容器

在系统任意位置创建一个文件夹,此文档以 /opt/docker/npm 为例

mkdir -p /opt/docker/npm && cd /opt/docker/npm

mkdir -p ./{conf,data,logs}

1

2

注意:后续操作中,产生的所有数据都会保存在这个目录,请妥善保存


创建 docker-compose.yaml

vim docker-compose.yml

1

在英文状态的输入法下,按下 i,左下角出现 --INSERT-- 后,粘贴填入下面的内容:


version: '3'

services:

  app:

    image: 'jc21/nginx-proxy-manager:latest'

    restart: unless-stopped

    ports:

      - '80:80'              # 不建议修改端口

      - '81:81'              # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口

      - '443:443'            # 不建议修改端口

    volumes:

      - ./data:/data         # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 data 目录,用于存放数据,如果不存在的话,会自动创建

      - ./letsencrypt:/etc/letsencrypt  # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 letsencrypt 目录,用于存放证书,如果不存在的话,会自动创建

    # network_mode: "host"

1

2

3

4

5

6

7

8

9

10

11

12

13

注意:安装了 NPM 之后,就不需要再安装 Nginx 了,否则会端口冲突(不建议修改 NPM 的 80、443 端口)。如果你的服务器安装了宝塔面板,也可以和 NPM 一起使用,只要你到软件后台把宝塔安装的 Nginx 关闭或者卸载即可。


之后,同样在英文输入法下,按一下 esc,然后 :wq 保存退出。


启动服务

docker-compose up -d

1

实时查看日志:


docker-compose logs -f

1

用浏览器访问 http://ip:端口号 即可

默认登陆的用户名:admin@example.com 密码:changeme


第一次登陆会提示更改用户名和密码,建议修改一个复杂一点的密码。


查看服务器 IP:curl ip.sb


如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 http://ip:端口号 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。


更新容器

停止运行中的容器组

cd /opt/docker/npm && docker-compose down

1

备份数据(重要)

cp -r /opt/docker/npm /opt/docker/npm.archive

1

需要注意的是,npm.archive 文件名不一定要根据此文档命名,这里仅仅是个示例。


更新服务

修改 docker-compose.yaml 中配置的镜像版本


拉取镜像


docker-compose pull npm

1

重新启动容器


docker-compose up -d

1

进阶使用

配置反向代理

首先我们登陆网页端之后,会弹出修改用户名和密码的对话框,我们根据自己的实际来修改自己的用户名和邮箱。




保存之后,会让我们修改密码(建议用一个复杂的密码)。




接着我们就可以添加一个反向代理了。


点击 Proxy Hosts,




接着点击 Add Proxy Host,弹出如下对话框:




看起来都是英文,很复杂,但是其实很简单,我们只要用到其中的几个功能即可,这边稍微解释一下:


Domain Names :填我们网站的域名,首先记得做好 DNS 解析,把域名绑定到我们的服务器的 IP 上

Scheme :默认 http 即可,除非你有自签名证书

Forward Hostname/IP :填入服务器的 IP,或者 Docker 容器内部的 IP(如果 NPM 和 网站搭建在同一台服务器上的话)

Forward Port:填入网站映射出的端口,这边默认是 8090

Cache Assets :缓存,可以选择打开

Block Common Exploits: 阻止常见的漏洞,可以选择打开

Websockets Support :WS 支持,可以选择打开

Access List: 这个是 NPM 自带的一个限制访问功能,这边我们不管,后续可以自行研究。

以下是一个样列:




因为样例的 NPM 和 网站搭建在同一台服务器 上,所以这边的 IP,图中填的是 172.17.0.1,为 Docker 容器内部的 IP 地址,


可以通过下面的命令查询:


ip addr show docker0

1

4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 

    link/ether 02:42:e4:a3:b5:b9 brd ff:ff:ff:ff:ff:ff

    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

       valid_lft forever preferred_lft forever

1

2

3

4

这边的 IP 是 172.17.0.1,填入这个 IP,可以不用打开防火墙的 8090 端口。


当然,如果你的 NPM 和网站不在同一台服务上,你需要在 IP 部分填入 你的 网站所在的服务器的 IP,并在服务商(部分服务商如腾讯、阿里)的后台打开 8090 端口。


申请 SSL 证书

接着我们来申请一张 SSL 证书,让我们的网站支持 https 访问。






如图所示,记得打开强制 SSL,其他四个的功能请自行研究,这边不多做讨论。


申请证书需要你提前将域名解析到 NPM 所在的服务器的 IP 上;

如果你使用的是国内的服务器,默认 80 和 443 端口是关闭的,你需要备案之后才能使用;

如果你使用了 CloudFlare 的 DNS 服务,记得把小黄云关闭(即不开启 CDN)。

不出意外,你将成功申请到 SSL 证书,证书会三个月自动续期。


再次点开配置,查看一下,将强制 SSL 打开。


至此,你已经成功完成了网站的反向代理,快尝试使用域名访问一下看看吧!


同样的,举一反三,试试把你的 NPM 也用一个域名来反向代理一下吧。(小提示:你需要再解析一个域名(可以是二级域名)到 NPM 所在的服务器上,反代页面需要填的 IP 可以填 docker 容器内的 IP 也可以填服务器的 IP,端口填 81 即可)


FAQ

Internal Error while applying let’sencrypte certificate

https://github.com/NginxProxyManager/nginx-proxy-manager/issues/2860


Temp workaround (that works for me!) for SSL certificate renewal bug

https://github.com/NginxProxyManager/nginx-proxy-manager/issues/2881


ModuleNotFoundError: No module named ‘zope’

https://github.com/NginxProxyManager/nginx-proxy-manager/issues/2440


AttributeError: module ‘certbot.interfaces’ has no attribute ‘IAuthenticator’

https://github.com/NginxProxyManager/nginx-proxy-manager/issues/2430


Internal Error while applying let’sencrypte certificate

https://github.com/NginxProxyManager/nginx-proxy-manager/issues/2860


如何安装中文版

GitHub: xiaoxinpro/nginx-proxy-manager-zh

Docker: chishin/nginx-proxy-manager-zh

当你使用官方示例的docker-compose时需要注意,将image镜像jc21/nginx-proxy-manager替换为chishin/nginx-proxy-manager-zh即可实现中文部署


中文镜像并没有重新构建后端代码,由Dockerfile-zh源码可以得知,中文版镜像基于官方镜像替换前端代码来实现的,所以中文版本的全部功能与官方版本完全相同,只是显示界面的文字不同的区别。


端口无法访问怎么办

sudo systemctl stop firewalld

1

处理遇到502的问题

setsebool -P httpd_can_network_connect 1

1

参考文献

Nginx Proxy Manager — How To Installation and Configuration using Docker — Portainer

————————————————


                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

                        

原文链接:https://blog.csdn.net/weixin_39122254/article/details/133421569


前期准备

docker程序

Nginx Proxy Manager :  镜像包   镜像网址

安装docker程序

安装docker   官方文档

安装docker-compose   官方文档

创建 “Nginx Proxy Manager” 容器

可以使用以下两种方法创建

1、手动拉取(导入)镜像,再创建容器(可视化docker面板推荐这种)

2、使用 “docker-compose.yml” 文件创建


下面演示第2种方法

1、在电脑上新建一个文本文档并重命名为 “docker-compose.yml” ,注意要把 “.txt”后缀删除

2、复制粘贴下面代码


version: '3.8' #表示使用的是Docker Compose文件格式的3.8版本

services:

  app:

    image: 'jc21/nginx-proxy-manager:latest'

    restart: unless-stopped

    network_mode: host  

    volumes:

      - ./data:/data

      - ./letsencrypt:/etc/letsencrypt

1

2

3

4

5

6

7

8

9

3、将 “docker-compose.yml” 放到docker容器目录(任意位置,能在安装docker程序的机器上找到就行)

4、打开终端,使用cd命令导航到存储“docker-compose.yml”文件的目录

5、执行下面命令创建容器


docker-compose up -d

1

登录 “Nginx Proxy Manager” 面板

docker程序所在的机器的防火墙放行 “81”、“80”、“443” 端口

浏览器输入地址:http://127.0.0.1:81 (注:127.0.0.1替换为docker程序所在的机器的IP地址)

默认账号:admin@example.com

默认密码:changeme



无法访问面板?

检查端口占用情况

检查是否有服务已经占用了 “80” 和 “443” 端口(注意是在安装了docker程序的机器上运行命令)

1、 在Linux系统上


sudo netstat -tulpn | grep :80

1

sudo netstat -tulpn | grep :443

1

2、 在Windows系统上


netstat -an | find "80"

1

netstat -an | find "443"

1

3、 在Mac系统上


sudo lsof -i :80

1

sudo lsof -i :443

1

如果结果没有任何返回,则说明端口没有被占用,进一步说明不是端口被占用的原因导致无法访问,那可能是上一步创建容器出了问题


如果返回了像下面这样的结果,说明端口被占用,具体被哪个程序占用,可以在每一行的最后的字段找到,像下面这个就是被进程ID为 “797” ,程序名称为 “nps” 的程序占用




解决方法

如果不是端口占用的原因导致的无法访问,请仔细检查之前创建容器的步骤是否有疏漏

可以运行下面的命令检查容器是否在正常运行,


docker-compose ps

1

下面这样就是正常运行状态




如果是端口被占用的原因导致的无法访问,将占用端口的程序更换端口即可

比如我的 “80” 和 “443” 端口是被 “nps” 这个程序占用的,我需要修改 “nps” 程序的配置文件改为其他端口,也就是说需要把 “80” 和 “443” 这两个端口给 “Nginx Proxy Manager” 用,“nps” 程序使用其他端口,修改完端口记得重启系统



修改账号信息

登录后会自动跳出修改名称和邮箱界面(注意登录账号是邮箱不是名称,用名称是无法登录的),修改完点 “save” 保存



然后会自动跳出修改密码界面,修改完点 “save” 保存



添加反代服务

主要作用是可以隐藏端口访问部署在服务器上的服务(只需要输入域名就可以跳转到相应的服务),增加服务器的安全性,灵活性和可维护性





注意事项

每一个域名都需要DNS解析到对应的IP地址

 

 

验证是否反代成功

点击反代服务的域名,正常情况会跳转到目标服务



可以看到成功跳转到了我部署的Alist网盘



如果跳转失败,请检查域名、IP地址、端口等信息是否填写错误

 

 

SSL证书自动续期

进入证书管理界面

可以看到这里已经有了一些证书,这些证书就是刚才添加反代服务的时候顺便申请并添加的,不需要再手动申请证书,证书有效期3个月,快到期的时候程序会自动续期(经过验证,根域名和二级域名可以很轻松的自动续期,泛域名时不时会失败而且需要DNS秘钥验证才能申请成功)



域名重定向

主要作用是用 “域名A” 访问 “域名B”的服务




END

————————————————


                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

                        

原文链接:https://blog.csdn.net/qq_29064203/article/details/135982564


通常我们的web应用程序部署的时候不会直接暴露,通过nginx反向代理,一是隐藏真实后端,二是通过nginx的epoll网络IO多路复用,获取高性能的网络访问。

今天我们分享个通过nginx代理go的后端web服务。

主要内容:

  • nginx初始化配置

  • go应用的初始化配置

  • 部署实战(反向代理server | ssl | 负载均衡)

1.nginx初始化配置

nginx作为常用的web代理服务器,其优秀的性能自不必说,今天我们直接来看看nignx的docker化部署情况。

1.拉取镜像
docker pull nginx:latest

2.获取配置
先跑nginx容器,再把nginx的配置文件复制出来


pwd

// /root/ngx-go-web/ngx



ls

// conf  conf.d  html  logs  start.sh



docker run -d --name mynginx nginx:latest



docker cp /etc/nginx/nginx.conf ./conf/


3.停掉nginx容器
docker rm -f mynginx

4.查看nginx.conf


cat ./conf/nginx.conf

---

user  nginx;

worker_processes  auto;



error_log  /var/log/nginx/error.log notice;

pid        /var/run/nginx.pid;





events {

worker_connections  1024;

}





http {

include       /etc/nginx/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  /var/log/nginx/access.log  main;



sendfile        on;

#tcp_nopush     on;



keepalive_timeout  65;



#gzip  on;



include /etc/nginx/conf.d/*.conf;

server {

listen  80;

}

}

---


2.go应用的初始化配置

go用来编写代码,简单易上手,今天通过net/http包,简单演示go的web应用。

web-server


mkdir go-http



ls

// go.mod  server.go

新建文件后编写代码:


// server.go

package main



import (

"encoding/json"

"io"

"log"

"net/http"

)



func main()  {

http.HandleFunc("/hello", hello)

http.HandleFunc("/login", login)

log.Println("HTTP server up at", "http://localhost:8080")

_ = http.ListenAndServe("0.0.0.0:8080", nil)

}



func hello(w http.ResponseWriter, r *http.Request)  {

w.Write([]byte("Hello from go http server"))

}



func login(w http.ResponseWriter, r *http.Request)  {

body, err := io.ReadAll(r.Body)

if err != nil {

w.Write([]byte("Bad request data."))

return

}

log.Println("req data:", string(body))



var data map[string]interface{}

_ = json.Unmarshal(body, &data)



username := data["username"]

passwd := data["password"]



if username == "username" && passwd == "password" {

w.Write([]byte(body))

return

}



w.Write([]byte("Bad login parameters."))

}

golang运行环境


pwd

// /root/ngx-go-web/go-http



vim Dockerfile

---

FROM golang:latest



ENV GO111MODULE=on



# 设置容器进入后的dir

WORKDIR /opt/go-server



# 复制当前文件到容器中

ADD . ./



# 容器中编译server二进制程序

RUN go build -o server .



# 声明暴露的端口,server运行的端口

EXPOSE 8080



# 容器启动时运行命令,启动即运行go的应用程序,使用CMD会被docker run的bash命令覆盖,注意

ENTRYPOINT ["./server"]

---



// 构建golang的运行镜像

docker build  -t go-server-demo:v1.0 .

查看镜像:

# docker imagesREPOSITORY       TAG       IMAGE ID       CREATED             SIZEgo-server-demo   v1.0      600577fdb057   About an hour ago   848MB # go-webgolang           latest    c48137eaf961   8 days ago          778MBnginx            latest    904b8cb13b93   2 weeks ago         142MB # nginx

3.部署实战

  • 手动部署

  • docker-compose编排部署

手动部署(脚本化)

启动go应用的容器:
docker run -d --name go-server -p 8080:8080 go-server-demo:v1.0

编辑nginx的配置:


user  nginx;

worker_processes  auto;



error_log  /var/log/nginx/error.log notice;

pid        /var/run/nginx.pid;





events {

worker_connections  1024;

}





http {

include       /etc/nginx/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  /var/log/nginx/access.log  main;



sendfile        on;

#tcp_nopush     on;



keepalive_timeout  65;



#gzip  on;



include /etc/nginx/conf.d/*.conf;

server {

listen  80; # nginx监听80端口

server_name 172.30.1.240;

location / {

proxy_pass http://172.30.1.240:8080/; # 代理转发到 real server处理

proxy_redirect off ;

proxy_set_header Host $host; # 确保后端真实服务器收到的ip是客户端真实ip,非nginx的ip

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header REMOTE-HOST $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

}

启动nginx容器
docker run -d --restart always -v /root/ngx-go-web/ngx/conf/nginx.conf:/etc/nginx/nginx.conf --name mynginx -p 80:80 nginx:latest

查看容器运行情况:

root@ubuntu:~/ngx-go-web/ngx/conf# docker psCONTAINER ID   IMAGE                 COMMAND                  CREATED             STATUS             PORTS                                       NAMESd3bd80806a46   nginx:latest          "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:80->80/tcp, :::80->80/tcp           mynginx1d79a28260ba   go-server-demo:v1.0   "./server"               About an hour ago   Up About an hour   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   go-serverroot@ubuntu:~/ngx-go-web/ngx/conf# docker top mynginxUID                 PID                 PPID                C                   STIME               TTY                 TIME                CMDroot                49165               49141               0                   11:20               ?                   00:00:00            nginx: master process nginx -g daemon off;systemd+            49216               49165               0                   11:20               ?                   00:00:00            nginx: worker processsystemd+            49217               49165               0                   11:20               ?                   00:00:00            nginx: worker processroot@ubuntu:~/ngx-go-web/ngx/conf# docker top go-serverUID                 PID                 PPID                C                   STIME               TTY                 TIME                CMDroot                46956               46935               0                   10:58               ?                   00:00:00            ./server

可以看到容器都正常运行起来了,接下来简单测试看看:
测试 api: /hello

测试 api: /login
用户名错误:

正常用户名和密码:

可以看到从测试情况来看,我们确实实现了nginx通过监听主机上的80端口,代理上游的真是服务器go-web应用,通过80 -> 8080端口,实现了请求的代理转发。

上面的部署很粗糙,只是为了熟悉整个过程,更好的实现应该是用脚本自动化部署,减少人工的配置、输入命令等。

分割线---
以上基于http监听80端口,通常生产情况,是基于https的访问,以下为nginx的443设置。
nginx:443
为方便测试,采用自签证书形式获取证书和秘钥。


1.生成秘钥

openssl genrsa -out ssl.key 2048



2.生成证书请求

openssl req -new -key ssl.key -out ssl.csr



3.生成证书

openssl x509 -req -days 36500 -in ssl.csr -signkey ssl.key -out ssl.crt



4.查看生成证书

ls

// ssl.crt  ssl.csr  ssl.key



pwd

// /root/ngx-go-web/ngx/cert/ssl

配置nginx的ssl部分
通常我们可以配置全局的ssl,也可以针对某个server进行配置,以下以server进行配置。


# cat nginx.conf

---

user  nginx;

worker_processes  auto;



error_log  /var/log/nginx/error.log notice;

pid        /var/run/nginx.pid;





events {

worker_connections  1024;

}





http {

include       /etc/nginx/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  /var/log/nginx/access.log  main;



sendfile        on;

#tcp_nopush     on;



keepalive_timeout  65;



#gzip  on;



include /etc/nginx/conf.d/*.conf;

# global ssl





server {

listen  443;

server_name 172.30.1.1;

# ssl

ssl on;

ssl_certificate  /etc/nginx/cert/ssl.crt;

ssl_certificate_key /etc/nginx/cert/ssl.key;

location / {

proxy_pass http://172.30.1.1:8080/;

index index.html index.htm;

}

}

}

---


停掉nginx容器,重新跑nginx


docker rm -f mynginx



docker run -d --restart always \

>         -p 443:443 \

>         --name mynginx \

>         -v /root/ngx-go-web/ngx/conf/nginx.conf:/etc/nginx/nginx.conf \

>         -v /root/ngx-go-web/ngx/cert/ssl/ssl.crt:/etc/nginx/cert/ssl.crt \

>         -v /root/ngx-go-web/ngx/cert/ssl/ssl.key:/etc/nginx/cert/ssl.key \

>         nginx:latest



docker ps

CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                           NAMES

a36599a1afd6   nginx:latest          "/docker-entrypoint.…"   8 seconds ago   Up 6 seconds   80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   mynginx

1d79a28260ba   go-server-demo:v1.0   "./server"               4 hours ago     Up 4 hours     0.0.0.0:8080->8080/tcp, :::8080->8080/tcp       go-server

重新测试基于https-443监听端口的nginx是否设置成功:

可以看到,均能正常访问nginx的443端口,说明nginx监听443端口转发请求到上游的真实server成功。

负载均衡配置

nginx的负载均衡主要由轮询、ip哈希、权重、最少连接、公平、随机等,默认轮询分配。
首先我们的后端服务器先起来,比如服务端口分别是8080/8081,相应的nginx的配置如下:


# 属于http部分

http {

# load balance

upstream myServers {

server 172.30.7.240:8080;

server 172.30.7.240:8081;

}

server {

...

location / {

proxy_pass http://myServers;

}

}

}



--- 分割线---

ps.更多负载均衡设置

# weight 权重负载

upstream myServers {

server 172.30.1.1:8080 weight=3;

server 172.30.1.1:8081 weight=2;

}



# ip_hash ip哈希负载,解决session分配问题

upstream myServers {

ip_hash;

server 172.30.1.1:8080;

server 172.30.1.1:8081;

}



# least_conn 最少连接数

upstream myServers {

least_conn;

server 172.30.1.1:8080;

server 172.30.1.1:8081;

}

重启nginx,reload配置即可,测试后发现默认就是轮询的策略进行负载,实际生产时根据具体后端业务进行策略选择。

docker-compose编排部署

本文基于负载均衡的例子,编写yaml文件:

version: "2.1"services:mynginx:image: nginx:latesthostname: nginxcontainer_name: mynginxrestart: alwaysports:- 80:80- 443:443volumes:- /root/ngx-go-web/ngx/conf/nginx.conf:/etc/nginx/nginx.conf- /root/ngx-go-web/ngx/cert/ssl/ssl.crt:/etc/nginx/cert/ssl.crt- /root/ngx-go-web/ngx/cert/ssl/ssl.key:/etc/nginx/cert/ssl.keydepends_on:- go-server-1- go-server-2networks:app_net:ipv4_address: 172.237.237.10go-server-1:images: go-server-demo:v1.0hostname: go-server-1container_name: go-server-1restart: alwaysports:- 8080:8080volumes:- /root/ngx-go-web/go-http/config.yaml:/opt/go-http/config.yamlnetworks:app_net:ipv4_address: 172.237.237.11go-server-2:images: go-server-demo:v1.0hostname: go-server-2container_name: go-server-2restart: alwaysports:- 8081:8081volumes:- /root/ngx-go-web/go-http/config.yaml:/opt/go-http/config.yamlnetworks:app_net:ipv4_address: 172.237.237.12networks:app_net:driver: bridgeipam:driver: defaultconfig:- subnet: 172.237.237.0/24

相关运行:


# 后台起服务,到docker-compose.yaml文件目录内

docker-compose up -d



# 查看服务

docker-compose ps



# 停掉服务

docker-compose stop



# 重启服务

docker-compose restart



# 重启某服务

docker-compose restart mynginx

POWERSHELL复制全屏

通过docker-compose我们就可以实现容器的编排运行,当然如果业务需要也可以上k8s,那就是另外一套玩法了,这种业务体量已经可以抵挡一定的业务访问,根据需要部署docker/k8s。

参考: