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 optionsseçã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 sudoprivilé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:

Proxy reverso para aplicativo Node.js.

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 sudoprivilégios.

No servidor de aplicativos , vamos usar curlpara 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:

Output
  % 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 vipela digitação :qde quite 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 yumgerenciador de pacotes:

  • sudo -E bash nodesource_setup.sh

O script gera informações sobre a instalação para nossa referência:

Output
## 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 yumA limpeza do cache garantirá o yumuso 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 yumrepositórios ativados no momento Isso garantirá que nossas yumconsultas 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:

Output
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 curlcomando 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 vipara 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_ADDRESSitens destacados Se desejar, você também pode substituir a porta destacada,, 8080nos dois locais (certifique-se de usar uma porta não administrativa, 1024ou seja, superior):

hello.js
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 ESCpara sair do --INSERT--modo, seguido :wqde writequitem um único comando.

Esse aplicativo Node.js simplesmente escuta o endereço IP e a porta especificados e retorna "Hello World"com um 200có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 nodecomando 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:

Node Application Output
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 startcomando 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:

Output
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ 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 .jsextensã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 startupsubcomando.

startupsubcomando 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:

Output
[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:

Output
[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 pm2sem 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 nameou id):

  • pm2 stop example

Reinicie um aplicativo com este comando (especifique o PM2 App nameou id):

  • pm2 restart example

A lista de aplicativos atualmente gerenciados pelo PM2 também pode ser consultada com o listsubcomando:

  • pm2 list

Mais informações sobre um aplicativo específico podem ser encontradas usando o infosubcomando (especifique o nome ou o ID do aplicativo PM2 ):

  • pm2 info example

O monitor de processo PM2 pode ser puxado para cima com o monitsubcomando. Isso exibe o status do aplicativo, CPU e uso de memória:

  • pm2 monit

Nota: A execução do monitcomando 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 locationbloco 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-releasepacote 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_nameestá definida, dentro do bloco do servidor padrão. Deve ser algo como isto:

Trecho nginx.conf - nome_do_servidor (antes)
server_name _;

Atualize o nome do servidor para substituir o sublinhado ( _) pelo seu próprio nome de domínio pela server_namediretiva (ou endereço IP, se você não tiver um domínio configurado).

trecho nginx.conf - nome_do_servidor (depois)
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:

Trecho nginx.conf - local / (antes)
        location / {
        }

Substitua-o pelo seguinte bloco de código e substitua o endereço IP privado do servidor de aplicativos pelo APP_PRIVATE_IP_ADDRESSAlém disso, altere a porta ( 8080) se seu aplicativo estiver configurado para escutar em uma porta diferente:

Trecho do /etc/nginx/nginx.conf - local / (depois)
    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 locationblocos 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:

Configuração do Nginx - locais adicionais
    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 ESCpara sair do --INSERT--modo, seguido :wqde writequitem 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

enablecomando deve fornecer a seguinte saída

Output
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:

Output
● 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_tcontexto 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:

Output
...
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_trótulo SELinux. Podemos mostrar essas informações executando o seguinte comando:

  • getsebool -a

Estamos interessados ​​apenas nos httpdbooleanos relacionados a este tutorial:

Output
...
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_connecthttpd_can_network_relaydocumentação do Redhat fornece detalhes sobre cada um dos httpdbooleanos 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 httpdservidor, no nosso caso Nginx, pode usar a rede para retransmitir tráfego na configuração de proxy reverso que configuramos. Usaremos o -Psinalizador para garantir que as alterações sejam permanentes (omitir esse sinalizador resultará na httpd_can_network_relayreversã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

Como instalar o Webmin no Debian 10
Introdução O Webmin é um painel de controle da web moderno que permite administrar o servidor...
Como criar e instalar programas Go
Introdução Até o momento, em nossa série Como codificar no Go , você usou o comando go runpara...
Como adicionar e excluir usuários no Ubuntu 18.04
Introdução Adicionar e remover usuários em um sistema Linux é uma das tarefas mais importantes...
Configuração do GameCP
Como Ligar seu servidor SA-MP em GameCp e Conectar no Filezilla
Como executar a análise de sentimentos em Python 3 usando o Natural Language Toolkit (NLTK)
Introdução Uma grande quantidade de dados gerados hoje não é estruturada , o que requer...