Nginx:向外代理暴露Web服务
Module:
Categories:
Pigsty 在 INFRA节点上默认会安装 Nginx 作为 Web 服务代理。(单机安装时,本机默认也是一个 INFRA节点 )
Nginx 是 Pigsty 所有 WebUI 类服务的访问入口,默认使用管理节点 80/443
端口。
Pigsty 提供了一个全局配置变量 infra_portal
,用于配置 Nginx 的代理规则,以及对应的上游服务。
如果您直接通过端口访问 Nginx,默认访问的是 h.pigsty
,即 Pigsty 文件系统首页。(/www/
目录)。
因为 Nginx 通过同一个端口对外提供多个服务,因此必须通过域名进行区分(浏览器的 HOST
首部),所以在默认情况下,Nginx 只会对外暴露 带有
domain` 参数的
默认情况下,Nginx 除了 home
(文件系统,软件源)之外,还对外暴露 grafana
,prometheus
,alertmanager
三项可观测性服务:
infra_portal: # domain names and upstream servers
home : { domain: h.pigsty }
grafana : { domain: g.pigsty ,endpoint: "${admin_ip}:3000" , websocket: true }
prometheus : { domain: p.pigsty ,endpoint: "${admin_ip}:9090" }
alertmanager : { domain: a.pigsty ,endpoint: "${admin_ip}:9093" }
blackbox : { endpoint: "${admin_ip}:9115" }
loki : { endpoint: "${admin_ip}:3100" }
#minio : { domain: sss.pigsty ,endpoint: "${admin_ip}:9001" ,scheme: https ,websocket: true }
如何配置 Nginx 代理?
Pigsty 自带的配置模板 full.yml
配置文件,作为一个参考,额外对外部暴露了一些 Web 服务:
infra_portal: # domain names and upstream servers
home : { domain: h.pigsty }
grafana : { domain: g.pigsty ,endpoint: "${admin_ip}:3000" , websocket: true }
prometheus : { domain: p.pigsty ,endpoint: "${admin_ip}:9090" }
alertmanager : { domain: a.pigsty ,endpoint: "${admin_ip}:9093" }
blackbox : { endpoint: "${admin_ip}:9115" }
loki : { endpoint: "${admin_ip}:3100" }
minio : { domain: sss.pigsty ,endpoint: "${admin_ip}:9001" ,scheme: https ,websocket: true }
postgrest : { domain: api.pigsty ,endpoint: "127.0.0.1:8884" }
pgadmin : { domain: adm.pigsty ,endpoint: "127.0.0.1:8885" }
pgweb : { domain: cli.pigsty ,endpoint: "127.0.0.1:8886" }
bytebase : { domain: ddl.pigsty ,endpoint: "127.0.0.1:8887" }
jupyter : { domain: lab.pigsty ,endpoint: "127.0.0.1:8888", websocket: true }
gitea : { domain: git.pigsty ,endpoint: "127.0.0.1:8889" }
wiki : { domain: wiki.pigsty ,endpoint: "127.0.0.1:9002" }
noco : { domain: noco.pigsty ,endpoint: "127.0.0.1:9003" }
supa : { domain: supa.pigsty ,endpoint: "10.10.10.10:8000", websocket: true }
这里不难看出,每一条记录都有一个独一无二的 name
作为 key
,一个配置字典作为 value
。在配置字典中,目前有以下四个可用配置项:
endpoint
:必填,指定上游服务的地址,可以是IP:PORT
或者DOMAIN:PORT
。- 在此参数中,可以使用
${admin_ip}
占位符,Pigsty会填入admin_ip
的值。
- 在此参数中,可以使用
domain
:可选,指定代理的域名,如果不填写,则 Nginx 不会对外暴露此服务。- 对于那些需要知道 endpoint 地址,但不想对外暴露的服务(例如 Loki, Blackbox Exporter),可以不填写
domain
。
- 对于那些需要知道 endpoint 地址,但不想对外暴露的服务(例如 Loki, Blackbox Exporter),可以不填写
scheme
:可选,指定转发时的协议(http
/https
),留空则默认使用 http- 对于那些强制要求 HTTPS 访问的上游 Web 服务(例如 MinIO 管理界面),需要指定
scheme: https
。
- 对于那些强制要求 HTTPS 访问的上游 Web 服务(例如 MinIO 管理界面),需要指定
websocket
:可选,指定是否开启 WebSocket,留空则默认关闭。- 类似 Grafana、Jupyter 等需要 WebSocket 的服务需要设置为
true
方能正常工作。
- 类似 Grafana、Jupyter 等需要 WebSocket 的服务需要设置为
因此,如果您需要新增一个通过 Nginx 暴露的 Web 服务,首先需要在 infra_portal
中添加相应地记录,然后执行剧本生效:
./infra.yml -t nginx_config # 重新生成 Nginx 配置文件
./infra.yml -t nginx_cert # 重新签发自签名 HTTPS 证书,囊括新增的域名
./infra.yml -t nginx_launch # 重启 Nginx 以使配置生效(如果您不希望出现中断,手动使用 nginx -s reload)
如果您始终通过 Pigsty 管理 Nginx 配置,也可以直接使用以下任务重新初始化 Nginx 配置:
./infra.yml -t nginx # 直接重新初始化 Nginx 至描述的状态
Nginx相关配置参数位于:配置:INFRA - NGINX
如何通过域名访问 Nginx 代理的服务?
Nginx 通过浏览器设置的 HOST
首部中的域名,来区分不同的服务,所以默认除了软件仓库之外服务,都的您需要通过域名访问。
您可以通过 IP地址 + 端口的方式直接访问这些服务。但我们更推荐您使用域名通过 Nginx 80/443 端口代理访问所有组件。
使用域名访问 Pigsty WebUI 时,您需要配置 DNS 解析,或者修改本地的 /etc/hosts
静态解析文件,有几种典型的方式
-
如果您的服务需要直接暴露在公网上,那么应当通过 DNS 服务商(Cloudflare,Aliyun DNS 等)解析互联网域名。注意,在这种情况下,通常您还需要修改 Pigsty 的
infra_portal
参数,因为默认的*.pigsty
并不是一个适合公网使用的域名。 -
如果您的服务需要在办公网共享访问,那么应当通过内网 DNS 服务商(公司内部 DNS 服务器)解析内网域名,并将其指向 Nginx 服务器所在的 IP。您可以要求网络管理员在公司内部 DNS 服务器中添加相应的解析记录,也可以要求系统的用户手工配置静态的 DNS 解析记录。
-
如果您的服务仅供自己,或少数用户使用(例如 DBA),那么您可以要求这些用户使用静态域名解析记录。在 Linux / MacOS 系统上,修改
/etc/hosts
文件(需要 sudo 权限)或C:\Windows\System32\drivers\etc\hosts
(Windows)文件。
我们建议普通单机用户使用第三种方式,在 使用浏览器访问 Web 系统的机器上 ,添加以下解析记录:
<your_public_ip_address> h.pigsty a.pigsty p.pigsty g.pigsty
这里的 IP 地址是安装 Pigsty 服务的 对外IP地址,然后您就可以在浏览器中通过: http://g.pigsty 这样的域名网址,访问 Pigsty 的子系统了。
其他的 Web 服务与自定义域名,也可以通过同样的方式添加。例如以下是 Pigsty 沙箱 Demo 可能用到的域名解析记录:
10.10.10.10 h.pigsty a.pigsty p.pigsty g.pigsty
10.10.10.10 api.pigsty ddl.pigsty adm.pigsty cli.pigsty lab.pigsty
10.10.10.10 supa.pigsty noco.pigsty odoo.pigsty dify.pigsty
如何使用 HTTPS 访问 Nginx 代理的服务?
Pigsty默认使用自动生成的自签名的 CA 证书为 Nginx 启用 SSL,如果您希望使用 HTTPS 访问这些页面,而不弹窗提示"不安全",通常有三个选择:
- 在您的浏览器或操作系统中信任 Pigsty 自签名的 CA 证书:
files/pki/ca/ca.crt
- 如果您使用 Chrome,可以在提示不安全的窗口键入
thisisunsafe
跳过提示 - 您可以考虑使用 Let’s Encrypt 或其他免费的 CA 证书服务,为 Pigsty Nginx 生成正式的 SSL证书。