Nginx mod_proxy

Proxy

Mod_proxy hvad er det ?

Nginx er normalt en meget hurtig webserver, men den kan ikke selv CGI/PHP som Apache kan. Men den kan også bruges til andre ting som proxy cache service hvis der er mange brugere. Eller du kan bruge den som proxy server til services som sider på andre porte. Jeg vil her vise et eksempel på brug af mod_proxy.

Proxy er en type af server/service som kan bruges til flere ting. En applications entry point eller som ren proxy. Den smarte del af proxy eksempel vist, er når du ønsker adgang til en web service som køre på en anden port og ikke på port 80 eller ssl port 443.

Default overføre to headers i proxy headers Host og Connection. For at ændre default skal du bruge proxy_set_header parameteren i din location.

Her er det en service som køre på port 8000 på localhost.

Alle request til http://minside.dk/ vil blive sendt uændret til localhost på port 8000. Det er det originale request bliver sendt. Hvis der IKKE er en ‘/’ i slutningen af proxy_pass parameteren.

location / {
 proxy_pass http://localhost:8000;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
}

Det er også muligt at bruge proxy_pass http://localhost:8000/uri/ med en path på.

For at gøre det rigtig smart er det muligt at have et https indgang. På den måde har du lavet ssl med en http backend server, rigtig smart.

server {
  server_name minside.dk;
  listen 443 ssl;
  ssl_certificate /etc/ssl/certs/server.crt;
  ssl_certificate_key /etc/ssl/certs/server.key;
  #...
  location / {
    proxy_pass http://localhost:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

Men lige så simpelt det ser ud er der nogle faldgruber.

Simple location virker så længe du skriver en uri til proxy_pass som vist her. En meget vigtig ting her er at der er et ‘/’ efter porten nr her 8000. NGINX vil nu fjerne dit prefix her /foo fra uri og sende resten til backend serveren.

http://minside.dk:80/foo/bar vil blive sent til backend som http://localhost:8000/bar. Det er vigtigt at huske.

location /foo/ {
  proxy_pass http://localhost:8000/;
}

Hvis du ikke vil have den fjerne location stedet skal du bruge.

location /foo/ {
  proxy_pass http://localhost:8000;
}

http://minside.dk:80/foo/bar vil blive sent til backend som http://localhost:8000/foo/bar.

Det er vigtigt at huske.

 

Før version 1.1.12, hvis proxy_pass er brugt UDEN URI, Det orginale request vil blive send over i sted for at ændre den i nogle tilfælde.

 

Valg af udadgående ip adresse.

I alle de eksempler pt har jeg brugt localhost til proxy_pass. Du skal ikke bruge ip adresser eller localhost. Du kan angive et andet domain hvis du vil. Der er virkelig mange muligheder.

location / {
  proxy_pass http://andetdomain.dk:8000;
}

Hvis dette domain resolver til flere adresser bruger nginx round robin.

Man kan også bruge rewrite i location settings.