Base de Conhecimento
Como configurar um aplicativo Node.js para produção no CentOS 7 Imprimir este Artigo
Introdução
O Node.js é um ambiente de tempo de execução Javascript de código aberto para a criação fácil de aplicativos de rede e do servidor. A plataforma roda em Linux, OS X, FreeBSD e Windows, e seus aplicativos são escritos em JavaScript. Os aplicativos Node.js podem ser executados na linha de comando, mas ensinaremos como executá-los como um serviço, para que sejam reiniciados automaticamente na reinicialização ou falha, para que você possa usá-los em um ambiente de produção.
Neste tutorial, abordaremos a configuração de um ambiente Node.js pronto para produção, composto por dois servidores CentOS 7; um servidor executará aplicativos Node.js gerenciados pelo PM2, enquanto o outro fornecerá aos usuários acesso ao aplicativo por meio de um proxy reverso do Nginx para o servidor de aplicativos.
A versão do Ubuntu deste tutorial pode ser encontrada aqui .
Pré-requisitos
Este guia usa dois servidores CentOS 7 com rede privada (no mesmo datacenter). A rede privada pode ser configurada em novos servidores quando eles estão sendo criados (na Select additional options
seção). Vamos nos referir a eles pelos seguintes nomes:
- app : o servidor em que instalaremos o tempo de execução do Node.js., seu aplicativo Node.js. e o PM2.
- web : o servidor em que instalaremos o servidor da web Nginx, que atuará como um proxy reverso para o seu aplicativo. Os usuários acessarão o endereço IP público deste servidor para acessar o aplicativo Node.js.
Nota: Consulte a Documentação do DigitalOcean - Como ativar a rede privada em gotas, se você pretende usar um servidor existente que atualmente não possui uma rede privada configurada.
Antes de começar este guia, você deve ter um usuário regular, não root, com sudo
privilégios configurados nos dois servidores - este é o usuário no qual você deve efetuar login nos servidores. Você pode aprender a configurar uma conta de usuário comum, seguindo nosso guia de configuração inicial do servidor para o CentOS 7 .
Comandos executados no servidor de aplicativos :
- an_example_command_on_app
Comandos executados no servidor da web :
- an_example_command_on_web
É possível usar um único servidor para este tutorial, mas você precisará fazer algumas alterações ao longo do caminho. Basta usar o endereço IP do host local, ou seja 127.0.0.1
, onde quer que o endereço IP privado do servidor de aplicativos seja usado.
Aqui está um diagrama de qual será a sua configuração após seguir este tutorial:
Se você deseja acessar seu servidor da Web por um nome de domínio, em vez de seu endereço IP público, adquira um nome de domínio e siga estes tutoriais:
- Como configurar um nome de host com o DigitalOcean
- Como apontar para servidores de nomes DigitalOcean de registradores de domínio comuns
Vamos começar instalando o tempo de execução do Node.j no servidor de aplicativos .
Etapa 1 - Instalando o Node.js
Instalaremos a versão mais recente do NTS.js do LTS, no servidor de aplicativos .
Faça o SSH para o servidor de aplicativos usando o usuário comum, não root, com sudo
privilégios.
No servidor de aplicativos , vamos usar curl
para baixar o arquivo de configuração do NodeSource RPM Repository:
- curl -L -o nodesource_setup.sh https://rpm.nodesource.com/setup_10.x
CURL
usará o protocolo HTTPS para baixar o script de instalação no seu servidor, com a saída incluindo informações relevantes para o download:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 11109 100 11109 0 0 70128 0 --:--:-- --:--:-- --:--:-- 70757
Em seguida, você deve inspecionar o conteúdo do script. O comando a seguir abrirá o script de configuração do NodeSource no console do servidor, que você poderá fazer referência cruzada com o script de configuração do NodeSource (no repositório do NodeSource Distributions Github) para confirmar o script que foi baixado corretamente:
- vi nodesource_setup.sh
Uma vez satisfeito com o arquivo, saia vi
pela digitação :q
de quit
e regresso à linha de comando.
Agora vamos executar o script de instalação para instalar o Repositório NodeSource RPM. Isso nos permitirá acessar o repositório do NodeSource de dentro do yum
gerenciador de pacotes:
- sudo -E bash nodesource_setup.sh
O script gera informações sobre a instalação para nossa referência:
## Installing the NodeSource Node.js 10.x repo...
## Inspecting system...
+ rpm -q --whatprovides redhat-release || rpm -q --whatprovides centos-release || rpm -q --whatprovides cloudlinux-release || rpm -q --whatprovides sl-release
+ uname -m
## Confirming "el7-x86_64" is supported...
+ curl -sLf -o /dev/null 'https://rpm.nodesource.com/pub_10.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm'
## Downloading release setup RPM...
+ mktemp
+ curl -sL -o '/tmp/tmp.2aCcULVx8n' 'https://rpm.nodesource.com/pub_10.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm'
## Installing release setup RPM...
+ rpm -i --nosignature --force '/tmp/tmp.2aCcULVx8n'
## Cleaning up...
+ rm -f '/tmp/tmp.2aCcULVx8n'
## Checking for existing installations...
+ rpm -qa 'node|npm' | grep -v nodesource
## Run `sudo yum install -y nodejs` to install Node.js 10.x and npm.
## You may also need development tools to build native addons:
sudo yum install gcc-c++ make
## To install the Yarn package manager, run:
curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
sudo yum install yarn
Antes de instalar o Node.js, é importante limpar todas as informações em cache de yum
. A limpeza do cache garantirá o yum
uso da conexão de rede para obter o Node.js. do nosso novo Repositório do NodeSource (que evitará possíveis conflitos causados por pacotes desatualizados):
- sudo yum clean all
Em seguida, faremos o download e tornaremos utilizáveis todos os metadados para os yum
repositórios ativados no momento . Isso garantirá que nossas yum
consultas sejam concluídas o mais rápido possível:
- sudo yum makecache fast
Para compilar e instalar complementos nativos npm
, também precisamos instalar ferramentas de construção:
- sudo yum install -y gcc-c++ make
Agora podemos instalar a versão mais recente do pacote Node.js.
- sudo yum install -y nodejs
Verifique se o Node está instalado, verificando sua versão com este comando:
- node -v
Sua saída mostrará o número da versão que você está executando:
v10.16.3
O tempo de execução do Node.js agora está instalado e pronto para executar um aplicativo. Vamos escrever um aplicativo Node.js.
Etapa 2 - Criando o aplicativo Node.js.
Agora, criaremos um aplicativo Hello World que simplesmente retorna "Hello World"
a quaisquer solicitações HTTP. Este é um exemplo de aplicativo que ajudará você a configurar o Node.js., que você pode substituir por seu próprio aplicativo - apenas modifique seu aplicativo para escutar os endereços e portas IP apropriados.
Como queremos que nosso aplicativo Node.js. atenda solicitações provenientes de nosso servidor proxy reverso ( web ), usaremos a interface de rede privada do servidor de aplicativos para comunicação entre servidores. Procure o endereço de rede privada do servidor de aplicativos .
Se você estiver usando um DigitalOcean Droplet como servidor, poderá procurar o endereço IP privado do servidor por meio do serviço de Metadados . No servidor de aplicativos , use o curl
comando para recuperar o endereço IP agora:
- curl -sw "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address
Você deseja copiar a saída (o endereço IP privado), pois ela será usada para configurar o aplicativo Node.js.
Em seguida, crie e abra seu aplicativo Node.js. para edição. Neste tutorial, usaremos vi
para editar um aplicativo de amostra chamado hello.js
:
- vi hello.js
Insira o código a seguir no arquivo e substitua o endereço IP privado do servidor de aplicativos pelos dois APP_PRIVATE_IP_ADDRESS
itens destacados . Se desejar, você também pode substituir a porta destacada,, 8080
nos dois locais (certifique-se de usar uma porta não administrativa, 1024
ou seja, superior):
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8080, 'APP_PRIVATE_IP_ADDRESS');
console.log('Server running at http://APP_PRIVATE_IP_ADDRESS:8080/');
Agora salve e saia pressionando ESC
para sair do --INSERT--
modo, seguido :wq
de write
e quit
em um único comando.
Esse aplicativo Node.js simplesmente escuta o endereço IP e a porta especificados e retorna "Hello World"
com um 200
código de sucesso HTTP. Isso significa que o aplicativo só pode ser acessado a partir de servidores na mesma rede privada, como nosso servidor web .
Se você deseja testar se seu aplicativo funciona, execute este node
comando no servidor de aplicativos :
- node hello.js
Nota: A execução de um aplicativo Node.js dessa maneira bloqueará comandos adicionais até que o aplicativo seja eliminado pressionando CTRL+C
.
Isso economizará muita depuração do Nginx se primeiro testarmos que nosso servidor Web é capaz de se comunicar com o aplicativo Node.js. no aplicativo .
Para testar o aplicativo, abra outra sessão do terminal e conecte-se ao seu servidor web . Como o servidor da web está na mesma rede privada, ele deve conseguir acessar o endereço IP privado do servidor de aplicativoscurl
. Substitua o endereço IP privado do servidor de aplicativosAPP_PRIVATE_IP_ADDRESS
e a porta, se você o tiver alterado:
- curl http://APP_PRIVATE_IP_ADDRESS:8080
Se você vir a seguinte saída, o aplicativo está funcionando corretamente e escutando o endereço IP e a porta adequados:
Hello World
Se você não vir a saída correta, verifique se o aplicativo Node.js. está em execução e configurado para escutar o endereço IP e a porta adequados.
No servidor de aplicativos , certifique-se de matar o aplicativo pressionando CTRL+C
.
Etapa 3 - Instalando e usando o PM2
Agora vamos instalar o PM2, que é um gerenciador de processos para aplicativos Node.js. O PM2 fornece uma maneira fácil de gerenciar e daemonizar aplicativos (executá-los como um serviço).
Usaremos o NPM (Node Packaged Modules), que é basicamente um gerenciador de pacotes para os módulos Node que são instalados com o Node.js, para instalar o PM2 em nosso servidor de aplicativos . Use este comando para instalar o PM2:
- sudo npm install pm2@latest -g
Abordaremos alguns usos básicos do PM2.
A primeira coisa que você deseja fazer é usar o pm2 start
comando para executar seu aplicativo hello.js
, em segundo plano:
- pm2 start hello.js
Isso também adiciona seu aplicativo à lista de processos do PM2, que é exibida sempre que você inicia um aplicativo:
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ hello │ 0 │ fork │ 30099 │ online │ 0 │ 0s │ 14.227 MB │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘
Como você pode ver, o PM2 atribui automaticamente um nome de aplicativo (com base no nome do arquivo, sem a .js
extensão) e um ID do PM2 . O PM2 também mantém outras informações, como o PID do processo, seu status atual e o uso de memória.
Os aplicativos em execução no PM2 serão reiniciados automaticamente se o aplicativo travar ou for morto, mas é necessário executar uma etapa adicional para que o aplicativo seja iniciado na inicialização do sistema (inicialização ou reinicialização). Felizmente, o PM2 fornece uma maneira fácil de fazer isso, o startup
subcomando.
O startup
subcomando gera e configura um script de inicialização para ativar o PM2 e seus processos gerenciados nas inicializações do servidor. Você também deve especificar o sistema init no qual está executando, ou seja systemd
, no nosso caso:
- sudo pm2 startup systemd
Você verá uma saída como a seguinte, que indica que o serviço PM2 foi instalado:
[PM2] Generating system init script in /etc/systemd/system/pm2.service
[PM2] Making script booting at startup...
[PM2] -systemd- Using the command:
su root -c "pm2 dump && pm2 kill" && su root -c "systemctl daemon-reload && systemctl enable pm2 && systemctl start pm2"
[PM2] Dumping processes
[PM2] Stopping PM2...
[PM2] All processes have been stopped and deleted
[PM2] PM2 stopped
[PM2] Done.
Para garantir que o PM2 saiba quais aplicativos iniciar na inicialização, precisamos salvar a lista de processos atual. Para salvar a lista:
- pm2 save
Você verá resultados como os seguintes, o que indica que a lista de processos do PM2 foi salva:
[PM2] Saving current process list...
[PM2] Successfully saved in /home/deployer/.pm2/dump.pm2
Agora, seus aplicativos gerenciados pelo PM2 devem iniciar automaticamente na inicialização.
O PM2 fornece muitos subcomandos que permitem gerenciar ou procurar informações sobre seus aplicativos. Observe que a execução pm2
sem argumentos exibirá uma página de ajuda, incluindo uso de exemplo, que aborda o uso do PM2 em mais detalhes do que esta seção do tutorial.
Pare um aplicativo com este comando (especifique o PM2 App name
ou id
):
- pm2 stop example
Reinicie um aplicativo com este comando (especifique o PM2 App name
ou id
):
- pm2 restart example
A lista de aplicativos atualmente gerenciados pelo PM2 também pode ser consultada com o list
subcomando:
- pm2 list
Mais informações sobre um aplicativo específico podem ser encontradas usando o info
subcomando (especifique o nome ou o ID do aplicativo PM2 ):
- pm2 info example
O monitor de processo PM2 pode ser puxado para cima com o monit
subcomando. Isso exibe o status do aplicativo, CPU e uso de memória:
- pm2 monit
Nota: A execução do monit
comando do PM2 bloqueará comandos adicionais até que o aplicativo seja finalizado pressionando CTRL+C
.
Agora que seu aplicativo Node.js está em execução e gerenciado pelo PM2, vamos configurar o proxy reverso.
Etapa 4 - Configurando um servidor proxy reverso Nginx
Agora que seu aplicativo está em execução e escutando um endereço IP privado, é necessário configurar uma maneira de seus usuários acessá-lo. Vamos configurar um servidor web Nginx como um proxy reverso para esse fim. Este tutorial irá configurar um servidor Nginx do zero. Se você já possui uma configuração de servidor Nginx, basta copiar o location
bloco no bloco de servidor de sua escolha (verifique se o local não entra em conflito com o conteúdo existente do servidor da Web).
No servidor web , vamos instalar o epel-release
pacote usando o yum:
- sudo yum install epel-release
Em seguida, instale o Nginx:
- sudo yum install nginx
Agora abra o arquivo de configuração do Nginx para edição:
- sudo vi /etc/nginx/nginx.conf
Primeiro, encontre a linha onde server_name
está definida, dentro do bloco do servidor padrão. Deve ser algo como isto:
server_name _;
Atualize o nome do servidor para substituir o sublinhado ( _
) pelo seu próprio nome de domínio pela server_name
diretiva (ou endereço IP, se você não tiver um domínio configurado).
server_name your-domain;
Em seguida, encontre a linha em que location /
está definida (geralmente algumas linhas abaixo do nome do servidor), dentro do mesmo bloco de servidor padrão. Deve ser algo como isto:
location / {
}
Substitua-o pelo seguinte bloco de código e substitua o endereço IP privado do servidor de aplicativos pelo APP_PRIVATE_IP_ADDRESS
. Além disso, altere a porta ( 8080
) se seu aplicativo estiver configurado para escutar em uma porta diferente:
location / {
proxy_pass http://APP_PRIVATE_IP_ADDRESS:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
Isso configura o servidor da web para responder às solicitações na raiz. Supondo que nosso servidor esteja disponível em your-domain
, acessar http://your-domain/
por meio de um navegador da Web enviaria a solicitação ao endereço IP privado do servidor de aplicativos na porta 8080
, que seria recebido e respondido pelo aplicativo Node.js.
Você pode adicionar location
blocos adicionais ao mesmo bloco de servidor para fornecer acesso a outros aplicativos no mesmo servidor da web . Por exemplo, se você também estivesse executando outro aplicativo Node.js. no servidor de aplicativos na porta 8081
, poderia adicionar este bloco de local para permitir acesso a ele via http://your-domain/app2
:
location /app2 {
proxy_pass http://APP_PRIVATE_IP_ADDRESS:8081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
Quando terminar de editar os blocos de localização dos aplicativos, salve e saia pressionando ESC
para sair do --INSERT--
modo, seguido :wq
de write
e quit
em um único comando.
No servidor web , reinicie o Nginx:
- sudo systemctl start nginx
Em seguida, queremos garantir que o Nginx seja executado sempre que o servidor reiniciar:
- sudo systemctl enable nginx
O enable
comando deve fornecer a seguinte saída
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
Você também pode confirmar se o Nginx está em execução e está ativado, solicitando seu status em systemctl
:
- sudo systemctl status nginx
O comando status produzirá informações de configuração para o serviço Nginx:
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2019-10-14 09:37:23 UTC; 3min 29s ago
Main PID: 12818 (nginx)
CGroup: /system.slice/nginx.service
├─12818 nginx: master process /usr/sbin/nginx
└─12819 nginx: worker process
Oct 14 09:37:23 centos-s-1vcpu-1gb-sgp1-01 systemd[1]: Starting The nginx HTTP and reverse proxy server...
Oct 14 09:37:23 centos-s-1vcpu-1gb-sgp1-01 nginx[12814]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Oct 14 09:37:23 centos-s-1vcpu-1gb-sgp1-01 nginx[12814]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Oct 14 09:37:23 centos-s-1vcpu-1gb-sgp1-01 systemd[1]: Failed to read PID from file /run/nginx.pid: Invalid argument
Oct 14 09:37:23 centos-s-1vcpu-1gb-sgp1-01 systemd[1]: Started The nginx HTTP and reverse proxy server.
Por fim, forneça ao Nginx a capacidade de retransmitir o tráfego através do SELinux ( Security-Enhanced Linux ). O SELinux fornece uma camada de segurança que implementa o Mandatory Access Control (MAC) no Kernel do Linux. Cada objeto do sistema operacional (processo, descritor de arquivo, arquivo etc.) é rotulado com um contexto do SELinux que define as permissões e operações que o objeto pode executar.
O Nginx é rotulado com o httpd_t
contexto e, como resultado, possui várias configurações bloqueadas pelo SELinux, a menos que seja explicitamente permitido. Para demonstrar isso, execute o seguinte comando para confirmar que o serviço Nginx está identificado httpd_t
:
- ps -eZ
Este comando fornece informações de status do processo, procure as informações específicas do processo do Nginx para ver o rótulo. Você verá httpd_t
, de maneira semelhante à seguinte:
...
system_u:system_r:httpd_t:s0 10208 ? 00:00:00 nginx
system_u:system_r:httpd_t:s0 10209 ? 00:00:00 nginx
...
Agora vamos verificar o status dos booleanos padrão relacionados ao httpd_t
rótulo SELinux. Podemos mostrar essas informações executando o seguinte comando:
- getsebool -a
Estamos interessados apenas nos httpd
booleanos relacionados a este tutorial:
...
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> off
httpd_dbus_sssd --> off
httpd_dontaudit_search_dirs --> off
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_graceful_shutdown --> on
httpd_manage_ipa --> off
httpd_mod_auth_ntlm_winbind --> off
httpd_mod_auth_pam --> off
httpd_read_user_content --> off
httpd_run_ipa --> off
httpd_run_preupgrade --> off
httpd_run_stickshift --> off
httpd_serve_cobbler_files --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_sys_script_anon_write --> off
httpd_tmp_exec --> off
httpd_tty_comm --> off
httpd_unified --> off
httpd_use_cifs --> off
httpd_use_fusefs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
httpd_use_openstack --> off
httpd_use_sasl --> off
httpd_verify_dns --> off
...
Os dois booleanos de nota particular são httpd_can_network_connect
e httpd_can_network_relay
. A documentação do Redhat fornece detalhes sobre cada um dos httpd
booleanos e suas funções associadas (caso você deseje saber mais sobre cada booleano), embora a seguir sejam apresentadas as explicações dos dois booleanos relacionados a este tutorial:
...
httpd_can_network_connect: When disabled, this Boolean prevents HTTP scripts and modules from initiating a connection to a network or remote port. Enable this Boolean to allow this access.
httpd_can_network_relay: Enable this Boolean when httpd is being used as a forward or reverse proxy.
...
Como nossa configuração é apenas retransmitir tráfego, precisamos apenas informar ao SELinux que o httpd
servidor, no nosso caso Nginx, pode usar a rede para retransmitir tráfego na configuração de proxy reverso que configuramos. Usaremos o -P
sinalizador para garantir que as alterações sejam permanentes (omitir esse sinalizador resultará na httpd_can_network_relay
reversão para seu estado padrão, desativado, após a reinicialização do servidor):
- sudo setsebool -P httpd_can_network_relay on
Supondo que seu aplicativo Node.js. esteja em execução e suas configurações de aplicativo e Nginx estejam corretas, você poderá acessar seu aplicativo através do proxy reverso do servidor da web . Experimente acessando o URL do servidor da Web (seu endereço IP público ou nome de domínio).
Nota: Se você também estava planejando usar o servidor da Web para hospedar outros sites (como hosts virtuais convencionais), também será necessário ativá httpd_can_network_connect
-lo.
Conclusão
Agora você tem seu aplicativo Node.js. em execução atrás de um proxy reverso Nginx. Essa configuração de proxy reverso é flexível o suficiente para fornecer aos usuários acesso a outros aplicativos ou conteúdo estático da Web que você deseja compartilhar.
Além disso, se você deseja criptografar transmissões entre o servidor da Web e os usuários, aqui está um tutorial que ajudará você a configurar o suporte a HTTPS (TLS / SSL) .
Esta resposta lhe foi útil?
Veja também
Introdução Até o momento, em nossa série Como codificar no Go , você usou o comando go runpara...
Introdução O Node.js é uma plataforma JavaScript para programação de uso geral que permite aos...
Introdução Devido a esses recursos, como o rápido desempenho de Entrada / Saída (E / S) e a...
Introdução Instruções condicionais fazem parte de toda linguagem de programação. Com instruções...
Introdução Se você estiver desenvolvendo um aplicativo Ruby on Rails , pode estar interessado em...