• My Del.icio.us

Mysql tmp table – Fast-Post

Bom,

hoje, lendo a documentação do Mysql , me deparei com uma informação interessante, e resolvi compartilhá-la aqui, lá vai….Muitas vezes quando executamos o EXPLAIN antes de uma query, por exemplo:

mysql> explain select * from internalmail

A coluna “Extra” pode exibir o seguinte conteúdo:

Using temporary; Using filesort

Se este valor aparecer, tome cuidado e prepare-se para analisar o que os desenvolvedores estão fazendo 🙂 . De qualquer forma, existe um workaround capaz de amenizar este problema, que é : aumentar o valor da diretiva “tmp_table_size” (http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_tmp_table_size),  ou seja, a diretiva que controla o tamanho máximo que uma tabela temporária pode ter. Vale lembrar, antecipadamente que: se uma tabela temporária em memória , criada pelo Mysql, superar o valor estabelecido nesta variável, a tabela será automaticamente modificada para uma tabela em disco, o que será ainda pior, sendo assim, tome cuidado e observe sempre as variáveis:

Created_tmp_tables / Created_tmp_disk_tables

Estas variáveis são contadores que indicam , respectivamente, quantas tabelas temporarias em memória e em disco foram criadas. ** Para obter estes valores execute no shell do Mysql:

mysql> SHOW GLOBAL STATUS LIKE ‘%Created_tmp%’

Um detalhe que observei apenas hoje está contido no texto abaixo e é o calcanhar de aquiles da configuração das tabelas temporarias :

If an internal temporary table is created initially as an in-memory table but becomes too large, MySQL automatically converts it to an on-disk table. The maximum size for in-memory temporary tables is the minimum of the tmp_table_size and max_heap_table_size values. This differs from MEMORY tables explicitly created with CREATE TABLE: For such tables, the max_heap_table_size system variable determines how large the table is permitted to grow and there is no conversion to on-disk format.

Se você leu o que está escrito acima, perceberá que a variável “max_heap_table_size”, também influencia no comportamento da criação de tabelas temporárias. Bom, agora vamos lá, como alterar esta variável….é simples abra o arquivo de configuração do Mysql e escreva:

tmp_table_size = <VALOR EM BYTES>

Se não quiser utilizar bytes pois não sabe fazer a conversão….utilize a letra “M” que indicará megabytes!

Bom fica ai a dica, espero que ajude algum ser humano ou alienígena !!

Python + MongoDB + Log do Apache

Posso dizer que este post começa do fim para o começo. Então, o fim segue abaixo:

# *-* coding: utf-8 *-*

from pymongo import Connection
from time import gmtime, strftime
import sys
import re

try:
fileAccess = open("/home/erick/temp/access_log","r",1)
except:
print "Falha ao abrir o arquivo"
sys.exit(1)

try:
db = Connection("192.168.1.169").analytics
except:
print "Ocorreu um erro ao conectar-se ao MongoDB"
sys.exit(1)

def mongoInsert(strAcLine):
remote_host, remote_logname, remote_user, date, first_line_request, method, requested_url, http, http_status_code, size_response, time_serve_request, referer , user_agent = strAcLine
db.analytics.insert({ "Remote_Host" : remote_host, "Remote_Logname" : remote_logname, "Remote_User" : remote_user, "Date" : date, "First_Line_Request" : first_line_request, "Method" : method, "Requested_Url" : requested_url, "Http" : http, "Http_Status_Code" : http_status_code, "Size_Response": size_response, "Time_Serve_Request" : time_serve_request, "Referer" : referer , "User_Agent": user_agent })

def mongoValues():
db.analytics.count()
http_st_code = db.analytics.find({"Http_Status_Code" : "304"})
for p in http_st_code:
print p["Ip_Src"]

# Loop que lê linha à linha até o fim do arquivo. OBS: não coloca todas as linhas em memória,
# apenas a linha atual
while file.readline(fileAccess):
strLines = file.readline(fileAccess)
strTemp = re.split(" ",strLines, 12)
mongoInsert(strTemp)

# Abre arquivo para escrita de LOG
logfile = open("/home/erick/temp/log.txt","w")

