Nginx Tutorial · 10 min read · Jan 23, 2026
Compilando Nginx a partir do Código Fonte no Debian Squeeze
Compilando Nginx a partir do Código Fonte no Debian Squeeze
Versão 1.0
Autor: Michel Käser
Este tutorial descreve como você pode compilar o nginx a partir do código fonte no Debian Squeeze. Além disso, incluiremos alguns módulos de terceiros úteis, como o naxsi WAF (firewall de aplicação web), SPDY, etc.
No final, você terá uma instalação do nginx totalmente funcional.
Não dou nenhuma garantia de que isso funcionará para você!
1 Requisitos
Para seguir este tutorial, você precisará do seguinte:
- um servidor dedicado rodando Debian Squeeze
- cerca de 30 minutos de tempo para ler cuidadosamente
2 Notas Preliminares
Neste tutorial, usaremos a versão de desenvolvimento do nginx como nossa base de código. Esteja ciente de que essas versões podem ser instáveis e não são recomendadas para rodar em servidores de produção.
Alguns módulos, como o SPDY, no entanto, requerem a versão 1.3.1x ou posterior do nginx - e pessoalmente eu diria que é mais ou menos seguro usar a versão de desenvolvimento do nginx, pois não há exploits conhecidos.
3 Pré-requisitos
Como o nginx é escrito na linguagem de programação C, precisaremos instalar alguns pacotes que nos ajudarão a compilar o código fonte. Sou um grande fã do gerenciador de pacotes apt, mas você também pode usar aptitude, etc.:
apt-get -y install build-essential zlib1g-dev libpcre3 libpcre3-dev libbz2-dev libssl-dev tar unzipIsso instalará todos os pacotes necessários, como gcc e make.
4 Baixando o código fonte do nginx
A versão mais recente do nginx pode ser encontrada no seguinte site: nginx.org/en/download.html. No momento da escrita, é 1.3.12 - então vamos baixar:
cd /tmp
wget http://nginx.org/download/nginx-1.3.12.tar.gze descompactar o código fonte:
tar -xzvf nginx-1.3.12.tar.gzAinda não vamos compilar nossa versão do nginx, pois vamos baixar alguns módulos de terceiros primeiro que incluiremos mais tarde.
5 Módulos adicionais de terceiros
Ao contrário do Apache HTTPd, que suporta o carregamento dinâmico de módulos (é por isso que podemos instalá-los a partir de repositórios), o nginx não inclui tal recurso - e pelo que li, não é algo que esteja no roadmap mais próximo.
Portanto, precisamos decidir cedo quais módulos queremos incluir em nossa instalação personalizada. Há uma boa visão geral/tabela no site oficial do nginx listando os mais populares: wiki.nginx.org/3rdPartyModules.
Como não inclui todos os módulos disponíveis, recomendo que você faça uma pesquisa no Google como: nginx redis module github se estiver procurando por um módulo específico - muitos deles estão hospedados no Github.
5.1 Baixando os módulos
Para este tutorial, vamos baixar alguns módulos realmente ótimos, como naxsi, SPDY e alguns menos conhecidos.
headers_more
Vamos começar com headers_more. Você pode usá-lo para ocultar completamente as informações do servidor web, por exemplo, para aumentar a segurança do servidor:
mkdir /tmp/nginx-modules
cd /tmp/nginx-modules
wget https://github.com/agentzh/headers-more-nginx-module/archive/v0.19.tar.gz
tar -xzvf v0.19.tar.gzIsso fará o download da versão mais recente e a descompactará. Certifique-se de verificar o repositório oficial de tempos em tempos para ver se há uma nova versão disponível (vale para todos os outros módulos também).
Cache Purge
Você pode não precisar deste módulo para sua configuração. No entanto, se você tiver o nginx na frente do Apache, atuando como um proxy reverso e armazenando em cache os resultados do proxy_pass, isso pode ser uma boa! Caso contrário, pule:
wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.0.tar.gz
tar -xzvf 2.0.tar.gznaxsi
Naxsi é um módulo de firewall de aplicação web de código aberto, alto desempenho e baixa manutenção de regras para o nginx - muito semelhante ao mod_security em funcionalidade. Vamos usá-lo para proteger as aplicações web de nossos clientes:
wget http://naxsi.googlecode.com/files/naxsi-core-0.49.tgz
tar -xzvf naxsi-core-0.49.tgzSPDY
SPDY é um módulo que permite que seu servidor web aproveite os recursos do SPDY, como multiplexação de streams e compressão de cabeçalhos, e muitas pessoas estão falando sobre isso como um novo padrão (o que parece ser).
Atualizando o OpenSSL
Ele requer OpenSSL 1.0.1+, algo que não temos na nossa máquina Squeeze por padrão. Usaremos o repositório de testes do Debian neste tutorial para instalá-lo. No entanto, você pode compilá-lo a partir do código fonte ou verificar outros repositórios também.
nano /etc/apt/sources.liste cole as seguintes linhas:
deb http://ftp.debian.org/debian/ testing main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-freeAgora devemos evitar que nosso servidor atualize outros pacotes para a versão de testes. Podemos fazer isso criando/editando o arquivo /etc/apt/apt.conf.d/releases: ``` nano /etc/apt/apt.conf.d/releases ``` e cole: ``` APT::Default-Release "squeeze"; ``` Atenção: Se você se referir a repositórios estáveis com stable no seu sources.list, deve substituir squeeze por stable no texto acima. Agora podemos *com segurança* executar: ``` apt-get update apt-get -t testing install openssl ``` que irá atualizar/instalar a versão existente do OpenSSL. #### Aplicando o patch Atualmente, não há como incluí-lo como outros módulos, em vez disso, é fornecido como um patch para o código fonte do nginx. O readme oficial pode ser encontrado aqui: nginx.org/patches/spdy/README.txt ``` cd /tmp/nginx-1.3.12 wget http://nginx.org/patches/spdy/patch.spdy.txt patch -p1 < patch.spdy.txt ``` deve fazer toda a mágica para nós. ### 6 Compilando o nginx Até agora, baixamos o código fonte do nginx, alguns módulos adicionais de terceiros para ele e aplicamos o patch do SPDY. É hora de compilar nossa instalação do nginx agora. É como com todos os aplicativos em C - um processo em 3 etapas. Vamos passar pela primeira etapa em mais detalhes: ``` ./configure --help ``` Isso mostrará uma lista de todas as opções de configuração disponíveis para a compilação, como quais módulos podem ser desativados, ativados e assim por diante. O meu se parece com isso (encurtado): ``` --help imprime esta mensagem --prefix=PATH define o prefixo de instalação --sbin-path=PATH define o caminho do binário do nginx --conf-path=PATH define o caminho do nginx.conf --error-log-path=PATH define o caminho do log de erro --pid-path=PATH define o caminho do nginx.pid --lock-path=PATH define o caminho do nginx.lock --user=USER define o usuário não privilegiado para processos de trabalho --group=GROUP define o grupo não privilegiado para processos de trabalho --builddir=DIR define o diretório de construção --with-rtsig_module ativa o módulo rtsig --with-select_module ativa o módulo select --without-select_module desativa o módulo select --with-poll_module ativa o módulo poll --without-poll_module desativa o módulo poll --with-file-aio ativa o suporte a AIO de arquivo --with-ipv6 ativa o suporte a IPv6 --with-http_ssl_module ativa o ngx_http_ssl_module [...] --with-http_stub_status_module ativa o ngx_http_stub_status_module --without-http_charset_module desativa o ngx_http_charset_module [...] --without-http_browser_module desativa o ngx_http_browser_module --without-http_upstream_ip_hash_module desativa o ngx_http_upstream_ip_hash_module --without-http_upstream_least_conn_module desativa o ngx_http_upstream_least_conn_module --without-http_upstream_keepalive_module desativa o ngx_http_upstream_keepalive_module --with-http_perl_module ativa o ngx_http_perl_module --with-perl_modules_path=PATH define o caminho dos módulos Perl --with-perl=PATH define o caminho do binário Perl --http-log-path=PATH define o caminho do log de acesso http --http-client-body-temp-path=PATH define o caminho para armazenar arquivos temporários do corpo da requisição http --http-proxy-temp-path=PATH define o caminho para armazenar arquivos temporários do proxy http --http-fastcgi-temp-path=PATH define o caminho para armazenar arquivos temporários do fastcgi http --http-uwsgi-temp-path=PATH define o caminho para armazenar arquivos temporários do uwsgi http --http-scgi-temp-path=PATH define o caminho para armazenar arquivos temporários do scgi http --without-http desativa o servidor HTTP --without-http-cache desativa o cache HTTP --with-mail ativa o módulo proxy POP3/IMAP4/SMTP [...] --without-mail_smtp_module desativa o ngx_mail_smtp_module --with-google_perftools_module ativa o ngx_google_perftools_module --with-cpp_test_module ativa o ngx_cpp_test_module --add-module=PATH ativa um módulo externo --with-cc=PATH define o caminho do compilador C [...] --with-cpu-opt=CPU compila para a CPU especificada, valores válidos: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, sparc32, sparc64, ppc64 --without-pcre desativa o uso da biblioteca PCRE [...] --with-pcre-jit compila PCRE com suporte a compilação JIT --with-md5=DIR define o caminho para as fontes da biblioteca md5 --with-md5-opt=OPTIONS define opções de compilação adicionais para md5 --with-md5-asm usa fontes de montador md5 --with-sha1=DIR define o caminho para as fontes da biblioteca sha1 --with-sha1-opt=OPTIONS define opções de compilação adicionais para sha1 --with-sha1-asm usa fontes de montador sha1 --with-zlib=DIR define o caminho para as fontes da biblioteca zlib --with-zlib-opt=OPTIONS define opções de compilação adicionais para zlib --with-zlib-asm=CPU usa fontes de montador zlib otimizadas para a CPU especificada, valores válidos: pentium, pentiumpro --with-libatomic força o uso da biblioteca libatomic_ops --with-libatomic=DIR define o caminho para as fontes da biblioteca libatomic_ops --with-openssl=DIR define o caminho para as fontes da biblioteca OpenSSL --with-openssl-opt=OPTIONS define opções de compilação adicionais para OpenSSL --with-debug ativa o registro de depuração ``` Isso ajudará muito a decidir quais módulos você deseja incluir/excluir, bem como o que mais pode ser definido. Vamos usar o seguinte comando de configuração: ``` ./configure \ --prefix=/usr/share/nginx \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --pid-path=/var/run/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/access.log \ --user=www-data \ --group=www-data \ --without-mail_pop3_module \ --without-mail_imap_module \ --without-mail_smtp_module \ --without-http_fastcgi_module \ --without-http_uwsgi_module \ --without-http_scgi_module \ --without-http_memcached_module \ --with-ipv6 \ --with-http_ssl_module \ --with-http_spdy_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --add-module=/tmp/nginx-modules/headers-more-nginx-module-0.19 \ --add-module=/tmp/nginx-modules/naxsi-core-0.49/naxsi_src \ --add-module=/tmp/nginx-modules/ngx_cache_purge-2.0 ``` que excluirá tudo relacionado a e-mails e manipuladores que não precisamos (você pode precisar deles se não estiver rodando como um proxy reverso!) e incluirá nossos módulos de terceiros baixados e o patch do SPDY. Usei os caminhos padrão do Debian aqui, mas sinta-se à vontade para alterá-los. Em seguida, podemos compilar o código fonte: ``` make ``` Atenção: Se isso gerar algum erro, você deve lê-los cuidadosamente para ver onde está o problema e qual é. Finalmente, instale o código fonte compilado: ``` make install ``` Isso copiará todos os arquivos para os locais corretos. Pronto! ### 7 Habilitando a inicialização automática O Debian usa scripts de inicialização através dos quais você pode controlar o comportamento do serviço. Estou usando o do pacote oficial do nginx - todos os créditos pertencem ao seu mantenedor: ``` #!/bin/sh ### BEGIN INIT INFO # Provides: nginx # Required-Start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: inicia o servidor web nginx # Description: inicia o nginx usando start-stop-daemon ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/sbin/nginx NAME=nginx DESC=nginx # Inclui o padrão do nginx se disponível if [ -f /etc/default/nginx ]; then . /etc/default/nginx fi test -x $DAEMON || exit 0 set -e . /lib/lsb/init-functions test_nginx_config() { if $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1; then return 0 else $DAEMON -t $DAEMON_OPTS return $? fi } case "$1" in start) echo -n "Iniciando $DESC: " test_nginx_config # Verifica se o ULIMIT está definido em /etc/default/nginx if [ -n "$ULIMIT" ]; then # Define os ulimits ulimit $ULIMIT fi start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON -- $DAEMON_OPTS || true echo "$NAME." ;; stop) echo -n "Parando $DESC: " start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON || true echo "$NAME." ;; restart|force-reload) echo -n "Reiniciando $DESC: " start-stop-daemon --stop --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON || true sleep 1 test_nginx_config # Verifica se o ULIMIT está definido em /etc/default/nginx if [ -n "$ULIMIT" ]; then # Define os ulimits ulimit $ULIMIT fi start-stop-daemon --start --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true echo "$NAME." ;; reload) echo -n "Recarregando a configuração do DESC: " test_nginx_config start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON || true echo "$NAME." ;; configtest|testconfig) echo -n "Testando a configuração do DESC: " if test_nginx_config; then echo "$NAME." else exit $? fi ;; status) status_of_proc -p /var/run/$NAME.pid "$DAEMON" nginx && exit 0 || exit $? ;; *) echo "Uso: $NAME {start|stop|restart|reload|force-reload|status|configtest}" >&2 exit 1 ;; esac exit 0 ``` Não se esqueça dechmod`:chmod 755 /etc/init.d/nginx Também podemos criar um arquivo padrão no estilo Debian:nano /etc/default/nginx e cole:# Nota: Você pode querer olhar para a seguinte página antes de definir o ULIMIT. # http://wiki.nginx.org/CoreModule#worker_rlimit_nofile # Defina a variável ulimit se precisar que os padrões mudem. # Exemplo: ULIMIT="-n 4096" #ULIMIT="-n 4096" Por último, mas não menos importante, se você quiser que o nginx inicie automaticamente na inicialização, pode executar:update-rc.d nginx defaults ### 8 Diretrizes especiais do módulo Não vamos passar pela configuração do nginx e arquivos vhost aqui, mas as seguintes diretrizes de nossos módulos são interessantes:# Módulo SPDY (vhost) listen 443 ssl spdy; # módulo more_headers (http) more_clear_headers 'Server'; # remove informações do servidor #### naxsi naxsi é um pouco mais complexo. Primeiro, as regras de configuração globais devem ser incluídas na seção http do arquivo de configuração do nginx:nano /etc/nginx/nginx.conf e cole:http { [...] include /etc/nginx/naxsi_core.rules; [...] } Atenção: Certifique-se de que este arquivo exista. Você pode copiar os arquivos de configuração do naxsi do arquivo baixado (veja: Módulos adicionais de terceiros). Em seguida, você deve incluir as regras padrão dentro do seu template de vhost:[...] location / { include /etc/nginx/naxsi.rules; [...] } [...] e uma localização para requisições bloqueadas:[...] location /blocked { return 403; #proxy_pass http://127.0.0.1:4242; # modo de aprendizado } [...] Atenção: Certifique-se de que a localização para requisições bloqueadas corresponda àquela do arquivo de configuração /etc/nginx/naxsi.rules:LearningMode; SecRulesEnabled; #SecRulesDisabled; DeniedUrl "/blocked"; [...] Como você pode ver, o naxsi tem algumas opções estranhas, mas elas não são estranhas. Você deve consultar a documentação deles para ler como fazê-lo funcionar da melhor forma. Uma dica que procurei por muito tempo: você deve executar um script Python e passar requisições bloqueadas para ele durante o modo de aprendizado para criar uma lista branca para falsos alertas. ### 9 Links / Créditos - http://code.google.com/p/naxsi/ - http://nginx.org/ - https://www.rackster.ch/
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.