Mi servidor proxy se ejecuta en ip A y así es como las personas acceden a mi servicio web. La configuración de nginx redirigirá a una máquina virtual en la ip B.
Para el servidor proxy en IP A, tengo esto en mis sitios disponibles
server {
listen 443;
ssl on;
ssl_certificate nginx.pem;
ssl_certificate_key nginx.key;
client_max_body_size 200M;
server_name localhost 127.0.0.1;
server_name_in_redirect off;
location / {
proxy_pass http://10.10.0.59:80;
proxy_redirect http://10.10.0.59:80/ /;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
rewrite ^(.*) https://$http_host$1 permanent;
server_name localhost 127.0.0.1;
server_name_in_redirect off;
location / {
proxy_pass http://10.10.0.59:80;
proxy_redirect http://10.10.0.59:80/ /;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
El proxy_redirect
fue tomado de cómo hago que nginx reenvíe solicitudes HTTP POST a través de reescribir
Todo lo que llegue a la IP pública llegará a 443 debido a la reescritura. Internamente, estamos reenviando a 80 en la máquina virtual.
Pero cuando ejecuto un script de Python como el siguiente para probar nuestra configuración
import requests
data = {'username': '....', 'password': '.....'}
url = 'http://IP_A/api/service/signup'
res = requests.post(url, data=data, verify=False)
print res
print res.json
print res.status_code
print res.headers
Estoy obteniendo un 405 Method Not Allowed
. En nginx encontramos que cuando llegó al servidor interno, el nginx interno estaba recibiendo una GET
solicitud, aunque en el encabezado original hicimos un POST
(esto se mostró en el script de Python).
Entonces parece que reescribir tiene un problema. ¿Algúna idea de cómo arreglar esto? Cuando comenté la reescritura, seguro que llega a 80, y pasó. Dado que rewrite pudo hablar con nuestro servidor interno, entonces reescribir en sí no tiene ningún problema. Es solo la reescritura reducida POST
a GET
.
¡Gracias!
(Esto también se preguntará en el foro de Nginx porque es un bloqueador crítico ...)
PUT
,POST
,DELETE
,GET
. En mi configuración anterior no tenía este proxy adicional en el frente sirviendo a la multitud. Tenía la misma configuración en el mismo servidor interno (nuestro servidor de prueba). Eso funciona bienGET
. Ninguna configuración del lado del servidor o los encabezados http devueltos no cambiarán eso. Es así por razones históricas (los primeros navegadores se comportaron de esa manera debido a malentendidos y se convirtió en un estándar de facto).POST
se convertiráGET
si se redirige 301 o 302. POST seguirá siendo POST en la redirección de proxy, pero no en la reescritura.If the 307 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.
tanto, la mayoría de los navegadores mostrarán un mensaje de advertencia, ya que para otros clientes HTTP ni siquiera puedo adivinar cuál será su comportamiento.Descubrí que
POST /api/brand
se estaba convirtiendoGET /api/brand
porque la aplicación web que estaba usando (flask-restful
) estaba haciendo una solicitud "no válida". Si uséPOST /api/brand/
(observe el final/
), fue exitoso.fuente