# Escreve a data no seguinte formado: Tue, 16 Nov 2010 21:02:32 +0000
logfile.write(strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()) + "\n")

# Faz consulta no MongoDB
mongoValues()

# Escreve a data no seguinte formado: Tue, 16 Nov 2010 21:02:32 +0000
logfile.write(strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()) + "\n")

# Fecha o arquivo que contém os dados à serem analisados
file.close(fileAccess)

# Fecha o arquivo de log
file.close(logfile)

# Finaliza a execução do script
sys.exit(0)

A proposta do script acima é pegar os dados de um arquivo de log de acesso do Apache e colocá-lo no MongoDB, para que a partir daí seja possível fazer algumas consultas no Banco de Dados. O script acima foi feito por mim apenas para teste e aprendizado, não estou seguindo nenhum padrão.

Os próximos posts irão explicar :

  • Como instalar o MongoDB;
  • Como instalar a extensão do MongoDB para Python;

MongoDB é alvo dos estudos que venho fazendo nas últimas semanas, espero poder compartilhar com todos o conhecimento que venho adquirindo.

Abraço à todos e até a próxima.

Lighttpd & Apache

Lighttpd & Apache

Bom , demorou mas consegui arranjar um tempo para um novo post. Espero que eu consiga arranjar mais algum tempo para postar aqui as coisas que venho testando e estudando.

A proposta deste post é possibilitar que o leitor consiga utilizar o Lighttpd para fornecer conteúdo estático aos seus usuários. Além também de tentar ensinar como utilizar PHP com FastCGI. Tenho certeza que esta post está incompleto, mas o que tenho escrito aqui já servirá de um ponto de partida. Em breve atualizarei o post com as referências 🙂 … Lembrando, este post baseia-se em distros Redhat-Like!

Instalando o lighttpd

Para instalar o lighttpd é necessário ativar o repositório adicional EPEL, com o seguinte comando:

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm

Feito isso execute:

yum install lighttpd lighttpd-fastcgi php

Após a instalação o diretório ”’/etc/lighttpd”’ este diretório conterá todos os arquivos de configuração deste servidor Web.

Ativando os módulos necessários

Assim como o Web Server Apache o Lighttpd vem com uma série de módulos que aumentam o número de funcionalidades, para ativar/desativar
módulos no lighttpd encontre a diretiva ”’server.modules”’ e faça as devidas alterações.Por padrão ative os seguintes módulos:

mod_access
mod_alias
mod_accesslog
mod_compress
mod_expire
mod_fastcgi

Configurando o módulo do fastcgi

Para configurar o módulo do fastcgi no Lighttpd adicione as seguintes entradas ao arquivo de configuração ”’/etc/lighttpd/lighttpd.conf”’ :

fastcgi.server = ( “.php” => ((
“bin-path” => “/usr/bin/php-cgi”,
“socket” => “/tmp/php.socket”
)))

Alterando a porta do Lighttp

Uma alteração importante à ser feita é alterar a porta em que o Lighttpd irá escutar as conexões, para isso, abra o arquivo de configuração do serviço “/etc/lighttpd/lighttpd.conf” , e procure pela diretiva “server.port” , altere o valor desta diretiva para “81” .

Alterações necessárias do Lighttpd

dir-listing.activate = “disable” # Desativa a listagem de diretórios. O padrão é “enable”

Caso o módulo “mod_compress” esteja ativado será necessário configurar as diretivas abaixo:

compress.cache-dir = “/var/cache/lighttpd/compress/”
compress.filetype = (“text/plain”, “text/html”, “application/x-javascript”, “text/css”)

Não devemos esquecer que o diretório de cache do Lighttpd não é criado por padrão, sendo assim é necessário criá-lo:

mkdir /var/cache/lighttpd/compress/
chown lighttpd.lighttpd /var/cache/lighttpd/compress/
chmod 0750 /var/cache/lighttpd/compress/

Feito isso reinicie o serviço:

service lighttpd restart

Configurando o Apache para acessar o Lighttpd

Para que o Apache possa acessar os dados do cliente no Lighttpd devemos ativar no Apache uma configuração de Proxy Reverso
para um diretório em específico, para que essa configuração funcione é necessário ativar os módulos:

