Nginx: Configurações básicas de VirtualHost e ProxyReverso

O Nginx é um servidor web, Proxy reverso, Proxy balanceador de carga, com um performance muito maior se comparado com outros servidores WEB como o APACHE. O Nginx (pronuncia-se “enginex”) é um servidor de alta performance, gratuito e open-source, bem como um servidor proxy para IMAP/POP3.

Escrito em C por Igor Sysoev em 2002, com sua primeira versão pública liberada em 2004. O Nginx é conhecido por sua estabilidade, rico conjunto de características/facilidades, simples configuração e baixo consumo de recursos.

Nesse paper será abordado a instalação, configuração de virtual hosts e proxy reverso, tudo muito básico, tudo muito simples.

Sistema:

root@nginx:/etc/nginx# lsb_release -rcd
Description:	Debian GNU/Linux 9.4 (stretch)
Release:	9.4
Codename:	stretch
Instalação:

    sudo apt-get update
    sudo apt-get install nginx

Verificando se o serviço está habilitado na inicialização do sistema:


root@nginx:/etc/nginx# systemctl is-enabled nginx
enabled

Caso não esteja enabled, vamos habilitar o serviço na inicialização:


root@nginx:/etc/nginx# systemctl enable nginx

Verificando se o serviço está escutando na porta 80:


root@nginx:/etc/nginx# netstat -tlnp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      550/nginx: master p 
tcp6       0      0 :::80                   :::*                    LISTEN      550/nginx: master p 

O resultado do comando acima dá pra notar que ele está escutando na porta 80, tanto para ipv4 e ipv6, isso signifca que ele já está pronto para atender requisições HTTP.

Manipulação do Serviço:

Para manipular o serviço do nginx, pode-se utilizar o comando nginx, segue uma visão do help do comando:


root@nginx:/etc/nginx# nginx -h
nginx version: nginx/1.10.3
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -T            : test configuration, dump it and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /usr/share/nginx/)
  -c filename   : set configuration file (default: /etc/nginx/nginx.conf)
  -g directives : set global directives out of configuration file

Então por exemplo, para recarregar o serviço:


nginx -s reload

Para parar o serviço:


nginx -s stop

Uma outra opção que tem mais opções seria utilizar o systemctl:


systemctl stop nginx
systemctl start nginx
systemctl reload nginx
systemctl restart nginx
Configuração:

As diretivas no arquivo de configuração podem ser globais ou estar num bloco, entre chaves, de modo a valer apenas para o módulo do bloco. Não é necessário escrever todas as configurações dentro do arquivo principal, temos a diretiva include que carrega outros arquivos de configuração, deixando assim mais organizado e facilitando futuras manutenções.

Arquivos de Configuração:

O diretório de configuração do nginx é /etc/nginx. O arquivo de configuração principal é nginx.conf, segue o diretório de uma instalação default do nginx:


drwxr-xr-x 2 root root 4096 jun 13 20:59 conf.d
-rw-r--r-- 1 root root 1077 jul 12  2017 fastcgi.conf
-rw-r--r-- 1 root root 1007 jul 12  2017 fastcgi_params
-rw-r--r-- 1 root root 2837 jul 12  2017 koi-utf
-rw-r--r-- 1 root root 2223 jul 12  2017 koi-win
-rw-r--r-- 1 root root 3957 jul 12  2017 mime.types
drwxr-xr-x 2 root root 4096 jul 12  2017 modules-available
drwxr-xr-x 2 root root 4096 jun 13 20:11 modules-enabled
-rw-r--r-- 1 root root 1673 jun 13 21:03 nginx.conf
-rw-r--r-- 1 root root  180 jul 12  2017 proxy_params
-rw-r--r-- 1 root root  636 jul 12  2017 scgi_params
drwxr-xr-x 2 root root 4096 jun 13 21:04 sites-available
drwxr-xr-x 2 root root 4096 jun 13 21:05 sites-enabled
drwxr-xr-x 2 root root 4096 jun 13 20:11 snippets
-rw-r--r-- 1 root root  664 jul 12  2017 uwsgi_params
-rw-r--r-- 1 root root 3071 jul 12  2017 win-utf

