LPI-2 202-450 Topico 208.4
Implementação do Nginx
Índice
208.4 Implementação do Nginx como um servidor web e proxy reverso - Objetivos
Peso 2
O candidato deve ser capaz de instalar e configurar um servidor de proxy Nginx, incluindo configuração básica do Nginx como um servidor HTTP. Conhecimentos-chave:
- Nginx;
- Proxy reverso;
- Servidor Web básico.
Lista parcial dos arquivos, termos e ferramentas utilizados:
- /etc/nginx;
- nginx
208.4 Implementação do Nginx como um servidor web e proxy reverso - Conteúdo
O NGINX (pronuncia-se engine x) é um poderoso web server e proxy reverso com uma arquitetura baseada em eventos (assíncrona).
Pode ser usado como um proxy reverso e também como um balanceador de carga, hoje é usado em muitos sites na Internet por sua alta performance.
Nginx vs Apache
O Apache e o Nginx são os web servers mais comuns na Internet e juntos representam 50% do tráfego na Internet. As duas soluções são capazes de administrar diferentes cargas de trabalho e trabalhar em conjunto com outros softwares pra prover uma pilha web completa.
Tanto o Apache quanto o Nginx tem muitas qualidades mas eles não podem ser considerados totalmente intercambiáveis. Cada um foi desenvolvido à sua maneira e é importante entender as situações em que mais vale aplicar um ou o outro.
Critério | Apache | Nginx |
---|---|---|
Static speed | Segundo mais rápido | 2.5x mais rápido do que o Apache |
Dynamic speed | Empate | Empate |
OS support | Unix, Windows, Mac OSX | Roda bem em sistemas Unix like, mas não tão bem em Windows |
Segurança | Empate | Empate |
Flexibilidade | Arquitetura altamente customizável | Difícil de personalizar módulos para o servidor devido à complexa arquitetura de base |
Suporte | Uma vasta comunidade com uma grande base instalada | Suporte comunitário e listas de discução |
Custo | Software Livre sob a licença Apache | Licença Open Source, também disponível sob licença paga com mais recursos - Nginx plus |
Implementando um Web Server com o Nginx
O Nginx é um software muito popular assim os pacotes disponíveis nos repositórios das distribuições atenderá na maioria dos cenários. Portanto sua instalação é trivialmente executada com o gerenciador de pacotes da distribuição usada.
Todas as configurações do Nginx ficam localizadas no diretório
/etc/nginx/
:
root@lpic-2-srv:~# cd /etc/nginx/ root@lpic-2-srv:/etc/nginx# ls -l total 56 drwxr-xr-x 2 root root 4096 Jul 12 2019 conf.d -rw-r--r-- 1 root root 1077 Mar 20 2019 fastcgi.conf -rw-r--r-- 1 root root 1007 Mar 20 2019 fastcgi_params -rw-r--r-- 1 root root 2837 Mar 20 2019 koi-utf -rw-r--r-- 1 root root 2223 Mar 20 2019 koi-win -rw-r--r-- 1 root root 3957 Mar 20 2019 mime.types -rw-r--r-- 1 root root 1462 Mar 20 2019 nginx.conf -rw-r--r-- 1 root root 180 Mar 20 2019 proxy_params -rw-r--r-- 1 root root 636 Mar 20 2019 scgi_params drwxr-xr-x 2 root root 4096 Jun 30 03:12 sites-available drwxr-xr-x 2 root root 4096 Jun 30 03:12 sites-enabled drwxr-xr-x 2 root root 4096 Jun 30 03:12 snippets -rw-r--r-- 1 root root 664 Mar 20 2019 uwsgi_params -rw-r--r-- 1 root root 3071 Mar 20 2019 win-utf
O arquivo de configuração primário é /etc/nginx/nginx.conf
. Assim
como no Apache as opções de configuração são chamadas de
diretivas. Essas diretivas são organizadas em blocos que também
são conhecidos como contextos. Como na maioria dos arquivos de
configuração o símbolo #
dá início a um comentário e tanto ele
quanto o que vier depois dele não será interpretado. Também é
importante entender que assim como no arquivo de configuração do
Bind as linhas que contiverem diretivas devem terminar com um
;
caso contrário o Nginx falhará ao carregar a configuração e irá
relatar um erro.
O arquivo de configuração principal começa com 5 diretivas: user
,
worker_processes
, error_log
e pid
. Elas estão fora de
qualquer bloco ou contexto específico, portanto, diz-se que existem
no contexto principal (main
).
Os blocos events
e http
são áres para diretivas adicionais e
também existem no contexto principal (main
).
- O bloco HTTP
- O bloco http contém diretivas para lidar com o tráfego da web. Essas diretivas são frequentemente chamadas de universais porque são passadas para todas as configurações de site que o NGINX atende.
- O bloco Server
- O bloco HTTP acima contém uma diretiva incluída que informa ao NGINX onde os arquivos de configuração do site estão localizados.
events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; 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; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
Atenção algo a ser notado é a diretiva root
ela aponta para o
diretório raiz do site, no Apache seria DocumentRoot
.
Em um sistema RedHat like quando instalado dos repositórios
oficiais o arquivo de configuração conterá include /etc/nginx/conf.d/*.conf;
no bloco http
. Logo todo website que hospedarmos nesse serviço
deverá ter seu arquivo de configuração em /etc/nginx/conf.d/
com
o nome terminado em .conf
. Assim para desabilitar um site basta
renomear sua extensão com um .conf.disabled
.
Em um sistema Debian like quando instalado dos repositórios
oficiais o arquivo de configuração conterá include /etc/nginx/sites-enabled/*;
.
O diretório /etc/nginx/sites-enabled/
conterá links simbólicos
apontando para /etc/nginx/sites-available/
de forma semelhante ao
que temos na instalação do Apache.
- Ouvindo portas
- A diretiva
listen
indica ao Nginx o hostname ou IP e a porta TCP onde o serviço ouvirá conexões HTTP. O argumentodefault_server
significa que este virtual host responderá às solicitações da porta 80 que não correspondem especificamente à instrução de escuta de outro virtual host em outras palavras a página padrão caso a requisição HTTP não der match em nenhum dos virtual hosts configurados no servidor; - Name-based virtual hosting
- A diretiva
server_name
habilita múltiplos domínios no servidor. Fazendo o servidor decidir qual site entregar mediante ao cabeçalho request.
#exemplos: #processa requisições para dois endereços: server_name exemplo.com.br www.exemplo.com.br; # Uso de wildcards server_name *.exemplo.com.br; server_name .exemplo.com.br; #Processa requisições para todos os nomes de domínio #iniciados com a palavra exemplo server_name exemplo.*;
O NGINX nos permite especificar nomes de servidor que não são nomes de domínio válidos. O NGINX usa o nome do cabeçalho HTTP para responder a solicitações, independentemente de o nome de domínio ser válido ou não.
Usar nomes de host sem domínio é útil se o servidor estiver em uma LAN ou se já conhecermos todos os clientes que farão solicitações ao servidor.
- Blocos de localização
- A diretiva
location
permite configurar como o Nginx responderá as requisições que chegarem ao servidor. Assim como a diretivaserver_name
diz ao Nginx como processar as requisições para um domínio a diretivalocation
cobre as requisições por arquivos ou diretórios específicos. Tal comohttp://exemplo.com.br/.local
, essa diretiva tem suporte a expressões regulares; - Localização raiz e
index
A diretiva
location
é uma das variáveis que tem seu próprio bloco de argumentos. Depois de o Nginx determinar qual diretiva de localização melhor corresponde a uma determinada solicitação, a resposta a essa solicitação é determinada pelo conteúdo do bloco de diretiva de localização associada.location / { root html; index index.html index.htm; }
No exemplo o document root está localizado no diretório
html/
. Abaixo da localização default do Nginx, logo o caminho completo para esse document root seria/var/www/html/
. A variávelindex
diz ao Nginx qual arquivo apresentar caso nenhum seja especificado.
O comando nginx
Assim como o Apache tem o apachectl o Nginx também tem um comando
para manusear o deamon o comando é nginx
root@lpi-2-srv:~# nginx -? nginx version: nginx/1.10.3 (Ubuntu) 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 stop — shut down quickly quit — shut down gracefully reload — reload configuration, start the new worker process with a new configuration, gracefully shut down old worker processes. reopen — reopen log files -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
Proxy reverso
Para usufruir dos recursos do Nginx, sem abrir mão dos módulos e versatilidade do Apache é comum utilizarmos o Nginx como um proxy reverso. Nesse cenário o Nginx responde a todas as solicitações HTTP do cliente. Porém 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.
Configurando um proxy reverso simples
A configuração do proxy reverso no Nginx inicia-se verificando o
conteúdo do arquivo /etc/nginx/proxy_params
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; proxy_set_header X-Forwarded-Proto $scheme;
Podemos copiar esse conteúdo e colar ele no nosso arquivo de Virtual Host ou apenas fazer um include apontando para ele.
server { listen 80; server_name exemplo.com.br; location \ { proxy_pass http://infralinux.com.br/; include /etc/nginx/proxy_params; } }
Agora basta restartar o deamon do Nginx.