我有一个示例应用程序,可以在没有nginx的情况下在本地正确保护其余的api.现在,当我把它放在nginx代理后面的生产中时,它不起作用.没有错误.它允许所有请求.
使用ssl的前端服务器是https://frontend.com
使用ssl的后端服务器是https://backend.com
Keycloak代理转发是正确的
前端服务器(9000上的节点服务器)< - > NGINX < - > Keycloak(在8180上运行)
nginx文件样本
upstream keycloak_server {
server localhost:8180;
}
upstream node_server {
server localhost:9000;
}
location /auth/ {
proxy_pass http://keycloak_server;
proxy_http_version 1.1;
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_set_header X-Forwarded-Proto $scheme;
}
location / {
proxy_pass http://node_server;
proxy_http_version 1.1;
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_set_header X-Forwarded-Proto $scheme;
}
Run Code Online (Sandbox Code Playgroud)
前端服务器使用Angular调用后端api.REST api调用看起来像https://backend.com/callTest
后端服务器(在tomcat上运行)< - > NGINX < - > Spring Boot(带keycloak)
nginx样本 …
我正在尝试使用Nginx配置实现代理
这个想法是让一个http服务器托管我的网站(我的SPA)。并使我的http服务器上的一条路由指向另一个api。
这是我下面的nginw配置文件
client_max_body_size 100M;
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
location ^~ /proxyapi/ {
proxy_read_timeout 180s;
proxy_send_timeout 180s;
proxy_pass http://localhost:5000/;
}
location ~* /static/* {
try_files $uri =404;
expires 1y;
access_log off;
add_header Cache-Control "public";
}
# Any route that doesn't have a file extension (e.g. /devices)
location / {
try_files $uri $uri/ /index.html;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = …Run Code Online (Sandbox Code Playgroud) 我NodeJS在NGINXWeb 服务器上运行一个应用程序。我可以通过iframe其他网站访问我的应用程序中的所有 URL 。
这是我的NGINXconf:
proxy_hide_header X-Frame-Options;
Run Code Online (Sandbox Code Playgroud)
如何限制 iframe 只允许 1 个 URL 而不是所有 URL?
另外,我如何只允许少数域通过访问iframe?
可以NGINX通过NodeJS代码完成还是应该通过代码处理?
我们有一个要求,证书密钥只需要加载到 Nginx 内存中。也就是说,将其保存在本地 FS 中不是一个选项。此外,只有在主动查找证书密钥(使用证书向虚拟服务器发出请求)时,我们才需要证书密钥出现在 Nginx 内存中。当没有请求时,证书密钥应从内存中刷新,并通过客户端身份验证(Nginx 作为客户端向 KMS 进行身份验证)按需从 KMS(密钥管理服务器)重新加载。如果您对此类或类似的要求有深入了解,请提供指示。
我在这个 Nginx博客中提到了最佳实践。然而,并非我们的所有要求都得到满足。有几个问题:
我正在尝试让 nginx 代理管理器(在 docker 容器中运行)连接到另一个打开了端口 8080 的 docker 容器。当我设置代理连接到192.168.0.29:8080主机的IP地址,但它不起作用时,浏览器只是说该站点没有发送任何数据。
我尝试使用其他服务(不在 docker 容器内运行)设置反向代理,它们工作完美。所以,我得出的结论是,问题出在 docker 容器上。
首先,我尝试用容器的地址(显示在 portainer 中)替换 ip 地址,该地址显示为172.17.0.2. 但是,那没有用。我可以确认两个容器都在同一个网络中bridge。
我在这里、Stack Overflow 或其他地方都找不到这个问题的任何解决方案。希望有足够的数据来解决这个问题。提前致谢!
编辑:arp -na从容器内
运行会给出以下输出:
[root@docker-00244f7ab2cc:/app]# arp -na
? (172.17.0.1) at 02:42:d1:fc:fc:6b [ether] on eth0
Run Code Online (Sandbox Code Playgroud) 有人熟悉 nginx 吗?我试图在流块中以有条件的方式启用 proxy_protocol,即对于某些端点,我希望添加代理协议标头。对于其他人我不想添加它。查看文档,proxy_protocol 无法获取变量(尝试了 map 指令) 关于如何实现此目的有什么建议吗?在这里添加了我的 nginx 配置。 http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_protocol
这是有问题的部分proxy_protocol $proxy_state;
map $ssl_preread_server_name $proxy_state{
default on;
facebook.com off;
}
server {
listen 8443 ;
resolver 8.8.8.8 ipv6=off;
proxy_pass $server;
proxy_protocol $proxy_state;
ssl_preread on;
}
Run Code Online (Sandbox Code Playgroud)
以下是完整的配置
error_log logs/error.log;
events {
}
stream {
map $ssl_preread_server_name $server {
# default 127.0.0.1:8080;
default unix:/var/run/nginx.sock;
include /home/user/allow_url_list;
}
map $ssl_preread_server_name $proxy_state{
default on;
facebook.com off;
}
server {
listen 8443 ;
resolver 8.8.8.8 ipv6=off;
proxy_pass $server;
proxy_protocol $proxy_state;
ssl_preread on;
} …Run Code Online (Sandbox Code Playgroud) 我在 docker 环境中使用 gitea 版本控制系统。使用的gitea是无根类型的镜像。
\nhttp 端口映射为 \xe2\x80\x9c8084:3000\xe2\x80\x9d,ssh 端口映射为 \xe2\x80\x9c2224:2222\xe2\x80\x9d。
\n我在 Linux 主机上生成了密钥,并将生成的公钥添加到了我的 Gitea 帐户中。
\n1.测试环境
\n后来我创建了 ssh 配置文件nano /home/campos/.ssh/config :
Host localhost\n HostName localhost\n User git\n Port 2224\n IdentityFile ~/.ssh/id_rsa\nRun Code Online (Sandbox Code Playgroud)\n完成设置后,我创建了 myRepo 存储库并克隆了它。
\n为了执行克隆,我将 url 从 更改ssh://git@localhost:2224/campos/myRepo.git为git@localhost:/campos/myRepo.git
要克隆存储库,我输入:git clone git@localhost:/campos/myRepo.git
这很完美!
\n2.生产环境
\n但是,在定义反向代理和域名时,无法克隆存储库。
\n在执行克隆之前,我更改了ssh配置文件:
\nHost gitea.domain.com\n HostName gitea.domain.com\n User git\n Port 2224\n IdentityFile ~/.ssh/id_rsa\nRun Code Online (Sandbox Code Playgroud)\n然后我再次尝试克隆存储库:
\ngit clone git@gitea.domain.com:/campos/myRepo.git
我的域名来自domains.google.com. 假设它是mydomainname.com
我将 DNS 设置为我想要的 IP 地址。在我的路由器上,我将端口转发80到我的计算机80和443我的计算机的443. 为了确认它是公开可用的,我使用了不同的连接和设备,并且可以mydomainname.com毫无问题地访问。
然后我使用了他们网站docker-compose.yml中描述的文件。
当前latest指向v2.9.18
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '443:443'
- '81:81'
volumes:
- ./data/:/data
- ./letsencrypt:/etc/letsencrypt
Run Code Online (Sandbox Code Playgroud)
现在,在 SSL 证书选项卡上,添加 SSL 证书时,测试服务器可访问性始终失败,并出现以下错误:
mydomainname.com: There is no server available at this domain.
Please make sure your domain exists and points to the IP where your NPM
instance is running …Run Code Online (Sandbox Code Playgroud) 目前,我可以访问: https://files.mydomain.com/files。即使我去https://files.mydomain.com,它也会自动重定向到https://files.mydomain.com/files成功。
相反,我希望 NGINX 自动重写https://files.mydomain.com/files->https://files.mydomain.com
我当前的 NGINX 代码:
http {
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;
}
server {
listen 80;
server_name files.mydomain.com;
location / {
return 301 https://files.mydomain.com$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name files.mydomain.com;
client_max_body_size 0;
location / {
return 301 https://$host/files;
}
location /files {
proxy_pass http://localhost:89;
}
}
#Root Domain
server {
listen 443 ssl http2;
listen [::]:443 …Run Code Online (Sandbox Code Playgroud) 我已经将ABP框架部署在Kubernetes集群中。
存在以下部署:
因此,AuthServer、HttpApi.Host 正在侦听端口 80 / http,而 nginx 正在侦听 https。配置/Helm 值如下:
use-forwarded-headers: "true"
use-proxy-protocol: "true"
use-gzip: "true"
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,部署后我可以进入 Swagger 并授权:

通过检查 AuthServer 日志可以确认这一点:
[19:12:39 INF] CORS policy execution successful.
[19:12:39 INF] The request URI matched a server endpoint: Token.
[19:12:39 INF] The token request was successfully extracted: {
"grant_type": "authorization_code",
"code": "[redacted]",
"client_id": "foobar_Swagger",
"redirect_uri": "https://api.staging.foobar.io/swagger/oauth2-redirect.html"
}.
[19:12:39 INF] The token request was successfully validated.
Run Code Online (Sandbox Code Playgroud)
但是,现在我想使用 Swagger 来确保与端点的连接正常工作,因此我尝试第一个 GET 端点:

如您所见,有 500 …
nginx ×8
nginx-config ×3
abp ×1
docker ×1
gitea ×1
iframe ×1
jboss ×1
keycloak ×1
kubernetes ×1
lets-encrypt ×1
node.js ×1
openiddict ×1
spring-boot ×1
ssl ×1