我在 Docker 容器中部署了带有 Daphne (ASGI) 的 Django 4 应用程序。我前面使用Caddy作为反向代理。它有效,但我无法填写任何表格,因为 CSRF 保护启动。例如,没有管理员登录。
我目前可以通过两种方式访问管理界面:
选项 1 有效。我可以登录管理界面,就像在本地运行开发服务器一样。一切都按预期进行。
但是,选项 2(caddy 反向代理)不起作用。我可以访问 Django 并加载页面,但任何表单提交都将被阻止,因为 CSRF 保护启动。
CSRF verification failed. Request aborted.
Reason given for failure:
Origin checking failed - https://<mydomain.com> does not match any trusted origins.
Run Code Online (Sandbox Code Playgroud)
我的 Caddyfile 包含以下内容:
<mydomain.com> {
reverse_proxy localhost:8088
}
Run Code Online (Sandbox Code Playgroud)
localhost:8088 是我的 docker 容器公开的端口。
为了消除潜在问题,我在配置文件中将以下内容设置为 false:
SECURE_SSL_REDIRECT(导致重定向循环,可能与反向代理有关)SESSION_COOKIE_SECURE(我宁愿将其设置为 True,但目前我不知道)CSRF_COOKIE_SECURE(同样的评论)我在网上能找到的唯一 Django-Caddy 示例已经过时,并且引用的是旧版本的 Caddy 和/或 Django。Django 与 Daphne 一起部署在 …
我使用mod_proxy(Apache2)监听127.0.0.1:80配置了一个反向代理,它将所有请求代理到127.0.0.1:8080
所以我已经配置了mod_proxy:
ProxyPreserveHost On
ProxyRequests Off
ProxyPass /foo http://127.0.0.1:8080
ProxyPassReverse /foo http://127.0.0.1:8080
Run Code Online (Sandbox Code Playgroud)
当我请求时http://127.0.0.1/foo/bar,侦听127.0.0.1:8080的应用程序从mod_proxy获取以下请求URL:
相反,我想保留原始请求,并得到:
我怎样才能做到这一点?
我试图使用NginX作为几个IIS服务器的反向代理.目标是让NginX从IIS/Apache服务器进入缓存静态项目,如CSS/JS/Images.我也试图让NginX使用perl模块自动缩小js/css文件.
我在这里找到了一个缩小的示例脚本:
http://petermolnar.eu/linux-tech-coding/nginx-perl-minify-css-js/
使用脚本一切正常,除了反向代理中断.
问题:
任何帮助将不胜感激.
到目前为止,这是我的网站启用/默认.
server {
location / {
proxy_pass http://mywebsite.com;
proxy_set_header Host $host;
proxy_cache STATIC;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating
http_500 http_502 http_503 http_504;
}
location @minify {
perl Minify::minify_handler;
}
location ~ \.css$ {
try_files $uri.min.css @minify;
}
location /*.js {
expires 30d;
}
}
Run Code Online (Sandbox Code Playgroud) 在nginx中使用add_header指令时,标头将添加到来自源服务器的响应中.
假设源服务器返回cache-control public,max-age = 60.但是在nginx反向代理位置,您可以设置如下:
add_header cache-control public,max-age = 10
这究竟是做什么的?我可以想到两种不同的场景:
1)Nginx尊重来自源服务器的缓存控制头,并将内容存储在其缓存中,有效期为60秒.然后使用覆盖的标头传递响应,导致客户端将资源存储在其缓存中,到期时间为10秒.
要么..
2)Nginx首先覆盖响应头,然后解释它们.它以10秒的有效期存储资源,并将响应传递给客户端,客户端也将其缓存,有效期为10秒.
我有一个WordPress博客在反向代理(Apache)后面运行.
httpd.vhosts.conf:
<VirtualHost *:80>
ServerName blog.domain.com:80
ServerAlias www.blog.domain.com
ProxyPass / http://192.168.101.11/blog/
ProxyPassReverse / http://192.168.101.11/blog/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
该博客工作正常,我可以登录作为管理员,但是当试图保存设置或删除插件(和wp_redirect发生),我重定向到登录页面,因为WordPress的显然没有找到/接受会话cookie,以及该行动未完成.
因此,我添加了这一行:
ProxyPassReverseCookiePath / http://192.168.101.11/blog/
Run Code Online (Sandbox Code Playgroud)
(请参阅Apache代理cookie仅适用于第一个应用程序)
这似乎解决了这个问题.但是,我现在注意到,使用此设置,登录根本不起作用,但仅限于Safari和IE(在Opera,Firefox,Chrome中工作得很好).我只是再次被重定向到登录页面.
一些其他信息:
wordpress_test_cookie管理部分根本不是在Safari中创建的,只是类似的"__uc*"等等(对于博客本身).如果没有ProxyPassReverseCookiePath-entry,他们正在创建的.WP-config.php文件
define('COOKIE_DOMAIN', '.blog.domain.com');
define('COOKIEPATH', '/');
define('SITECOOKIEPATH', '/');
define('ADMIN_COOKIE_PATH', SITECOOKIEPATH . 'wp-admin' );
Run Code Online (Sandbox Code Playgroud) 给定一个大致像这样的Nginx配置:
upstream A {
server aa:8080;
}
upstream B {
server bb:8080;
}
server {
listen 80;
location @backendA {
proxy_pass http://A/;
}
location @backendB {
proxy_pass http://B/;
}
location / {
# This doesn't work. :)
try_files @backendA @backendB =404;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我希望Nginx尝试上游A,如果A返回404,则尝试上游B,如果失败,则将404返回给客户端。try_files对文件系统位置执行此操作,然后可以回退到命名位置,但不适用于多个命名位置。有什么会起作用的吗?
背景:我有一个Django Web应用程序(A上游)和一个Apache / Wordpress实例(B上游),我想在同一URL命名空间中共存,以获得更简单的Wordpress URL:mysite.com/hello-world/而不是mysite.com/blog/hello-world/。
我可以在Nginx位置复制我的Django URL,并使用wordpress作为一个包罗万象的东西:
location /something-django-handles/ {
proxy_pass http://A/;
}
location /something-else-django-handles/ {
proxy_pass http://A/;
}
location / {
proxy_pass http://B/;
} …Run Code Online (Sandbox Code Playgroud) 我在osx上使用docker via boot2docker.
我有2个主机:site1.loc.test.com并site2.loc.test.com指向docker host的ip地址.
两者都应该通过80和443端口可用.
所以我jwilder/nginx-proxy用于反向代理目的.
但事实上,当我docker-compose每次尝试通过80端口打开时,我都会运行所有这些,我会重定向到443 (301 Moved Permanently).
可能是我错过了一些jwilder/nginx-proxy配置?
proxy:
image: jwilder/nginx-proxy
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- certs:/etc/nginx/certs
ports:
- "80:80"
- "443:443"
site1:
image: httpd:2.4
volumes:
- site1:/usr/local/apache2/htdocs
environment:
VIRTUAL_HOST: site1.loc.test.com
expose:
- "80"
site2:
image: httpd:2.4
volumes:
- site2:/usr/local/apache2/htdocs
environment:
VIRTUAL_HOST: site2.loc.test.com
expose:
- "80"
Run Code Online (Sandbox Code Playgroud) https reverse-proxy docker docker-compose jwilder-nginx-proxy
我的服务器托管在Bluehost(Apache)中,证书工作正常.现在,我正在使用Google Cloud在NodeJS上的多个页面上使用proxy_pass.我正在尝试配置SSL,但我遇到了问题.我正在寻找类似的问题,但它仍然显示相同的错误.我在此链接后创建了密钥文件
/var/log/nginx/error.log:
2015/07/08 10:47:20 [emerg] 2950#0:SL_CTX_use_PrivateKey_file("/ etc/nginx/ssl/domain_com/domain_com.key")失败(SSL:错误:0B080074:x509证书例程:X509_check_private_key:键值不匹配)
当我戴上控制台时:
openssl rsa -noout -modulus -in domain_com.key告诉我这个:
Modulus=D484DD1......512 characters in total......5A8F3DEF999005F
Run Code Online (Sandbox Code Playgroud)
openssl x509 -noout -modulus -in ssl-bundle.crt:
Modulus=B1E3B0A.......512 characters in total......AFC79424BE139
Run Code Online (Sandbox Code Playgroud)
这是我的Nginx设置:
server {
listen 443;
server_name www.domain.com;
ssl_certificate /etc/nginx/ssl/domain_com/ssl-bundle.crt;
ssl_certificate_key /etc/nginx/ssl/domain_com/domain_com.key;
ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/domain_com.access.log;
location / {
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;
proxy_pass http://localhost:8086;
proxy_read_timeout …Run Code Online (Sandbox Code Playgroud) ssl reverse-proxy nginx google-compute-engine google-cloud-platform
我在我的ngnix后面运行gitlab.
服务器1(反向代理):启用了https的Ngnix,以及/ git的配置:
location ^~ /git/ {
proxy_pass http://134.103.176.101:80;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Ssl on;
}
Run Code Online (Sandbox Code Playgroud)
如果我不改变我的gitlab设置上的任何内容,这将有效但由于外部http请求不安全,如:
'http://www.gravatar.com/avatar/c1ca2b6e2cd20fda9d215fe429335e0e?s=120&d=identicon'. This content should also be served over HTTPS.
Run Code Online (Sandbox Code Playgroud)
所以,如果我更改隐藏服务器2(http gitlab)上的gitlab配置:
external_url 'https://myurl'
nginx['listen_https'] = false
Run Code Online (Sandbox Code Playgroud)
正如文件中所述.我将得到一个错误的网关错误502.没有加载页面.
我能做什么 ?
编辑:通过设置黑客攻击:
gitlab_rails['gravatar_plain_url'] = 'https://www.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon'
Run Code Online (Sandbox Code Playgroud)
https ...这工作但不是一个干净的解决方案.(克隆网址仍然是http://)
实际状态:
http://www.example.com/mypage apache http:好的!
https://www.example.com/mypage apache https:好!
http://www.example.com:8000 节点http:好!
https://www.example.com:8000 节点https:不起作用(仍然)
我试图将节点程序修改为
var express = require('express');
var app = express();
var https = require('https');
var fs = require('fs');
var server = http.createServer(app);
https.createServer({
key: fs.readFileSync("/etc/letsencrypt/live/www.example.com/privkey.pem"),
cert: fs.readFileSync("/etc/letsencrypt/live/www.example.com/fullchain.pem"),
ca: fs.readFileSync("/etc/letsencrypt/live/www.example.com/chain.pem")
}, app).listen(443);
Run Code Online (Sandbox Code Playgroud)
这里的明显问题是apache已经侦听端口443,然后
Error: listen EADDRINUSE :::443
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以使用Apache 443为节点提供SSL服务?