Arquivo da tag: Nginx

Como instalar e configurar o módulo nginx-upload-module no Nginx – Parte 1

Olá pessoal,

Estou procurando algumas formas de como resolver um problema de upload de arquivos grandes (+1GB) em uma aplicação escrita em Python utilizando o Microframework Flask. Neste post vou explicar como instalar o módulo nginx-upload-module no Nginx para que o upload dos arquivos seja trato pelo Nginx não mais pela aplicação.

ATENÇÃO: Antes de começar, este post é apenas para fins didáticos, não recomendo executar este procedimento em ambiente de produção a não ser que você tenha certeza do que você esta fazendo.

O Nginx quando instalado via gerenciado de pacotes vem com vários módulos, então para ter uma instalação funcional para vários propósitos também vou instalar os mesmos módulos que são instalados via gerenciador de pacotes.

Para este teste estou utilizando o Ubuntu 18.04 Server, acredito que seja possível reproduzir em outras distribuições baseadas no Debian

sudo apt update && apt upgrade
sudo apt install build-essential -y

Para compilação é necessários o código fonte de outras duas bibliotecas, o PCRE que é uma dependência do módulo de reescrita e OpenSSL que é uma dependência do módulo de ssl

PCRE

cd /tmp/
wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz && tar -xf pcre-8.44.tar.gz

OpenSSL

cd /tmp/
wget https://www.openssl.org/source/openssl-1.1.1h.tar.gz && tar -xf openssl-1.1.1h.tar.gz

No momento que escrevo este post, a versão estável do Nginx é a 1.18:

cd /tmp/
wget https://nginx.org/download/nginx-1.18.0.tar.gz && tar -xf nginx-1.18.0.tar.gz

O módulo nginx-upload-module precisa ser abaixado a partir do github do projeto

cd /tmp/
wget https://github.com/vkholodkov/nginx-upload-module/archive/master.zip && zip -d master.zip

Execute o ./configure com os módulos padrões, os caminhos das bibliotecas dependentes e do módulo nginx-upload-module

cd /tmp/nginx-1.18.0
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-pcre=../pcre-8.44 --with-openssl=../openssl-1.1.1h  --add-module=/root/nginx-upload-module-master --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'

Se tudo deu certo execute o comando abaixo para executar a instalação

sudo make 
sudo make install

Para facilitar a operação do serviço vou configurara o systemd para conseguir iniciar e parar o serviço utilizando o systemctl

sudo vim /etc/systemd/system/nginx.service

Copie e cole o trecho abaixo