proxy
proxy_http

Ativando esses módulos na configuração do Apache

<VirtualHost static-01.domain.com.br>
ServerName static-01.domain.com.br
ServerAlias static-01.domain.com.br

ProxyPass / http://static-01.domain.com.br:81/
ProxyPassReverse / http://static-01.domain.com.br:81
ProxyPreserveHost on
</VirtualHost>

O conf acima fará com que todas as requisições recebidas pelo Apache com destino ao host “static-01.domain.com.br” , sejam redirecionadas para o Lighttpd que está ouvindo na porta 81 .

Acho que com isso o sistema deverá funcionar….

Abraço à todos que lêem essa jabiraca deste blog !

Lighttpd & ApacheObservações Lighttpd:

– Não suporta .htaccess
– Mono thread

Instalando o lighttpd

Para instalar o lighttpd é necessário ativar o repositório adicional EPEL, com o seguinte comando:

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm

Feito isso execute:

yum install lighttpd lighttpd-fastcgi php

Após a instalação o diretório ”’/etc/lighttpd”’ este diretório conterá todos os arquivos de configuração deste servidor Web.

Ativando os módulos necessários

Assim como o Web Server Apache o Lighttpd vem com uma série de módulos que aumentam o número de funcionalidades, para ativar/desativar
módulos no lighttpd encontre a diretiva ”’server.modules”’ e faça as devidas alterações.Por padrão ative os seguintes módulos:

mod_access
mod_alias
mod_accesslog
mod_compress
mod_expire
mod_fastcgi

Configurando o módulo do fastcgi

Para configurar o módulo do fastcgi no Lighttpd adicione as seguintes entradas ao arquivo de configuração ”’/etc/lighttpd/lighttpd.conf”’ :

fastcgi.server = ( “.php” => ((
“bin-path” => “/usr/bin/php-cgi”,
“socket” => “/tmp/php.socket”
)))

Alterações necessárias do Lighttpd

dir-listing.activate = “disable” # Desativa a listagem de diretórios. O padrão é “enable”

Caso o módulo “mod_compress” esteja ativado será necessário configurar as diretivas abaixo:

compress.cache-dir = “/var/cache/lighttpd/compress/”
compress.filetype = (“text/plain”, “text/html”, “application/x-javascript”, “text/css”)

Não devemos esquecer que o diretório de cache do Lighttpd não é criado por padrão, sendo assim é necessário criá-lo:

mkdir /var/cache/lighttpd/compress/
chown lighttpd.lighttpd /var/cache/lighttpd/compress/
chmod 0750 /var/cache/lighttpd/compress/

Feito isso reinicie o serviço:

service lighttpd restart

Configurando o Apache para acessar o Lighttpd

Para que o Apache possa acessar os dados do cliente no Lighttpd devemos ativar no Apache uma configuração de Proxy Reverso
para um diretório em específico, para que essa configuração funcione é necessário ativar os módulos:

proxy
proxy_http

Ativando esses módulos na configuração do Apache

<VirtualHost static-01.domain.com.br>
ServerName static-01.domain.com.br
ServerAlias static-01.domain.com.br

ProxyPass / http://static-01.domain.com.br:81/
ProxyPassReverse / http://static-01.domain.com.br:81
ProxyPreserveHost on
</VirtualHost>

Instalando o Apache com PHP5

yum install httpd
yum install php-common php-gd php-mcrypt php-pear php-pecl-memcache php-mhash php-mysql php-xml

Alterando a porta da conexão do Apache

vim /etc/httpd/conf/httpd.conf

Procure pela linha que começa com “Listen” e altere a porta para “8080”

Desative as configurações de módulos desnecessários:

cd /etc/httpd/conf.d
mv manual.conf manual.conf.DISABLED
mv perl.conf perl.conf.DISABLED
mv proxy_ajp.conf proxy_ajp.conf.DISABLED
mv python.conf python.conf.DISABLED
mv squid.conf squid.conf.DISABLED
mv webalizer.conf webalizer.conf.DISABLED
mv welcome.conf welcome.conf.DISABLED
mv ssl.conf ssl.conf.DISABLED