Tutorial container Nginx Proxy Manager e WordPress com SSL
Objetivo
Este tutorial tem como objetivo destacar os passos para criar um container WordPress com SSL utilizando um nome de domínio configurado no proxy reverso do container Nginx Proxy Manager.
- Forma mais simples de garantir suporte SSL ao container do wordpress, não é necessário realizar build para ativar porta 443 interna.
- Utilizando suporte a HTTP_X_FORWARDED_PROTO, o SSL configurado pelo proxy reverso é redirecionado para dentro do container do WordPress, mesmo que este só tenha a porta 80 habilitada.
Requisitos
- Se estiver utilizando um servidor caseiro (home lab) seu roteador precisa encaminhar (PORT FOWARD) as portas 80 (http) e 443 (https) para o seu servidor
- O firewall do seu servidor precisa aceitar acesso na porta 80 e 443 (normalmente são abertas)
- Garantir que não tenha outro serviço utilizando a porta 80 e 443, senão o container no NPM (Nginx Proxy Manager) não ficará funcional
- Caso possua o apache instalado, basta executar:
- sudo service apache2 stop
- sudo update-rc.d apache2 disable
- Caso possua o nginx instalado, basta executar:
- sudo service nginx stop
- sudo update-rc.d -f nginx disable
- Caso possua o apache instalado, basta executar:
- Ter um nome de domínio configurado e apontado para seu servidor
- Nesse tutorial vamos usar o nome de domínio site1.com.br como exemplo
- Ter software docker e docker compose instalados e configurados
Passo a passo para criar containers wordpress com suporte SSL através de proxy reverso do Nginx Proxy Manager
Passo 1: Criar pasta para guardar arquivos
mkdir ~/docker mkdir ~/docker/nginxproxymanager mkdir ~/docker/site1.com.br
Passo 2: Criar uma rede para todos os container que utilizarem o proxy reverso
Criar uma rede para os containers conseguirem conversar com o NPM:
docker network create rede_proxy_reverso
Passo 3: Criar arquivo docker compose para nginx proxy manager
cd ~/docker/nginxproxymanager nano docker-compose.yml
Colar o conteúdo:
services: npm: image: 'jc21/nginx-proxy-manager:latest' container_name: nginx_proxy ports: - '80:80' - '8081:81' - '443:443' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt restart: unless-stopped networks: - rede_proxy_reverso - default db: image: mariadb:latest container_name: nginx_proxy_db environment: MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD} MYSQL_DATABASE: ${MYSQL_DB} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} volumes: - ./db_data:/var/lib/mysql restart: unless-stopped networks: - default networks: default: name: rede_npm rede_proxy_reverso: external: true
Passo 5: Criar arquivo .env para nginx proxy manager
cd ~/docker/nginxproxymanager nano .env
Colar o conteúdo abaixo dentro do arquivo:
MYSQL_USER=nome_usuario_banco_npm MYSQL_PASSWORD=senha_banco_dados_npm MYSQL_DB=nome_banco_dados_npm DOMAIN=nginx.proxy USER=1000 GROUP=1000
Passo 6: Criar arquivo docker compose para site1.com.br que é um container wordpress
cd ~/docker/site1.com.br
nano docker-compose.yml
Agora precisamos colar o conteúdo abaixo dentro do arquivo:
services: db: image: mariadb:latest container_name: ${DOMAIN}_db command: '--default-authentication-plugin=mysql_native_password' volumes: - ./db_data:/var/lib/mysql restart: always env_file: .env environment: - MYSQL_USER=${MYSQL_USER} - MYSQL_DATABASE=${MYSQL_DB} - MYSQL_PASSWORD=${MYSQL_PASSWORD} - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD} networks: - default site1.com.br: image: wordpress:latest container_name: ${DOMAIN}_web env_file: - .env depends_on: - db volumes: - ./public_html:/var/www/html/ - ./logs:/var/log/apache2 - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro ports: - "9080:80" restart: always environment: - WORDPRESS_DB_HOST=db:3306 - WORDPRESS_DB_USER=${MYSQL_USER} - WORDPRESS_DB_PASSWORD=${MYSQL_PASSWORD} - WORDPRESS_DB_NAME=${MYSQL_DB} - WORDPRESS_TABLE_PREFIX=${WP_PREFIX} extra_hosts: - "${DOMAIN}:127.0.1.1" entrypoint: - /bin/sh - -c - | usermod -u $${USER} www-data groupmod -g $${GROUP} www-data /usr/local/bin/docker-entrypoint.sh apache2-foreground networks: - rede_proxy_reverso - default phpmyadmin: container_name: ${DOMAIN}-phpmyadmin image: linuxserver/phpmyadmin env_file: .env environment: PMA_HOST: db #nome do container que proverá recursos de banco de dados, neste caso o container chama db PMA_PORT: 3306 MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD} UPLOAD_LIMIT: 64M MEMORY_LIMIT: 256M MAX_EXECUTION_TIME: 300 ports: - "9081:80" networks: - default networks: default: name: rede_${DOMAIN} rede_proxy_reverso: external: true
Passo 7: Criar arquivo .env para site1.com.br que é um container wordpress
Precisamos agora criar o arquivo .env para o container wordpress do domínio site1.com.br:
cd ~/docker/site1.com.br
nano .env
Cole o conteúdo abaixo dentro do arquivo:
MYSQL_USER=nome_usuario_banco_site1 MYSQL_PASSWORD=senha_banco_dados_site1 MYSQL_DB=nome_banco_dados_site1 DOMAIN=site1.com.br WP_PREFIX=wpSITE1_ USER=1000 GROUP=1000
Passo 8: Iniciar os containers
Iniciar o container do Nginx Proxy Manager:
cd ~/docker/nginxproxymanager docker compose up -d
Iniciar o container wordpress do site1.com.br:
cd ~/docker/site1.com.br
docker compose up -d
Passo 9: Testar funcionamento container wordpress
Configuramos o site1.com.br que é o container wordpress e responder solicitação pela porta 9080 do servidor. Levando em conta que nosso servidor está configurado com o IP 192.168.1.10, vamos acessar o site com wordpress pelo browser:
http://192.168.1.10:9080
Se tentar acessar o a URL rapidamente, logo em seguida que criou o container, talvez receba mensagem de erro de conexão do banco de dados. O motivo é que o container do mysql demora um pouco para inicializar. Espere mais um pouco e tente acessar a URL novamente.
Se tudo ocorreu corretamente, vai aparecer a tela de configuração inicial do wordpress. Atenção! Não avance com a configuração, o ideal é realizar o processo já com o nome de domínio configurado.
Passo 10 – Configurar o Nginx Proxy Manager
Abra o navegador e digite o endereço do servidor juntamente com a porta. Neste exemplo nosso servidor está com endereço IP 192.168.1.10 e porta 8081. Então:
http://192.168.1.10:8081
Agora realize o primeiro login na plataforma:
Login: admin@example.com Senha: changeme
Agora selecione a opção:
Proxy Hosts
Clique agora no botão:
Add Proxy Host
Vamos configurar agora o domínio site1.com.br. Em Domain Names, insira o texto:
site1.com.br
Em Scheme, escolha:
http
Em Foward Hostname / IP, escolha o IP do seu servidor (192.168.1.10), ou o IP de loopback (127.0.0.1) ou o nome do container que possui o wordpress instalado, neste caso:
site1.com.br
Em porta, vamos escolher a porta interna do container. Como temos uma rede dedicada para o proxy reverso (rede_proxy_reverso), o Nginx Proxy Manager consegue conversar pela rede interna compartilhada, não sendo nem mesmo necessário expor a porta do container. Caso não tenha a rede criada, ou vai utilizar o endereço IP, então precisa colocar a porta externa do container (9080). Então vamos escolher a porta:
80
Podemos também habilitar as opções:
Block Common Exploits Websockets Support
Nesta mesma tela, temos alguma opções no menu superior:
Details | Custom locations | SSL | Advanced
Vamos solicitar o certificado SSL, então precisamos selecionar a aba:
SSL
Selecione agora a opção:
Request a new SSL Certificate with Let's Encrypt
Caminhe agora para a aba:
Advanced
Cole o seguinte texto:
proxy_set_header Host $host:$server_port; 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;
Tudo pronto e configurado. Basta clicar no botão:
Save
Passo 11: Testar funcionamento
As principais configurações estão prontas. Acesse agora o nome de domínio escolhido pelo browser, no caso deste exemplo:
https://site1.com.br
Caso as configurações tenham sido realizadas corretamente, você irá se deparar com a tela de instalação do wordpress. Pode serguir com a instalação normalmente.
Passo 12: Resumo de configurações
Um breve resumo das configurações criadas:
Container Nginx Proxy Manager (NPM)
Portas expostas: 80, 443 e 8081 Porta da interface web do NPM: 8081
Container WordPress para o site1.com.br
Portas expostas: 9080 e 9081 Porta site wordpress: 9080 Porta interface phpmyadmin: 9081
IP de exemplo do servidor: 192.168.1.10
Para acessar a interface do NPM: http:192.168.1.10:8081
Para acessar o website pelo ip: http://192.168.1.10:9080
Para acessar a interface do Phpmyadmin: http://192.168.1.10:9081
Para acessar o website criado: https://site1.com.br
Conclusão
O setup do container do NPM + WordPress não é trivial, há pequenos detalhes diante a rede compartilhada entre o proxy reverso e o container do wordpress que influencia na porta a ser utilizada: usualmente pensamos na porta exposta no container, mas a forma mais segura é a porta interna. Utilizar o nome do container (site1.com.br) como “Foward Hostname” dentro do NPM também é um setup que utiliza as vantagens do DNS interno do docker para simplificar a comunicação entre containers. Estas configurações não são triviais para aqueles que estão começando a utilizar o docker e podem causar problemas no setup.
Qualquer dúvida ou sugestão no setup acima, basta entrar em contato pela área de comentários! Feedback é sempre bem vindo!