我正在开发一个使用 Rust actix_web 的带有简单 Web 服务器的项目。我已经设置了一个 HTTP 服务器,在端口 4000 上运行:
HttpServer::new(move || {
App::new()
.wrap(Logger::default())
.wrap(Cors::default().allow_any_header().supports_credentials())
.service(test_index)
})
.workers(4)
.bind(("0.0.0.0", 4000))?
.run()
.await
我真的只是想弄清楚这里的基础知识。我能够使用 HTTP 很好地访问服务器。
我在 docker-compose 项目中运行它,端口 4000 映射到容器中的端口 4000。现在,我添加了一个 nginx 容器,与 actix 容器在同一网络上运行。它在 nginx 配置中配置了一个指令来处理 SSL / TLS 握手,并将请求传递到 actix 容器。nginx 配置的导入部分在这里:
server {
listen 4000 ssl http2 default_server;
listen [::]:4000 ssl http2 default_server;
include /myserver/serverName.conf;
server_tokens off;
client_body_buffer_size 2048K;
client_max_body_size 2M;
location /myserver/ {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_pass http://myserver:4000/;
}
ssl_certificate /myserver/fullchain.pem;
ssl_certificate_key /myserver/privkey.pem;
ssl_dhparam /myserver/dhparam.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-CCM:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-CCM:DHE-RSA-AES128-CCM8:DHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256;
ssl_ecdh_curve X25519:prime256v1:secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_session_timeout 1d;
ssl_stapling on;
ssl_stapling_verify on;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
}
当我通过 HTTPS 发送请求(使用浏览器或curl)时,我在 actix web 中收到以下错误:
2023-10-29T01:32:01.137392Z TRACE actix_http::h1::dispatcher: parse error invalid Header provided
2023-10-29T01:32:01.137888Z TRACE actix_http::h1::dispatcher: read half closed; start shutdown
2023-10-29T01:32:01.137907Z ERROR actix_http::h1::dispatcher: stream error: request parse error: invalid Header provided
知道我在这里缺少什么吗?使用 HTTPS,如果我已经有 nginx 来完成繁重的工作,我是否需要在 actix 中进行任何额外的配置?
我尝试修改 nginx 中的配置以删除传递到 actix 服务器的标头,但这仍然没有改变任何内容。
我还尝试添加 Cors 配置并允许所有标头。
我计划尝试为 actix 编写一些中间件来打印我根据请求收到的标头。我意识到这个问题有重复,但指导不是很有帮助。