n8n外部访问显示:连接丢失的解决方案

n8n外部访问显示:连接丢失的解决方案

最近在使用n8n做一些自动化的工作。但是出现一个问题:内部访问完全正常,一但通过反向代理外部访问,则出现连接丢失。

我的环境是这样的:在内网一台服务上布置宝塔面板,在宝塔面板中布置了n8n。由于宝塔面板布置的n8n配置较少,所以我使用了自定义配置,增加了一些配置。平时公司使用时通过hosts解析到局域网地址访问,域名不带端口。出了公司访问时就需要带端口访问。

前几天由1.121版本升级到1.225版本时,数据丢失了。启用的自动化流程全部消失了,没启用的流程都在。幸好全是测试用的自动化,所以损失并不大。起因是宝塔面板默认安装的就是sqlite的数据库。我决定重新安装使用了postgres16的数据库。所以,提醒大家,如果想要稳定一点,还是换数据库吧,别用sqlite的了。

好了,书归正传。说回我解决外部访问连接丢失的问题。最终的配置是在n8n的配置文件里和宝塔的反向代理中增加了配置:

n8n的配置文件,这几项配置网上很多网文都讲到了:

environment:
  N8N_SECURE_COOKIE: false
  N8N_PROTOCOL: https
  WEBHOOK_URL: https://${N8N_HOST}
  N8N_EDITOR_BASE_URL: https://${N8N_HOST}
  N8N_DEFAULT_LOCALE: zh-CN
  N8N_PUSH_BACKEND: websocket
  N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: true
  N8N_BLOCK_ENV_ACCESS_IN_NODE: false
  N8N_GIT_NODE_DISABLE_BARE_REPOS: false
  DB_TYPE: postgresdb
  DB_POSTGRESDB_HOST: postgres
  DB_POSTGRESDB_PORT: 5432
  DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
  DB_POSTGRESDB_USER: ${POSTGRES_NON_ROOT_USER}
  DB_POSTGRESDB_PASSWORD: ${POSTGRES_NON_ROOT_PASSWORD}
  GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
  TZ: ${GENERIC_TIMEZONE}

.env文件中的部分配置,加红的部分是我在官方文档中看到的,网上很少有讲到的:

N8N_HOST=n8n.xxxxxx.com:8501
N8N_PROXY_HOPS=1 # 描述n8n服务在几层反向代理之后,1就是1层。

宝塔的反向代理->自定义配置中增加以下配置:

proxy_set_header Origin https://n8n.xxxxxx.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

在以上配置下,重启宝塔代理所属的nginx服务、容器编排重启或重建,外网访问成功解决连接丢失问题。

遗留问题:

宝塔中配置的SSL在外网只能通过http访问,无法通过https访问,提示:
此站点的连接不安全
n8n.xxxxxx.com 发送了无效的响应。
ERR_SSL_PROTOCOL_ERROR