Proxy Nginx para vários endereços IP para visualização do site do CMS

2

Cartaz pela primeira vez, então fique comigo.

Sou relativamente novo no Nginx, mas consegui descobrir o que precisava ... até agora.

O Nginx v1.0.15 está fazendo proxy para o PHP-FPM v.5.3.10, que está escutando em http://127.0.0.1:9000 . [Bata na madeira] tudo tem funcionado sem problemas em termos de hospedar nosso CMS e muitos sites.

Agora, desenvolvemos nosso CMS e configuramos o Nginx para que cada site compatível tenha um URL de visualização (por exemplo, link ) onde o site pode ser, você adivinhou, visualizado nas situações em que o DNS ainda não resolve para o nosso servidor, etc.

Especificamente, usamos o módulo Map do Nginx ( link ) e uma expressão regular no server_name do bloco server{ } do CMS para 1) pesquisar o nome de domínio principal de um site a partir de seu URL de visualização e, em seguida, 2) encaminhar a solicitação para o domínio principal "correspondido".

A configuração correspondente do Nginx:

map $host $h {
    123.ourcms.com  www.example1.com;
    456.ourcms.com  www.example2.com;
    789.ourcms.com  www.example3.com;
}

e

server {
    listen              [OurCMSIPAddress]:80;
    listen              [OurCMSIPAddress]:443 ssl;
    root                /var/www/ourcms.com;
    server_name         ~^(.*)\.ourcms\.com$;
    ssl_certificate     /etc/nginx/conf.d/ourcms.com.chained.crt;
    ssl_certificate_key /etc/nginx/conf.d/ourcms.com.key;

    location / {
        proxy_pass http://127.0.0.1/;
        proxy_set_header Host $h;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

(Nota: Eu percebo que o regex no server_name deve ser "mais apertado" por razões de segurança e corresponder apenas ao formato do ID do site (ou seja, um UUID no nosso caso).)

Esta configuração funciona para 99% dos nossos sites ... exceto aqueles que têm um endereço IP dedicado para um certificado SSL instalado. Um "502 Bad Gateway" é retornado para estes e não tenho certeza do porquê.

É assim que penso que a configuração atual funciona para quaisquer solicitações que correspondam ao regex (por exemplo, link ):

  1. O Nginx pesquisa o domínio principal do site a partir do mapeamento e
  2. como resultado da diretiva proxy_pass http://127.0.0.1 , passa a solicitação de volta para o próprio Nginx, que
  3. porque a solicitação por proxy tem um nome de host correspondente ao nome de domínio principal do site, por meio da diretiva proxy_set_header Host $h , o Nginx trata a solicitação como se fosse uma solicitação direta para esse nome de host.

Por favor me corrija se eu estiver errado neste entendimento.

Devo estar fazendo proxy para os endereços IP dedicados desses websites? Eu tentei isso, mas não parece funcionar? Existe uma configuração no módulo Proxy que estou faltando?

Obrigado pela ajuda.

MB

    
por Matthew Borgman 02.06.2012 / 18:37

2 respostas

0

Para qualquer um que possa se deparar com isso, as soluções foram as seguintes configurações do Nginx:

# Map preview URLs to shared or dedicated IP addresses
map $host $i {
        default         [IP for Shared VHosts];

        123.ourcms.com  [Dedicated IP Address 1];   # www.example1.com;
        456.ourcms.com  [Dedicated IP Address 2];   # www.example2.com;
        789.ourcms.com  [Dedicated IP Address 3];   # www.example3.com;
}

# Map preview URLS to appropriate hostname
map $host $h {

        123.ourcms.com   www.example1.com;
        456.ourcms.com   www.example2.com;
        789.ourcms.com   www.example3.com;
}

...

# Configuration for "preview" server 
server {
    listen                  [OurCMSIPAddress]:80;
    listen                  [OurCMSIPAddress]:443 ssl;
    error_log               /var/log/nginx/error-ourcms.com.log debug;
    root                    /var/www/ourcms.com;
    server_name             ~^(.*)\.ourcms\.com$;
    ssl_certificate         /etc/nginx/conf.d/ourcms.com.chained.crt;
    ssl_certificate_key     /etc/nginx/conf.d/ourcms.com.key;

    location / {
        proxy_pass http://$i;
        proxy_set_header Host $h;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

O truque, e eu acho que o @MarkStosberg estava se referindo a isso e eu não entendi, foi procurar o endereço IP e para o site pré-visualizado. Além disso, os blocos de servidores de cada host virtual precisavam conter listen [SharedIPForVhosts]:80 e não apenas listen *:80 .

    
por 17.06.2012 / 19:10
0

except those that have a dedicated IP address for an installed SSL certificate.

Parece que você está ouvindo apenas um endereço IP. Você também precisará de diretivas 'listen' para os IPs adicionais para os domínios SSL. A menos que você tenha um certificado SSL curinga, eu acho que você precisaria de uma {} definição de servidor para cada um desses hosts.

Aqui está um padrão relacionado que eu uso e que pode ser útil se você estiver tentando evitar a necessidade de manter suas configurações para seus domínios SSL Nginx completamente à mão:

Parte da configuração do Nginx é armazenada no controle de origem como um modelo. O script "init" para o Nginx foi modificado para que, toda vez que o Nginx for recarregado ou reiniciado, um script Perl seja escaneado e preencha as variáveis de modelo, dependendo do ambiente (alfa, beta, produção, etc). Um novo arquivo de texto simples é gravado e o Nginx inclui o modelo "renderizado" como um arquivo de inclusão.

Isso permite novas possibilidades de automação e DRY. Talvez isso ajude em sua situação.

    
por 02.06.2012 / 19:18

Tags