Uma breve explicação sobre alguns arquivos de configuração do nginx:

  • /etc/nginx/nginx.conf: O arquivo principal de configuração do Nginx. Ele pode ser modificado para realizar alterações na configuração global do Nginx.
  • /etc/nginx/sites-available: O diretório onde “blocos de servidor” por site podem ser armazenados. O Nginx não utilizará os arquivos de configuração encontrados nesse diretório a menos que eles estejam vinculados ao diretório sites-enabled (veja abaixo). Tipicamente, toda configuração de blocos de servidor é feita nesse diretório, e depois habilitada vinculando-se ao outro diretório.
  • /etc/nginx/sites-enabled/: O diretório onde “blocos de servidor” habilitados por site são armazenados. Tipicamente, estes são criados através da vinculação aos arquivos de configuração encontrados no diretório sites-available.
  • /etc/nginx/snippets: Esse diretório contém trechos de configuração que podem ser incluídos em outras partes da configuração do Nginx. Segmentos de configuração potencialmente repetíveis são bons candidatos para refatoração em trechos.

Arquivo de configuração nginx.conf padrão da instalação:


user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
	worker_connections 768;
}
http {
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	include /etc/nginx/mime.types;
	default_type application/octet-stream;
	ssl_prefer_server_ciphers on;
	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;
	gzip on;
	gzip_disable "msie6";
	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

Explicando algumas das diretivas anteriores:

O bloco http contém diretivas que irão fazer o handling de tráfego web. Essa diretiva é referenciada como global porquê é passada para todos os websites configurados no servidor.

  • user www-data; -> Define o usuário que irá executar o Nginx.
  • worker_processes 4; -> Esta diretiva é responsável por deixar o nosso servidor virtual ciênte de que muitos processos são gastos de uma vez
  • pid /run/nginx.pid; -> define o arquivo que irá armazenar o PID do processo principal.
  • events -> fornece a configuração em que as diretivas que afetam o processamento de conexão são especificados. Neste caso, o worker_connections 768 define o número máximo de conexões simultâneas que podem ser abertas por um processo de trabalho (768 por padrão). Perceba que ainda dentro de events temos a diretiva multi_accept on; que por padrão vem comentado. Isto é, um processo vai aceitar uma nova conexão de cada vez. Caso contrário, um processo iria aceitar todas as novas conexões ao mesmo tempo.
  • sendfile on; -> ativo, não bloqueia a saída e entrada do disco informando que os dados não estão na memória. Em seguida, o nginx inicia uma carga de dados assíncronos através da leitura de um byte.
  • tcp_nopush on; -> só é usada quando o sendfile também está ativo. Pois, esta diretiva é reponsável por enviar o cabeçalho de resposta de pacotes para o sistema operacional.
  • tcp_nodelay on; -> só pode estar ativa quando um há transferência para o estado keep-alive.
  • keepalive_timeout -> define um limite de tempo durante o qual uma conexão de cliente keep-alive vai ficar aberta no servidor. O valor zero desativa conexões keep-alive do cliente.
  • types_hash_max_size -> define o tamanho máximo das hash tables.No caso, o padrão é 2048.
  • server_tokens off; -> comentada por padrão, serve para emitir mensagens de erro ao servidor. Esta diretiva é extremamente importante quando não se sabe bem a causa de uma suposta falha envolvendo o nginx.
  • server_names_hash_bucket_size; -> comentada por padrão, define o tamanho de buckets para as tabelas de nome de hash para servidores. O valor padrão depende do tamanho do cache do processador.
Logs
  • /var/log/nginx/access.log: Toda requisição ao seu servidor web é gravada nesse arquivo de log a menos que o Nginx esteja configurado para fazer o contrário.
  • /var/log/nginx/error.log: Quaisquer erros do Nginx serão gravados nesse log.
Configurando Virtualhosts

Assim como no Apache2, é possível configurar virtualhosts. Virtual hosts são basicamente vários websites diferentes hospedados no mesmo website, geralmente a diferenciação de uma requisição para um website acontece baseada no dominio destino da requisição. Então você consegue colocar vários websites de dominios diferentes no mesmo servidor.

Se você reparar no arquivo de configuração, existe um include que carrega todos os arquivos de configuração no diretório /etc/nginx/sites-enabled/


	include /etc/nginx/sites-enabled/*;

Então é basicamente colocar o arquivo de configuração do website nesse diretório, criar o diretório do website e fazer toda a mágica.

Criando os diretórios dos websites:

Vamos começar criando os diretórios dos websites, por padrão e boas práticas nas distribuições debian, vamos colocar os websites no diretório/var/www/, então vamos criar dois websites, então são dois diretórios:


root@nginx:/etc/nginx# mkdir /var/www/bad
root@nginx:/etc/nginx# mkdir /var/www/admin

Por questões de segurança, vamos definir um usuário para cada diretório, primeiro vamos criar os usuários:


useradd -s /bin/false -d /var/www/bad/ -c "User for Bad website" bad
useradd -s /bin/false -d /var/www/admin/ -c "User for admin website" admin

Agora vamos definir o owner e group dos respectivos diretórios:


root@nginx:/etc/nginx# chown bad.bad /var/www/bad/ -R
root@nginx:/etc/nginx# chown admin.admin /var/www/admin/ -R

Vamos definir as permissões dos diretórios:


sudo chmod -R 755 /var/www

Vamos popular os diretórios com um index.html pra ele exibir algo quando realizarmos a conexão:


echo 'Hello, im bad' > /var/www/bad/index.html
echo 'Hello, im admin' > /var/www/admin/index.html

Feito isso, estamos prontos para prosseguir com a configuração do nginx, vamos começar pelo dominio bad, crie um arquivo de configuração no diretório /etc/nginx/sites-available e posteriormente linkamos no diretório /etc/nginx/sites-enabled:
Exemplo de admin.conf:


server{
	listen 80;
	root /var/www/admin;
	server_name admin.freak;
	index index.html;
}

Exemplo de bad.conf:


server {
	listen 80;
	root /var/www/bad;
	index index.html
	server_name bad.freak;
}

Criando os links simbolicos para habilitar os websites:


root@nginx:/etc/nginx# ln -s /etc/nginx/sites-available/bad.conf /etc/nginx/sites-enabled/
root@nginx:/etc/nginx# ln -s /etc/nginx/sites-available/admin.conf /etc/nginx/sites-enabled/

Verificando se as configurações estão OK:


root@nginx:/etc/nginx# nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Para testar o acesso, você provavelmente vai precisar alterar seu arquivo /etc/hosts porquê os dominios não existem na Internet, e para acessar, é necessário utilizar o nome do dominio. Então no /etc/hosts você consegue vincular o dominio à um endereço IP.


172.24.4.3	admin.freak
172.24.4.3	bad.freak

Testando os acessos:


user@Hope:~$ curl bad.freak
Hello, i m bad
user@Hope:~$ curl admin.freak
Hello, im admin

Bom, então temos os dois websites configurados e respondendo pelo dominio, uma configuração bem simples de virtualhosts no nginx.

Configurando Proxy Reverso

Administradores de servidores HTTP que querem usufruir dos benefícios do Nginx mas não querem ou não podem abrir mão do Apache têm a alternativa de implementar o Nginx como proxy reverso. Nessa modalidade, o Nginx responde a todas as solicitações HTTP do cliente. Quando é solicitado algum conteúdo dinâmico, o Nginx encaminha a solicitação HTTP para o apache, recebe o conteúdo da resposta e envia para o cliente.

A configuração de um proxy reverso é retida dentro do sub-bloco location {} localizada no bloco server {}. Então vamos configurar um proxy reverso simples, que simplesmente redireciona o tráfego para um servidor apache2.


	server{
		listen 80;
		root /var/www/;
		index index.php index.html index.htm;
		server_name fuckit;
		location / {
		        proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $remote_addr;
			proxy_set_header Host $host;
			proxy_pass http://10.0.0.10;
		}
	}

No exemplo acima, foi utilizado a configuração básica do bloco server, a diferença foi o bloco location, que indicou que a raiz do website, no caso entra no bloco e faz o parsing substituindo alguns parametros pro servidor 10.0.0.10, que seria o servidor apache2 aqui na rede local.

Bom, é isso, configuração básica sobre Nginx, uma overview minimalista. Eu escrevi a um tempo atrás outro paper sobre loadbalance e proxy reverso usando nginx, você pode acessar nesse link.

Fontes:

https://www.digitalocean.com/community/tutorials/como-instalar-o-nginx-no-ubuntu-16-04-pt
http://blog.ti.lemaf.ufla.br/2016/07/29/desvendando-o-nginx-parte-1/
https://www.linode.com/docs/web-servers/nginx/how-to-configure-nginx/

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.