выборка узла nginx прокси 400 неверный запрос - PullRequest
0 голосов
/ 29 мая 2020

Я использовал запрос с прокси nginx для отправки запросов на api.

Так я отправлял запросы

const request = require('request');

request({
    url: 'https://google.com',
    proxy: 'https://my-proxy.com',
    strictSSL: false,
    tunnel: false,
}, (err, response, body) => {
    console.log(body)
});

Все работало отлично

Теперь, поскольку request устарел, я перешел на node-fetch и https-proxy-agent

const fetch = require('node-fetch');
const HttpsProxyAgent = require('https-proxy-agent');

fetch('https://google.com', {
    agent: new HttpsProxyAgent('https://my-proxy.com'),
    method: 'GET'
})
.then(response => {
    console.log(response)
    return response.text()
})
.then(text => {
    console.log(text)
})

И в этом случае результат будет

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.14.0 (Ubuntu)</center>
</body>
</html>

На стороне nginx журналов у меня есть

client sent invalid request while reading client request line, client: xx.xx.xx.xx, server: my-proxy.com, request: "CONNECT google.com:443 HTTP/1.1"

В случае, если я могу решить его, обновив мою nginx config

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

  include       mime.types;
  default_type  application/octet-stream;

  sendfile        on;
  keepalive_timeout  65;

  gzip  on;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

  ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS;

  ssl_prefer_server_ciphers on;

  add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";

  ssl_dhparam dhparams.pem;

  server {
    listen 80;
    server_name my-proxy.com;

    location / {
        resolver 8.8.8.8;
        proxy_pass http://$http_host$uri$is_args$args;
    }
  }

  server {
    listen 443 ssl;
    server_name my-proxy.com;

    ssl_protocols TLSv1.1 TLSv1.2;
    # for ssl https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04

    location / {
        resolver 8.8.8.8;
        proxy_pass https://$http_host$uri$is_args$args;
    }
  }

  server {
    listen 80 default;
    server_name _;

    location / {
      return 403;
    }
  }

}

Я использую certbot для ssl

Я уверен, что проблема исходит от strictSSL, но я не могу найти, как это сделать с node-fetch

1 Ответ

0 голосов
/ 30 мая 2020

Я установил squid прокси.

Реально лучше, чем nginx для такого типа работы

...