Estou trabalhando em um projeto com um servidor web simples usando Rust actix_web. Configurei um servidor HTTP, rodando na porta 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
Na verdade, estou apenas tentando definir o básico aqui. Consegui acessar o servidor usando HTTP perfeitamente.
Eu tenho isso em execução em um projeto docker-compose com a porta 4000 mapeada para a porta 4000 no contêiner. Agora, adicionei um contêiner nginx, rodando na mesma rede que o contêiner actix. Ele configurou uma diretiva na configuração do nginx para lidar com o handshaking SSL/TLS e passar solicitações para o contêiner actix. As partes de importação da configuração do nginx estão aqui:
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;
}
Quando envio uma solicitação (usando meu navegador ou curl) por HTTPS, recebo o seguinte erro no 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
Alguma ideia do que estou perdendo aqui? Com HTTPS, preciso ter alguma configuração adicional no actix se já tiver o nginx para fazer o trabalho pesado?
Tentei mexer na configuração do nginx para remover os cabeçalhos que passei para o servidor actix, mas isso ainda não mudou nada.
Também tentei adicionar a configuração do Cors e permitir todos os cabeçalhos.
Pretendo tentar escrever algum middleware para o Actix para imprimir os cabeçalhos que recebo em uma solicitação. Percebi que há uma duplicata deste problema, mas a orientação não é muito útil.