[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

Para testar pare e inicie o serviço utilizando o Nginx

systemctl stop nginx
systemctl start nginx

Para verificar a instação dos módulos, execute o comando

nginx -V

A resposta esperada é

nginx -V

Vou terminar por aqui esta primeira parte, em breve publico outro post explicando como configurar o Nginx para tratar o upload dos arquivos.

Configurar SSL auto-assinado (self-signed) no NGINX

Neste post vou explicar como criar um certificado SSL e configurar o NGINX para aceitar conexões HTTPS.

Para fazer este post estou o Raspberry PI 2 que eu tenho em casa, nele tenho instalado a ultima versão do Raspian.

Vamos considerar que o nginx já esteja instalado, vamos criar um virtual host bem simples:

~# sudo touch /etc/nginx/sites-avaliable/static.conf

Exemplo de uma configuração básica de um virtual host no NGINX

$ sudo vim /etc/nginx/sites-avaliable/static.conf

 

server {
    listen 80;
    server_name static.example.com;

    root /var/www/static.example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Ative o virtual host

~# ln -s /etc/nginx/sites-avaliable/static.conf /etc/nginx/sites-enable/static.conf

Reinicie o serviço

~# systemctl restart nginx

Pronto, agora vamos para configuração do SSL

Vamos criar um diretório para armazenar a chave e o certificado

~# sudo mkdir -p /etc/nginx/ssl

Para criar o certificado vou utilizar o openssl

~# sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/static.key -out /etc/nginx/ssl/static.crt

Vamos editar o novamente o arquivo de configuração que criamos no inicio do post e adicionar as linhas abaixo

server {
    listen 80;
    server_name static.example.com;

    # SSL
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/static.crt;
    ssl_certificate_key /etc/nginx/ssl/static.key;
    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

    root /var/www/static.example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Pronto, observe que apenas os protocolos TLS 1.1 e TLS 1.2 estão ativos, a versão 1.0 TLS e o protoloco SSL 3.0 contém vulnerabilidades que foram amplamente divulgadas, fica como referência o report CVE-2014-3566. Outro item importânte é em relação a lista de ciphers, nesta configuração a encryptação usando MD5 esta desabilitada, por ser considerada fraca.

Para ativar a configuração reinicie o serviço

~# systemctl restart nginx

Quando o você acessar o endereço https (https://<server_name>/) você vai receber um alerta informando que o certificado não é assinado por uma certificadora (NET::ERR_CERT_AUTHORITY_INVALID), como é ambiente de teste do qual temos controle, ignore o aviso e aceite o risco.

Monitorar NGINX com New Relic

Para quem ainda não conhece a New Relic é uma solução para monitorar a performance de aplicativos web e mobile em tempo real, além de monitorar aplicações, também é possível monitorar a infraestrutura (Web Server, Banco de Dados, Sistema Operacional, etc), a conta free é uma excelente alternativa para quem não quer manter um servidor de monitoração (nagios, zabbix, munin, etc), com ela é possível ter uma monitoração básica e suficiente para aplicações de baixa complexidade.

Uso a ferramenta a algum tempo para projetos pessoais, e só agora comecei a dar uma olhada nos plugins que a solução oferece. Neste post vou explicar como configurar o plugin para o NGINX no Ubuntu 16.04 LTS.

Pre-requisitos

  1. Repositório da New Relic instalado;
  2. Agente padrão instalado (newrelic-sysmond);

Instalando e configurado o plugin

~# sudo apt-get install nginx-nr-agent

Edite o arquivo de configuração plugin

~# sudo vim /etc/nginx-nr-agent/nginx-nr-agent.ini

É necessário fazer alguns ajustes para ativar a coleta, localize a linha:

newrelic_license_key=YOUR_LICENSE_KEY_HERE

Substitua pela sua License Key, exemplo:

newrelic_license_key=99999ffff000000ddddd222222

Configure a fonte de onde o plugin vai colegar os dados

[source1] 
name=exemplo.com.br 
url=http://www.exemplo.com/nginx_status

Ative a /status do NGINX, e dali que o plugin vai coletar os dados:

# Server status
 location = /nginx_status {
      stub_status on;
      allow 127.0.0.1;
      allow 123.132.125.125;
      deny all;
 }

Altere o IP 123.132.125.125 para o IP público do servidor para que o plugin consiga fazer coleta

Reinicie os serviços envolvidos

~# sudo service newrelic-sysmond restart 
~# sudo nginx restart 
~# sudo service nginx-nr-agent restart

Pronto! Caso as coletas não apareçam no dashboard, os logs ficam em:

~# tail -f /var/log/nginx-nr-agent.log

As coletas ficam no aba plugin

Plugin NGINX Newrelic

Plugin NGINX Newrelic

Instalando e configurando NGINX no CentOS 6.4 – Parte 3

Neste post vou parar de enrolação é ir direto ao que interessa, fazer o NGINX interpretar arquivos PHP utilizando o PHP-FPM (FastCGI Process Manager) e criar um Virtual Host com as configurações básicas. Considerando que você tenha lido a Parte 1 e a Parte 2 da série de posts sobre o NGINX pois são requisitos para execução deste roteiro, vamos por a mão na massa 🙂 Continue lendo