{"id":136,"date":"2020-06-09T15:30:55","date_gmt":"2020-06-09T18:30:55","guid":{"rendered":"https:\/\/samueljr.top\/blog\/?p=136"},"modified":"2020-06-09T15:31:23","modified_gmt":"2020-06-09T18:31:23","slug":"cluster-moodle-servidor-de-aplicacao","status":"publish","type":"post","link":"https:\/\/goon.tec.br\/blog\/index.php\/2020\/06\/09\/cluster-moodle-servidor-de-aplicacao\/","title":{"rendered":"Cluster Moodle &#8211; Servidor de Aplica\u00e7\u00e3o"},"content":{"rendered":"<h3>Introdu\u00e7\u00e3o<\/h3>\n<p>Esse post faz parte de uma s\u00e9rie onde descrevo a montagem de um cluster moodle. O primeiro post, explicando todo o projeto pode ser visto <a href=\"https:\/\/goon.tec.br\/blog\/index.php\/2020\/06\/06\/cluster-moodle\/\">aqui<\/a>.<\/p>\n<p>O Apache \u00e9 o servidor HTTP que, junto com o PHP, executar\u00e3o o Moodle do nosso projeto. Existem outras alternativas como o Nginx e at\u00e9 o IIS da Microsoft, no entanto, o mais recomendado e amplamente utilizado \u00e9 o Apache.<\/p>\n<p>Este artigo visa a instala\u00e7\u00e3o e configura\u00e7\u00e3o do conjunto apache e php seguindo a documenta\u00e7\u00e3o oficial do moodle e as melhores pr\u00e1ticas. Um outro artigo tratando separadamente dos ajustes de performance ficar\u00e1 para um post futuro.<!--more--><\/p>\n<h3>Instalando o Apache 2<\/h3>\n<p>A instala\u00e7\u00e3o do apache via gerenciador de pacotes \u00e9 bem simples.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">apt-get install apache2<\/pre>\n<p>Neste caso, os servidores web estar\u00e3o atr\u00e1s de um balanceador e nosso certificado SSL v\u00e1lido estar\u00e1 nesse balanceador. No entanto, por seguran\u00e7a, \u00e9 necess\u00e1rio que a comunica\u00e7\u00e3o entre o balanceador e cada web server tamb\u00e9m seja criptografada. Para isso, criaremos um certificado auto assinado na primeira m\u00e1quina e compartilharemos com as demais.<\/p>\n<p>Habilitando o SSL no apache:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">apt-get install openssl\r\na2enmod ssl\r\na2ensite default-ssl\r\nsystemctl restart apache2<\/pre>\n<p>No primeiro servidor, vamos gerar o par de chaves:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">openssl req -x509 -nodes -days 1095 -newkey rsa:2048 -keyout \/etc\/ssl\/private\/apache-selfsigned.key -out \/etc\/ssl\/certs\/apache-selfsigned.crt<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-linenumbers=\"false\">\/certs\/apache-selfsigned.crt\r\nGenerating a RSA private key\r\n...........................+++++\r\n.................................................................+++++\r\nwriting new private key to '\/etc\/ssl\/private\/apache-selfsigned.key'\r\n-----\r\nYou are about to be asked to enter information that will be incorporated\r\ninto your certificate request.\r\nWhat you are about to enter is what is called a Distinguished Name or a DN.\r\nThere are quite a few fields but you can leave some blank\r\nFor some fields there will be a default value,\r\nIf you enter '.', the field will be left blank.\r\n-----\r\nCountry Name (2 letter code) [AU]:BR\r\nState or Province Name (full name) [Some-State]:Distrito Federal\r\nLocality Name (eg, city) []:Brasilia\r\nOrganization Name (eg, company) [Internet Widgits Pty Ltd]:Nome da Organiza\u00e7\u00e3o\r\nOrganizational Unit Name (eg, section) []:SIGLA\r\nCommon Name (e.g. server FQDN or YOUR name) []:moodle.exemplo.com\r\nEmail Address []:seu-email@gmail.com<\/pre>\n<p>Copiando o par de chaves para o outro servidor:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">scp \/etc\/ssl\/private\/apache-selfsigned.key usuario@10.0.0.12:\/home\/usuario\r\nscp \/etc\/ssl\/certs\/apache-selfsigned.crt usuario@10.0.0.0.12:\/home\/usuario<\/pre>\n<p>No segundo servidor:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">mv \/home\/usuario\/apache-selfsigned.key \/etc\/ssl\/private\/\r\nmv \/home\/usuario\/apache-selfsigned.crt \/etc\/ssl\/certs\/\r\nchmod 400 \/etc\/ssl\/private\/apache-selfsigned.key\r\nchmod 400 \/etc\/ssl\/certs\/apache-selfsigned.crt<\/pre>\n<p>Em ambos os servidores:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">vim \/etc\/apache2\/sites-enabled\/default-ssl.conf\r\n<\/pre>\n<p>Adicione ou altere as linhas para adicionarmos o certificado:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-linenumbers=\"false\">SSLCertificateFile      \/etc\/ssl\/certs\/apache-selfsigned.crt\r\nSSLCertificateKeyFile \/etc\/ssl\/private\/apache-selfsigned.key\r\n<\/pre>\n<p>Reinicie o Apache:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">systemctl restart apache2<\/pre>\n<h3>Instalando o PHP e extens\u00f5es necess\u00e1rias<\/h3>\n<p>Extens\u00f5es exigidas pelo Moodle:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">apt-get install libapache2-mod-php php-mbstring php-curl php-tokenizer php-token-stream php-xml php-xmlrpc php-soap php-zip php-gd php-intl php-json<\/pre>\n<p>Extens\u00f5es adicionais para a conex\u00e3o com o PostgreSQL e Redis:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">apt-get install php-pgsql php-redis<\/pre>\n<p>Habilitando o Opcache no PHP:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">vim \/etc\/php\/7.1\/apache2\/php.ini<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">;;;;;;;;;;; Moodle ;;;;;;;;;;;;\r\n;zend_extension = php_opcache.dll\r\nopcache.enable = 1\r\nopcache.memory_consumption = 128\r\nopcache.max_accelerated_files = 10000\r\nopcache.revalidate_freq = 60\r\n\r\n; Required for Moodle\r\nopcache.use_cwd = 1\r\nopcache.validate_timestamps = 1\r\nopcache.save_comments = 1\r\nopcache.enable_file_override = 0\r\n\r\n; If something does not work in Moodle\r\n;opcache.revalidate_path = 1 ; May fix problems with include paths\r\n;opcache.mmap_base = 0x20000000 ; (Windows only) fix OPcache crashes with event id 487\r\n\r\n; Experimental for Moodle 2.6 and later\r\nopcache.fast_shutdown = 1\r\nopcache.enable_cli = 1\r\n;opcache.load_comments = 0\r\n; May lower memory use, might not be compatible with add-ons and other apps.\r\n;;;;;;;;;;; Moodle ;;;;;;;;;;;;<\/pre>\n<h3>Verificando as Configura\u00e7\u00f5es<\/h3>\n<p>Vamos considerar que os arquivos do moodle estar\u00e3o no diret\u00f3rio \/var\/www\/moodle.<\/p>\n<p>Algumas configura\u00e7\u00f5es s\u00e3o recomendadas para aumentar a performance e a seguran\u00e7a do ambiente. As principais est\u00e3o destacadas abaixo.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">vim \/etc\/apache2\/sites-enabled\/default-ssl.conf<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">         DocumentRoot \/var\/www\/moodle\r\n \r\n         &lt;Directory \/&gt;\r\n                 Options FollowSymLinks\r\n                 AllowOverride None\r\n                 AcceptPathInfo on\r\n         &lt;\/Directory&gt;\r\n         &lt;Directory \/var\/www\/moodle\/&gt;\r\n                 DirectoryIndex index.php index.html index.htm\r\n                 Options FollowSymLinks MultiViews\r\n                 AllowOverride None\r\n                 AcceptPathInfo on\r\n                 Header Set Access-Control-Allow-Origin \"*\"\r\n                 &lt;Limit GET POST OPTIONS PROPFIND&gt;\r\n                         Order allow,deny\r\n                         Allow from all\r\n                 &lt;\/Limit&gt;\r\n                 &lt;LimitExcept GET POST OPTIONS PROPFIND&gt;\r\n                         Order deny,allow\r\n                         Deny from all\r\n                 &lt;\/LimitExcept&gt;\r\n         &lt;\/Directory&gt;<\/pre>\n<p>Alguns ajustes de mem\u00f3ria e upload para o moodle:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">vim \/etc\/php\/7.3\/apache2\/php.ini\r\n<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">upload_max_filesize = 20M\r\npost_max_size = 20M\r\nmemory_limit = 128M<\/pre>\n<p>Alguns ajustes para melhorar a seguran\u00e7a do Apache:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">vim \/etc\/apache2\/conf-enabled\/security.conf<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-linenumbers=\"false\">ServerTokens PROD\r\nServerSignature Off\r\nTraceEnable Off<\/pre>\n<p>Melhorando a prote\u00e7\u00e3o contra Cross-site scripting:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">a2enmod headers<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">vim \/etc\/apache2\/mods-enabled\/headers.conf<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">&lt;IfModule mod_headers.c&gt;\r\nHeader set X-XSS-Protection: \"1; mode=block\"\r\n&lt;\/IfModule&gt;<\/pre>\n<p>&nbsp;<\/p>\n<p>Nos pr\u00f3ximos posts, daremos seguimento com todas as instala\u00e7\u00f5es e configura\u00e7\u00f5es necess\u00e1rias para montarmos o ambiente descrito no primeiro post.<\/p>\n<ul>\n<li>Instala\u00e7\u00e3o dos servidores de aplica\u00e7\u00e3o Apache + PHP.<\/li>\n<li>Instala\u00e7\u00e3o do servidor de arquivos NFS.<\/li>\n<li>Instala\u00e7\u00e3o do servidor de banco de dados PostgreSQL.<\/li>\n<li>Instala\u00e7\u00e3o do servidor gerenciador de sess\u00e3o Redis.<\/li>\n<li>Backup e migra\u00e7\u00e3o do Moodle.<\/li>\n<\/ul>\n<h3>Contato<\/h3>\n<p><a href=\"https:\/\/goon.tec.br\/blog\/index.php\/contato\/\">Samuel Teixeira<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introdu\u00e7\u00e3o Esse post faz parte de uma s\u00e9rie onde descrevo a montagem de um cluster moodle. O primeiro post, explicando todo o projeto pode ser visto aqui. O Apache \u00e9 o servidor HTTP que, junto com o PHP, executar\u00e3o o Moodle do nosso projeto. Existem outras alternativas como o Nginx e at\u00e9 o IIS da [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":138,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[16,3,7],"tags":[33,29,31,12,30,38,32,34],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/posts\/136"}],"collection":[{"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=136"}],"version-history":[{"count":15,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/posts\/136\/revisions"}],"predecessor-version":[{"id":152,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/posts\/136\/revisions\/152"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/media\/138"}],"wp:attachment":[{"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=136"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=136"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=136"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}