curso servidores zope para plone 4

42
O Guia definitivo da instraestrutura de servidores Zope para Plone 4 Juliano Araújo Farias [email protected] Versão 0.1b 15/03/2011

Upload: zuadas

Post on 23-Nov-2015

59 views

Category:

Documents


17 download

TRANSCRIPT

  • O Guia definitivo da instraestrutura de servidores Zope para Plone 4

    Juliano Arajo [email protected]

    Verso 0.1b15/03/2011

  • SumrioO guia definitivo da insfraestrutura de servidores Zope para Plone 4..................................................3

    1Python............................................................................................................................................32Zope...............................................................................................................................................33Plone..............................................................................................................................................34Consideraes................................................................................................................................45Instalao de cluster Plone com arquitetura ZEO, para alta escalabilidade e performance..........4

    5.1 Plone 4...................................................................................................................................45.2 Plone 3.................................................................................................................................10

    6Infraestrutura de servios.............................................................................................................176.1 Apache.................................................................................................................................176.2 NGINX................................................................................................................................196.3 Squid...................................................................................................................................216.4 Varnish ................................................................................................................................276.5 Supervisord.........................................................................................................................296.6 Siege....................................................................................................................................316.7 Monitoramento de performance e qualidade de servios em cluster Plone........................31

    7Suplemento..................................................................................................................................327.1 Configurao do Squid.conf...............................................................................................327.2 Configuraes do squidRewriteRules.py............................................................................347.3 Configurao do rewrites.py...............................................................................................357.4 Configuraes para iRedirector.py......................................................................................357.5 Configurao do varnish-start.............................................................................................387.6 Configurao do varnish-stop.............................................................................................387.7 Configurao do varnish.vcl...............................................................................................387.8 Configurao do Supervidord.conf.....................................................................................41

    8Referncias...................................................................................................................................42

  • O guia definitivo da insfraestrutura de servidores Zope para Plone 4

    Antes de iniciarmos nossos estudos faz necessrio o conhecimento da arquitetura PZP, Python, Zope e Plone.

    1 Python

    Python uma linguagem de programao de alto nvel, interpretada, imperativa, orientada a objetos, de tipagem dinmica e forte. Foi lanada por Guido van Rossum em 1991. Atualmente possui um modelo de desenvolvimento comunitrio, aberto e gerenciado pela organizao sem fins lucrativos Python Software Foundation. Apesar de vrias partes da linguagem possurem padres e especificaes formais, a linguagem como um todo no formalmente especificada. O padro de facto a implementao CPython.

    A linguagem foi projetada com a filosofia de enfatizar a importncia do esforo do programador sobre o esforo computacional. Prioriza a legibilidade do cdigo sobre a velocidade ou expressividade. Combina uma sintaxe concisa e clara com os recursos poderosos de sua biblioteca padro e por mdulos e frameworks desenvolvidos por terceiros.

    O nome Python teve a sua origem no grupo humorstico britnico Monty Python,[4] criador do programa Monty Python's Flying Circus, embora muitas pessoas faam associao com o rptil do mesmo nome (em portugus, pton ou pito).

    2 Zope

    Zope um servidor de aplicaes web de cdigo aberto escrito na linguagem Python. Seu nome significa "Z Object Publishing Environment" (em portugus, "Ambiente de Publicao de Objetos Z"). Muitas tarefas de administrao de um servidor Zope podem ser realizadas atravs de uma interface web. Os objetos que o Zope publica na Web so escritos em linguagem Python, e tipicamente armazenados num banco de dados orientado a objetos, o ZODB, que integrado ao sistema.

    Objetos bsicos tais como documentos, imagens e modelos de pginas podem ser criados ou modificados via web. Objetos especializados, tais como wikis, blogs, e galerias de fotos esto disponveis como componentes adicionais (chamados products), e existe uma comunidade pujante de pequenas empresas criando aplicaes web como produtos.

    3 Plone

    Plone um Sistema de Gerenciamento de Contedo (CMS, de Content Management System) escrito na linguagem Python e que roda sobre um Servidor de Aplicaes Zope e sobre o

  • framework CMF (Content Management Framework).

    O Plone pode ser usado para a construo de portais de informao em intranets, extranets e na Internet. Pode ser usado tambm para construir sistemas de publicao de documentos ou at como ferramenta para trabalho colaborativo. O Plone roda em praticamente qualquer plataforma.

    4 Consideraes

    Trabalharemos na instalao do Plone 4, a evoluo da verso 3 para a 4 no olhar clnico de desempenho na utilizao do blob para armazenamento dos objetos arquivos.

    O curso ser voltado para a instalao com um tunning e com boas prticas.

    5 Instalao de cluster Plone com arquitetura ZEO, para alta escalabilidade e performance

    Neste captulo iremos ver instalao do Plone 3 e 4 explicando as diferenas em relao do banco de dados (ZODB), noes de como o Zope faz o cache desses objetos e algumas dicas de melhoramento de desempenho.

    5.1 Plone 4

    O curso baseado na nova verso do Plone que a 4.0.2 de novembro de 2010, o download estar disponvel no portal http://www.plone.org

  • Imagem 1: Download da verso do plone

    Imagem 2: downloads disponvel por S.O.

    Baixe a verso Unidied Installer for Linux/BSD/Solaris/OS-X. Full-source kit, builds Python, Zope, Plone, desconpacte o arquivo baixado.

    Linha de comando 1: download e instalao do plone 4.0.2Para a instalao do Plone 4.0.2 ser necessrio a instalao de umas dependncias primrias

    que o python-dev e o build-essential

    Linha de comando 2: comando de instalao de dependnciasAps o download e compilao das dependncias iremos instalar, volte para o seu usurio [ctrl+D], na pasta onde foi descompactado o plone [Plone-4.0.2-UnifiedInstaller], execute o comando para a instalao.

    $ mkdir treinamento && treinamento

    $ mkdir src && cd src

    $ wget http://launchpad.net/plone/4.0/4.0.2/+download/Plone-4.0.2-UnifiedInstaller.tgz

    $ tar -zxvf Plone-4.0.2-UnifiedInstaller.tgz

    $ sudo su -

    [sudo] password for juliano:

    # apt-get install python-dev build-essential

    $ sh install.sh zeo password=admin target=/{home}/treinamento/plone-4.0.2 --with-python=/usr/bin/python

  • Linha de comando 3: comando de instalaoDica: para saber onde esta o python na sua mquina utilize o comando which.

    Aps instalado entre na pasta e faa a listagem dele, voc ver como ele se estrutura, lembrando que o usurio e senha definido na linha de comando 3 foi admin:admin.

    Linha de comando 4: lista de estruturaMostrando a principal mudana da nova verso, o filestorage, dentro da pasta [plone-

    4.0.2/zeocluster], execute o comando abaixo.

    Linha de comando 5: configuraes do blobEssa implementao do blob j funciona a partir do plone 3 quando termos o pacote

    plone.app.blob (http://pypi.python.org/pypi/plone.app.blob/1.3), o problema da utilizao do blob dentro do plone 3 requisito necessrio o ZODB 3.8.

    No podemos confundir o blob com as implementaes antiga o FileSystemStorage (http://plone.org/products/filesystemstorage/releases/2.6.4) ou localfs, eles tem mais ou menos a mesma ideia mais no tem a mesma qualidade. Outro problema nesse tipo de implementao que ele se trata de um gato onde voc no poder utilizar o que h de melhor no blob que : controle de tamanho do Data.fs, servir o arquivo via stream e fcil manuteno do banco com pack.

    No mesmo arquivo podemos ver a parte de configurao do usurio no bloco , vamos colocar o zeoserver no ar, saia do arquivo aberto [utilize :q].

    $ cd ~/treinamento/plone-4.0.2

    $ ls

    buildout-cache Plone-docs Python-2.6 zeocluster

    $ cd zeocluster

    $ ls

    adminPassword.txt buildout.cfg PloneController.app var base.cfg develop.cfg

    products version.cfg bin develop-eggs README.html zope_versions.cfg

    bootstrap.py parts src

    $ vim parts/zeoserver/etc/zeo.conf

    path {home}/treinamento/plone-4.0.2/zeocluster/var/filestorage/Data.fs

    blob-dir {home}/treinamento/plone-4.0.2/zeocluster/var/blobstorage

    ...

    $ cd parts/zeoserver/bin

    $ ./zeoctl start

    daemon process started, pid=5365

  • Linha de comando 6: iniciando o zeoserverDica: para escutar a porta do seu servio utilize netstat -a -n --inet e para ver se o processo esta rodando ps afx utilize se quiser um filtro com pipe.

    Em modo ZEO (ver Linha de comando 3) ele cria duas instncias [cliente1, client2], vamos observer as configuraes das instncia.

    Linha de comando 7: abrindo as configuraes da instnciaHouveram algumas mudanas desde a ltima verso do Plone, o nmero de Threads por

    zserver de 2, onde cada thread ocupa 10000 objetos declarados em cache-size, que na outra verso era um pouco deficiente, o padro eram de 4 threads. O zope vai alocar por thread cpia da outra thread,

    O servio de banco servido pela rede, neste caso localhost, o ideal para empresas que trabalham com hospedagem de portais em quantidade ou em volume de banco estar em outro servidor. E a grande mudana com o python 2.6.x o cache-size 128MB que faz com mais eficincia

    O ZODB (Zope Object Database), faz um tratamento otimista, parte do pressuposto que no

    $ cd ~/treinamento/plone-4.0.2/zeocluster/parts/client1/etc

    $ vim zope.conf

    default-zpublisher-encoding utf-8

    effective-user juliano

    zserver-threads 2

    cache-size 10000

    blob-dir /{instncia do zope}/zeocluster/var/blobstorage

    shared-blob-dir on

    server 127.0.0.1:8100

    storage 1

    name Zeostorage

    var {instncia do zope}/zeocluster/parts/client1/var

    cache-size 128MB

    ...

  • ocorrer nada ao contrrio dos bancos persimista que tem vrios salva-guardas para quando qualquer problema ocorra ele tente resolver, esse modelo tradicional faz bloqueios de registros ou de pginas de registros.

    O Zope ele foi planejado para plataforma web onde naturalmente tem mais requisies de leitura que escrita, em um eventual caso onde tenho duas thread acessando o mesmo arquivo a segunda thread que pegou o arquivo inconsistente dar um rollback e re-executar, dando mais eficincia, esse controle possvel pelo uso de timestamp.

    Para isso ser possvel o servidor zope em cada thread carrega uma cpia de todos objetos que aquela thread t carregando, tericamente se voc tiver um banco de dados de 1GB voc ter 4GB carregados na memria deixando o site um foguete, mas n prtica isso impossvel porque o banco de dados sempre ser maior que a memria do hardware.

    Nos itens que iremos discutir mais a frente, teremos que fazer um processo de investigao para saber onde esta o gargalo do meu site, e fazer o tunning no Zope, no tamanho do Cache por exemplo, vamos inicializar as instncias.

    Linha de comando 8: iniciando o servidor

    Acesse no seu navegador: http://localhost:8080/ e voc acessar uma tela como a que se encontra abaixo.

    Imagem 3: pgina de funcionamento

    $ cd ~/treinamento/plone.4.0.2/zeocluster

    $ bin/startcluster.sh

    zeoserver: . . .

    daemon process started, pid=30631

    client1: . . . . . . . . . .

    daemon process started, pid=30636

    client2: . . . . . . .

    daemon process started, pid=30642

  • Entrando na ZMI (Zope Management Interface) voc adiciona ao fim da URL manage (http://localhost:8080/manage), ir pedir usurio admin e senha que informamos na linha de comando 3.

    Imagem 4: ZMI

    Em [Control_Panel > Database Management > main] e voc ter informaes sobre o banco (ver imagem 5) e clicando na aba Cache Parameters voc ver as configuraes e objetos em cada instncia (ver imagem 6).

    Imagem 5: database

  • Imagem 6: Cache parameters

    Em [Target number of objects in memory per cache] esta definido os 10.000 (dez mil) que informamos dentro do zope.conf.

    5.2 Plone 3

    Instalando o plone 3 na mquina, dentro do portal (plone.org) em downloads do plone tem a seo de releases (ver imagem 1, em older releases), baixe a ltima verso do plone 3, neste caso a 3.3.5 (ver imagem 7).

    Imagem 7: Older releases for Plone

    O processo de instalao bem parecido com o plone 4, atentando-se a uma pendncia que de preferncia seja instalada para o filesystem do S.O., o libjpeg-dev (ver a verso para seus sistema operacional, no caso do S.O. que estamos utilizando o libjpeg62-dev), existem outras libs recomendveis que podemos compilar antes da compilao do Plone 3.3.5 [ssh, build-essential, libreadline-dev, zlib1-dev, python2.4-dev, libxml2-dev, python2.4-libxml2, libjpeg-dev, libpng-dev, libgif-dev, libtiff-dev, libfreetype6-dev, libssl-dev, subverssion, tree], que mais na frente com o uso mais forte do Plone ir precisar. Vamos a instalar a dependncia e logo aps o Plone 3.3.5.

  • Linha de comando 9: instalando dependncia e o plone 3.5.5

    Quando estiver instalando voc observar que o script baixar e instalar o Python 2.4.6, porque para a verso 3 do Plone utilizado esta verso, vale ressaltar que o Python ser compilado dentro da pasta da instncia, a qual definimos na ltima linha do comando 9, no tem problema em ter vrias verses do Python na mquina apenas tem que ter o cuidado de utilizar a verso certa para seu Plone.

    Aps a instalao e iniciao do Plone 3 voc porder acessar via navegador http://localhost:8080 para ver tela de instalao e para acessar a ZMI segue o mesmo do Plone 4 http://localhost:8080/manage ver imagens abaixo.

    $ sudo su -

    [sudo] password for juliano:

    # dpkg list | grep -i libjpeg

    ii libjpeg62 6b-16.1 The independete JPEG Group's JPEG runtime library (version 6.2)

    # apt-get install libjpeg62-dev

    Configurando libjpeg62-dev (de .../libjpeg62-dev_6b-16.1_i386.deb)

    # exit

    sair

    $ cd ~/treinamento/src

    $ wget http://launchpad.net/plone/3.3/3.3.5/+download/Plone-3.3.5-UnifiedInstaller.tgz

    $ tar -zxvf Plone-3.3.5-UnifiedInstaller.tgz

    $ cd Plone-3.3.5-UnifiedInstaller

    $ ./install zeo --password=admin target=/{home}/treinamento/plone-3.5.5

    $ cd ../plone-3.5.5/zeocluster/

    $ bin/startcluster.sh

    zeoserver: . . daemon process started, pid=1443

    This is the first start of this instance.

    Creating Data.fs and a Plone site.

    We only need to do this once, but it takes some time.

    Creating Plone site at /Plone in ZODB. . .

    Installed Plone standard content

    Finished adding Plone site

    client1: . . daemon process started, pid=1513

    client2: . . daemon process started, pid=1517

  • Imagem 8: acessando o plone 3

    Imagem 9: acessando a ZMI do Plone 3

  • Imagem 10: Control_Panel do Plone 3

    Imagem 11: Database main plone 3

    Na imagem 10 podemos ver informaes sobre a verso do Zope, Python e onde esta instalado o Plone, o Zope e os clientes, na imagem 11 podemos observar que o Plone trabalha com 4 threads alocando 5 mil objetos totalizando 20 mil objetos carregados na memria, nesta verso quando era necessrio um tunning colocava 2 threads e 10 objetos, a comunidade que desenvolve

  • deixou padro j no plone 4, sem contar o uso do blob para armazenar imagem e arquivos, vamos observar os arquivo de configurao zeo.conf e o z

    Linha de comando 10: acessando as configuraes do zeo.conf e zope.conf

    A diferena do storage esta na definio de objetos do ZODB que so de 5 mil objetos (ver imagem 11) e 30 mb no cache-size de 30 MB que foi aumentado consideravlmente na verso 4 era de 128MB, alm de no declarar a quantidade de threads, admitindo que o padro de threads do Plone 3 so 4 (ver imagem 11).

    O mais importante termos uma camada de cache compatvel com o desempenho que desejamos, se observarmos a na imagem 11 temos 8.392 objetos e a thread tem uma alocao de 5.000 objetos, na viso utpica seria coloca todos objetos dentro da thread, s que isso no

    $ pwd

    /{home}/treinamento/plone-3.5.5/zeocluster/

    $ vim parts/zeoserver/etc/zeo.conf

    path /{home}/treinamento/plone-3.5.5/zeocluster/var/filestorage/Data.fs

    $ vim parts/client1/etc/zope.conf

    # Main database

    cache-size 5000

    # ZEOStorage database

    server 127.0.0.1:8100

    storage 1

    name zeostorage

    var /{home}/treinamento/plone-3.5.5/zeocluster/parts/client1/var

    cache-size 30MB

    mount-point /

    ...

  • possvel porque o banco sempre ser maior do que a quantidade de memria fsica. O total do Number of active objects ser no mximo igual ao Target number of objects in memory per cache, que o default do Plone 3 de 5000 (cinco mil), j o Total active and nom-active objects ser maior, isto no significa que ele esta alocado na memria.

    Uma tcnica de melhorar o desempenho aumentando o nmero de objetos por threads de forma progressiva para que o mnimo de objetos no fiquem non-active, lembrando que quanto maior o nmero de objetos por threads eu aumentar maior ser o consumo de memria, no sendo interessante que as instncia consuma memria demais um problema comum o sistema operacional vai se degradando a partir do momento que ele vai paginar muita memria.

    Mas quanto eu posso colocar por thread no meu servidor? Imagine que voc tenha 4GB de memria na mquina e deseja alocar 10.000 (dez mil) objetos por thread, sabendo que so 4 thread ento teremos 40.000 (quarenta mil) objetos alocados em memria, e se cada objeto tiver 100k ento temos 4.000.000k (quatro milhes) alocados na memria tornando-se inaceitvel para o servidor.

    Como podemos resolver? Teramos que fazer com que o plone consuma a quantidade maior de memria disponvel sem d swap. O entende-se por no d swap? No simplesmente no consumir o Swap, no consumir o swap e ainda ter uma memria de cache pro teu S.O. fazer cache de acesso ao disco.

    Imagem 12: mquina sem d swapEssa imagem acima imagem uma mquina com 8GB de memria RAM, mas o servidor esta

    consumindo apenas 1.37GB em mdia 1.35GB, neste exemplo no esta sendo um disperdcio de memria, esta imagem ilustra que boa parte da memria esta disponvel para cache, e toda operao de I/O do linux ela cacheada, sabendo que a memria muito mais rpido que um disco rgido por mais que seja essa nova tecnologia SSD[1] que usa memria flash, por mais rpido que seja mais lento que acesso a memria, ento como o Kernel do Linux funciona, ele vai acessar uma rea do disco e aquela regio cadastrado na memria, se o prximo acesso a esta regio no sofreu modificao ele carregar da memria. E neste exemplo apenas 286.14MB em mdia esto inutilizvel.

  • Imagem 13: mquina com cache afogado

    Neste caso o cache t afogado e t usando 1.9GB do Swap, e uma pequena linha azul abaixo do swap que livro que 299MB, neste caso temos um problema de potencial, causando um problema de I/O porque o sistema operacional no t dando mais conta, no da mais vazo as requisies, porque no tem mais rea para cache.

    Analisando atravs de um simples free -m temos as seguintes informaes:

    Linha de comando 11: utilizando o free -mTemos nesta mquina um total de 1545 MB de memporia de Swap desses, esta sendo

    utilizado 334 MB, tornando o desempenho da mquina baixo, porque esta mquina esta usando o disco para paginar memria.

    O ZODB (Zope Object Database) ele no como um banco de dados relacional que tem SQL para acessar o banco e uma estrutura de ndice prpria, para fazer isso no ZODB o Zope utiliza o objeto portal_catalog.

    Ento com essa implementao de ndice no Zope se trata de uma estutura de listas ligadas invertida que uma estrutura clssica de banco tradicional. E todo objeto tratado no portal_catalog como metadados o que ser bem pequeno logo eu posso superdimensionar meu cache s para o portal_catalog.

    # free -m

    total used free shared buffers cached

    Mem: 1004 996 7 0 93 61

    -/+ buffers/cache: 841 162

    Swap: 1545 334 1210

  • Toda escrita no portal far uma alterao no meu cache j alocado no ZODB dos 10.000 (dez mil) por thread e essas informaes do portal_catalog so pequenas, seria interessante eu separar ele do cache global e fazer um cacheamento pra ele, assim eu no iria sobrescrever um objeto de por exemplo 1MB de um PDF por uma metadado de 10k, fazendo que na prxima consulta a este PDF eu tenha novamente que cachear ele, isso se tonar constante em portais muito grande.

    Em resumo o que teremos de vantagens fazendo essa modificao na estrutura do ZOPE, precisamento no zope.conf:

    Podemos ter cache diferentes configurando o zope.conf para seu contedo principal e para o catalgo de objetos;

    Podemos fazer backup do portal_catolog separado;

    Teremos arquivos de banco separado, isto dando um possibilidade e estar em maquina diferente;

    Ganho de performance.

    Para realizar temos um tutorial how-to no site do Plone.org[2] e no livro The Definitive Guide to Plone[3].

    6 Infraestrutura de servios

    Nesta tpico iremos ver uma instalao bsica do Apache e nginx, com aprofundamento em Squid, Varnish, Supervisord.

    6.1 Apache

    A primeira regra na utilizao do Apache[4] [5] para pginas de internet no colocar o Apache para fazer cache de pginas para isso existe o Squid e o Varnish. O objetivo do Apache ser servidor web servindo pginas estticas ou fazer proxy reverso para uma instncia.

    Linha de comando 12: Instalao do apache2Para ver se o Apache esta rodando s acessar o browser no localhost, e aparecer uma

    mensagem deste tipo:

    $ sudo su -

    sudo password for juliano:

    # apt-get install -y apache2

  • Imagem 14: Tela de funcionamento do Apache

    Iremos precisar acessar o localhost pelo nome da mquina, para saber qual ou colocou outro nome, edite o arquivo localizado em /etc/hostname. Com isso assim que acessarmos pelo nome da mquina ele carregue o plone site.

    Iremos necessitar habilitar alguns mdulos do Apache, o ubuntu tem um aplicativo chamado a2enmod que ele auxilia habilitar o mdulo rewrite e proxy_http

    Linha de comando 13: habilitando os mdulos do apacheAdicione na ltima linha do apache2.conf o nome do servidor.

    Linha de comando 14: adicionando servername no apache2.confConfigurando o Apache para receber as requisies e jogar para o Plone site criado.

    Linha de comando 15: configurando o mod_rewrite

    # a2enmodYour choices are: actions alias asis auth_basic auth_digest authn_alias authn_anon authn_dbd authn_dbm authn_default authn_file authnz_ldap authz_dbm authz_default authz_groupfile authz_host authz_owner authz_user autoindex cache cern_meta cgi cgid charset_lite dav dav_fs dav_lock dbd deflate dir disk_cache dump_io env expires ext_filter file_cache filter headers ident imagemap include info ldap log_forensic mem_cache mime mime_magic negotiation proxy proxy_ajp proxy_balancer proxy_connect proxy_ftp proxy_http proxy_scgi reqtimeout rewrite setenvif speling ssl status substitute suexec unique_id userdir usertrack version vhost_aliasWhich module(s) do you want to enable (wildcards ok)? rewrite proxy_http

    # vim /etc/apache2/apache2.conf

    ServerName juliano-VirtualBox

    :wq

    # vim /etc/apache2/site-avaliable/default

    ServerAlias juliano-VirtualBox

    RewriteEngine On

    RewriteRule ^/(.*) \

    http://localhost:8080/VirtualHostBase/http/{SERVER_NAME}:80/site/VirtualHostRoot/$1 [L,P]

  • Dica: na linha de comando 15 onde tem [L,P] o P significa que far proxy e o L ser a ltima linha de reescrita. Para saber mais sobre regras do mod_reweite consulte o site Apache Module [6].

    No comeo da regra est pegando todas as requisies da porta 80 e reescrevendo para o Plone Site. Onde tem [.../site/...] colocar o nome do Plone Site criado na sua instncia do Plone.

    Para efeito de ter uma comparao faremos uma baseline do desempenho do portal utilizando o Apache Benchmarkting Tool [7].

    Linha de comando 16: Baseline do desempenho Plone 3

    Linha de comando 17: Baseline do desempenho Plone 4

    6.2 NGINX

    O Nginx[8] [9] foi desenvolvido por um Russo, e a principal diferena entre o Apache e o Nginx a escalabilidade do Nginx em consumo do processador mais eficiente[10].

    Linha de comando 18: instalao e 'startando' do nginx

    $ ab -n 100 -c 10 http://juliano-VirtualBox/

    Concurrency Level: 10Time taken for tests: 42.408 secondsComplete requests: 100Failed requests: 0Write errors: 0Total transferred: 2116500 bytesHTML transferred: 2082200 bytesRequests per second: 2.36 [#/sec] (mean)Time per request: 4240.800 [ms] (mean)Time per request: 424.080 [ms] (mean, across all concurrent requests)Transfer rate: 48.74 [Kbytes/sec] received ...

    ...Concurrency Level: 10Time taken for tests: 26.401 secondsComplete requests: 100Failed requests: 0Write errors: 0Total transferred: 1474200 bytesHTML transferred: 1445900 bytesRequests per second: 3.79 [#/sec] (mean)Time per request: 2640.070 [ms] (mean)Time per request: 264.007 [ms] (mean, across all concurrent requests)Transfer rate: 54.53 [Kbytes/sec] received ...

    # apt-get install nginx

    # /etc/init.d/nginx start

  • Alm disso ele consome pouco recurso para vrias conexes simultneas, coisa que o Apache no consegue. Isto ocorre porque o Apache ir abrir um nova thread apache a cada processo ou a cada thread isso faz com que ele faa uma cpia de todos os mdulos e ocupando muita memria.

    O Nginx tem uma compilao muito tradicional ele apenas pendura uma quantidade pequena de usurios simultneos que restringido por configuraes padres do Kernel, para ver o limite s digital no console ulimit -a e ele ter uma varivel [open file] limitada a 1024 que essa varivel no s utilizvel para arquivos abertos do disco mais pra sockets de conexo do nginx ele caracterizado como file descriptor[11].

    Linha de comando 19: Varivel de Kernel open filesDica: Para modificar o open file eu utilizo o comando ulimit -n 2048 ele ir dobrar e depois compilo o nginx modificando o file descriptor.

    Para configurar o Plone no Nginx precisamos criar dentro de /etc/nginx um arquivo proxy.conf, voc pode encontrar no Tips & Tricks[12].

    Linha de comando 20: Criando arquivo proxy.conf

    $ ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 20file size (blocks, -f) unlimitedpending signals (-i) 16382max locked memory (kbytes, -l) 64max memory size (kbytes, -m) unlimitedopen files (-n) 1024pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 8192cpu time (seconds, -t) unlimitedmax user processes (-u) unlimitedvirtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited

    # cd /etc/nginx

    # vim proxy.conf# proxy.confproxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;client_max_body_size 0;client_body_buffer_size 128k;proxy_connect_timeout 90;proxy_send_timeout 90;proxy_read_timeout 90;proxy_buffer_size 4k;proxy_buffers 4 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k;

  • Aps tem que editar o arquivo default e adicionar a regra para ele acessar o Plone, toda essas instrues pode ser encontrado na prpria documentao do Nginx[13].

    Linha de comando 21: Configurando rewrite e proxy_pass no Nginx

    Porque importante colocar o Apache ou o Nginx na frente ao invs do Zope? Como o Zope, Tomcat ou at o JBOSS eles no tem alocaes dinmicas de Threads. Logo se eu coloca-los direto na porta 80 teremos problemas no desempenho porque haver um numero grande de concorrncia em um numero limitado de Threads, assim durante o tempo de servio de informaes pela Thread far as outras requisies ficar em espera.

    Quando requisitamos um arquivo do Plone atravs do Apache ou Nginx, eles faro a requisio ao Zope, ele por sua vez serve o arquivo para a outra aplicao local e o Apache ou Nginx serve aos poucos de acordo com a conexo de internet do requisitor.

    6.3 Squid

    O Squid um servidor proxy que suporta HTTP, HTTPS, FTP e outros. Ele reduz a utilizao da conexo e melhora os tempos de resposta fazendo cache de requisies freqentes de pginas web numa rede de computadores. Ele pode tambm ser usado como um proxy reverso.

    O Squid foi escrito originalmente para rodar em sistema operacional tipo Unix, mas ele tambm funciona em sistemas Windows desde sua verso 2.6.STABLE4. [14]

    A deia de usarmos o Squid na frente do Plone compartilhar cache, quando o cliente solicitar uma pgina ele no tenha que ser re-processada no servidor, isto , que uma cpia da pgina solicitada seja armazenada devidamente no proxy.

    Dica: para desabilitar APIs que possam atrapalhar utilizar no Ubuntu [update-rc.d -f remove].

    Seguiremos o roteiro para baixar, configurar e compilar o Squid 2.7 Stable 9.

    # cd /etc/nginx/site-enable# vim default... location / { root /var/www; index index.html index.htm;

    rewrite ^(.*)$ /VirtualHostBase/http/$server_name:80/Plone/VirtualHostRoot$1 break; proxy_pass http://127.0.0.1:8080; }...

  • Linha de cdigo 22: instalao do Squid 2.7Quando formos instalar o Squid precisamos habilitar com operaes de E/S assncronas[14],

    na instalao do Squid padro as operaes so sncronas. As aplicaes Nginx, Varnish e os sistemas operacionais Linux Kernel 2.6 ou superior, FreeBSD 6 ou superior tem as operaes E/S assincronas nativas, no caso do Squid 2.7 ou superior tem que habilitar o [aufs], para mais opes s digitar [sh configure help].

    Dica: Criar um link simblico da pasta squid-2.7-s9, para facilitar na hora de compilar nova verso do Squid em um futuro, ou quando for referenciar ele em alguma configurao.

    Vamos utilizar uma configurao j adaptada para Plone, e fazemos um backup do squid.conf.

    Linha de cdigo 23: Criao dos arquivos de configuraoExplicando algumas linhas do squid.conf:

    [http_port 80 vhost] estou declarando que ele vai funcionar na porta 80 no modo vhost;[cache_dir aufs /dir/ 16384 32 512] estou declarando onde ser meu diretrio de cache

    utilizando a operaes E/S assncronas grandando em aproximadamente 16GB de cache disposto em uma rvore de 32 diretrios e cada diretrio ter 512 diretrios;

    [cache_effective_user] informo qual usurio ser responsvel por rodar o squid, que dever ter permisso de escrita no diretrio de log e no diretrio de cache;

    [access_log, cache_log] onde ir escrever os arquivos de log, no cache_log ir aparecer todos os erros,

    alertas do squid;

    # sudo su -[sudo] password for juliano:# cd /{home}/treinamento/src# apt-get install build-essential# wget http://www.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE9.tar.gz# tar -zxf squid-2.7.STABLE9.tar.gz# cd squid-2.7.STABLE9# sh configure prefix=/{home}/treinamento/zope/squid-2.7-S9 --enable-storeio=ufs,aufs# make# make install

    # cd /{home}/treinamento/zope/squid/etc

    # mv squid.conf squid.conf-OLD

    # vim squid.conf

    >

    # vim iRedirector.py

    >

    # vim rewrites.py

    >

    # vim squidRewriteRules.py

    >

  • [cache_store_log] no faramos log do storege;[log_icp_queries] Log do internet cache protocol ele responsvel pela comunicao entre

    diversos servidores de cache;[cache_mem] defino quanto vamos utilizar para rea privilegiada de troca, o Squid

    dispem de um algortimo que ver quais reas do site mais acessadas e deixar alocada nesse espao;

    [maximum_object_size] defino o tamanho mximo que iremos colocar no cache do proxy por objeto;

    [maximum_object_size_in_memory] informo o tamanho mximo do objeto que ser colocado no cache_mem;

    [acl all src, acl localhost src] defino onde ser aplicado meus access control levels;[acl zope_servers src] defino onde ser aplicado no zope o acl;[acl squid_servers src] defino onde ser aplicado o servidor Squid, se for a mesma mquina

    colocar um IP real da mquina, para o Squid no querer cachear ele mesmo;[acl webdav method] informo quais mtodos de webdav ser negado;[acl frontpage urlpath_regex, acl frontpage urlpath_regex, http_access deny frontpage] bloqueios para bots da microsoft, como no teremos aplicao

    da Microsoft rodando bloqueia a indexao deles;[acl badrobot browser -i, http_access deny badrobot] bloqueios para robots de indexao russo, chins, japneses;[acl bot browser -i, acl horario_comercial time MTWHF 06:00-23:00, http_access deny bot horario_comercial ] bloqueios dos robots do google, yahoo, bing s

    fazerem indexao no horrio e dias determinados;[acl url_plone urlpath_regex -i, http_access deny bot url_plone] determino quais pginas os robots no indexem em tempo

    algum;[acl purge method PURGE] define o mtodo para expurgar pginas antigas do cache;[http_access allow zope_servers purge] informo que s os servidores zope tem a permisso

    de expurgar contedos do cache;[http_access deny purge] negando expugaes por outros meios, inclusive de usurios

    annimos;[http_access deny webdav, http_access allow manager localhost, http_access allow manager squid_servers, http_access deny manager] combinaes de permies para acesso de manage atravs do

    servidor Squid e localhost e negao para acesso de webdav;[acl accelerated_domains dstdomain, acl accelerated_ports myport 80, acl accelerated_protocols proto http, http_access allow accelerated_domains accelerated_ports accelerated_protocols]

    Informamos que o Squid s ser proxy reverso apenas para o domnio onde esta hospedado o Plone;[acl vs dst 127.0.0.1, http_access allow vs always_direct allow vs redirector_access deny vs] Permitir mquinas da rede interna onde os virtual server (vs)

    possam acessar via http direto e no precise fazer re-escrita de urls;[never_direct allow all] foro os acessos externos passarem pelas polticas do nosso proxy;[icp_access allow all] permitir acesso UDP ao proxy;[url_rewrite_program] informo qual ser meu programa para redirecionamento;[url_rewrite_children,

  • url_rewrite_concurrency, url_rewrite_concurrency, url_rewrite_host_header] Esta combinao dada para ele criar e gerenciar instncias para

    redirecionamentos;[acl static_content urlpath_regex -i , acl atimage_sizes urlpath_regex] realiza cache de todo contedo esttico, tento para

    arquivos com exteno declarados em static_content quando para arquivos sem extenso declarados em atimage_sizes;

    [refresh_pattern -i, refresh_pattern] estou definindo que o cache deste material esttico ter apenas durao de

    60 minustos;[acl get_requests urlpath_regex \?, acl fake_get_requests urlpath_regex \?$ no_cache deny get_requests !fake_get_requests] no ser feito cache para contedos

    dinmicos que tenham parmetros depois da ?, caso no seja informado nenhum parmetro aps a ? ele far cache;

    [acl ac_cookie req_header Cookie -i __ac acl zope_cookie req_header Cookie -i _ZopeId=, acl zope_basic req_header Authorization -i Basic, no_cache deny ac_cookie, no_cache deny zope_cookie, no_cache deny zope_basic] Indentifica atravs de cookie do Zope ou do Plone e no faz o

    cache para usurios logados;[cache_mgr [email protected]] declaro o e-mail do suporte tcnico;[collapsed_forwarding on] Evitar empilhamento de threads;[ignore_expect_100 on] quando chegar requisies de http 1.1 ele figinr que http 1.0;[#debug_options ALL,1 33,2] Linha comentada, utilizar ela para deixar o Squid em modo

    debug.

    Aps ter feito todas as configuraes necessrio iniciar o Squid.

    Linha de cdigo 24: levantar squid

    Dica: em dvidas sobre acesso e funcionamento de requisies voc pode ver atravs dos logs do Squid [var/logs/access.log] e do Zope [var/client1/Z2.log]

    Para fazer o cacheamento dos outros contedos necessrio editar um arquivo dentro do zope, acesse http://juliano-VirtualBox/manage passe o usurio admin e senha admin, v at portal_skins, na pasta plone_templates e por fim em global_cache_settings, edite-o para ele poder comear a fazer cache das pginas, por padro esse script do Zope expira aps cada acesso no

    $ cd ~/treinamento/zope/squid

    $ sudo mkdir -p /{home}/treinamento/zope/squid/var/cache

    $ sudo chown -R juliano:juliano /{home}/treinamento/zope/squid/var/cache

    $ ./sbin/squid -z

    2011/03/06 11:04:17| Creating Swap Directories

    $ mkdir -p /{home}/treinamento/zope/squid/var/logs/

    $ sudo chown -R juliano:juliano /{home}/treinamento/zope/squid/var/logs

    $ sudo ./sbin/squid

  • deixando as aplicaes fazerem cacheamento, abaixo segue o cdigo a ser substitudo.

    Linha de cdigo 25: edio do global_cache_settings

    Aps isso faremos um benchmarkting da url http://juliano-VirtualBox/ e ver qual nossa resposta.

  • Linha de comando 26: baseline com squid fazendo cache plone 4

    Para ver o Plone 3, s desligar [bin/shutdowncluster.sh] o plone 4 e iniciar [bin/startcluster.sh] o 3, no preciso reiniciar o Squid.

    $ ab -n 100 -c 10 http://juliano-VirtualBox/

    ...

    Concurrency Level: 10

    Time taken for tests: 0.122 seconds

    Complete requests: 100

    Failed requests: 0

    Write errors: 0

    Total transferred: 1499800 bytes

    HTML transferred: 1460200 bytes

    Requests per second: 821.36 [#/sec] (mean)

    Time per request: 12.175 [ms] (mean)

    Time per request: 1.217 [ms] (mean, across all concurrent requests)

    Transfer rate: 12030.07 [Kbytes/sec] received

    ...

  • 6.4 Varnish

    Varnish[16], em portugus verniz, um acelerador HTTP projetado para sites web dinmicos com alto volume de contedo . Em contraste com outros aceleradores HTTP, muitos dos quais comearam a ser projetados como proxies do lado cliente ou servidores gerais, o Varnish foi projetado desde o incio como um acelerador HTTP. [ 15]

    Para iniciarmos a compilao do Varnish necessrio algumas bibliotecas: build-essential vem com os compiladores mais utilizados de C, C++, maker e outros; libtool utilitrio de compulao; pkg-config utilitrio de compilao; autotools-dev utilitrio de compilao; automake1.9 utilitrio de compilao; autoconf utilitrio de compilao; libncurses-dev interface de caracteres; libpcre3-dev utilitrio para expresses regulares; xsltproc biblioteca para fazer XLST; groff-base documentao do Varnish; rst2man utilitrio de documentao escrito em python;

    Linha de comando 27: instalao do varnish

    Dica: para saber se a lib foi setada corretamenta s executar o comando [ldconfig -p | grep varnish]

    Aps isso crie trs arquivos varnish.vcl, varnish-start e varnish-stop (ver suplemento 7.5, 7.6 e 7.7) na pasta /{home}/treinamento/zope/varnish/etc/varnish, substituir as linhas de configurao pela do seu host.

    Para iniciar o varnish iremos utilizar o script que criamos na pasta descrita acima, como o servio ir subir na porta 80 ter que ser executado como sudo ou root.

    Utilize o Apache Benchmarkting e faa o comparativo.

    $ sudo su -

    [sudo] password for juliano:

    # apt-get install build-essential libtool pkg-config autotools-dev automake1.9 autoconf libncurses-dev libpcre3-dev xsltproc groff-base rst2man subversion

    $ svn co http://varnish-cache.org/svn/branches/2.1 varnish-2.1-svn

    $ cd varnish-2.1-svn/varnish-cache

    $ sh autogen.sh

    $ sh configure --prefix=/home/juliano/treinamento/zope/varnish

    $ make

    $ make install

    $ ldconfig /home/juliano/treinamento/zope/varnish/lib/

  • Para utilizao do Varnish tem uma boa prtica utilizar um servidor NTP para sincronizar a hora e deixar ele sem atrasos ou adiantamento, isto evita um documento durar mais tempo ou menos tempo no cache, para fazer isso vocs podem utilizar um servidor da rnp que o ntp.pop-sc.rnp.br e editar a crontab.

    Linha de comando 28: sincronizar hora e colocar no crontab

    Dica: voc pode ver que o Zope esta utilizando a porta 8080, 8081 e o banco ZODB t utilizando a 8100, o Varnish t pendurado na porta 80 atravs do comando [netstat -a -n --inet | grep OU]

    O Varnish tambm utilizado para fazer diversas coisas, uma das o balanceamento com vcl director[17], para mais funces a documentao da linguagem t no Wiki do site[18].

    Dica: para ver se o balanceamento esta funcionando leia o arquivo de log do zeocluster com tail -f, os arquivos de log sero encontrados em [var/client{1,2}/log].

    O pulo do gato do Varnish o Grace Mode[19], ele tolerante a falhas, como funciona. Imagine um arquivo com uma TTL de 10s ao final da sua vida deste arquivo ele vai expirar fazendo o proxy ir buscar no backend a nova verso, e se nesse tempo de ir buscar houve vrias requisies a este arquivo ocorrer que teremos um empilhamento de threads, fazendo com que as threads esperem o tempo necessrio da 1 thread voltar com a nova verso do arquivo e as outras ficarem esperando, quando a thread for servida ir ter um pancada no servidor das outras threads requisitando o arquivo.

    Para tratar isso o Varnish a partir da verso 2.0 trata com o Grace Mode, onde no tempo do arquivo ser atualizado o Varnish servir o arquivo antigo at que o novo esteja pronto para ser servido, evitando o empilhamento de threads. Outra vantagem do Grace Mode dele servir o arquivo mesmo quando o backend tenha cado ou resetado de forma intencional sirva o arquivo durante o tempo que voc configurou seu Grace Mode dando maior escalabilidade.

    O Varnish evoluiu o Grace Mode para Saint Mode[19], imagine que voc tenha 5 backend (instncias zope) e uma destes backends d muitos problemas voc poder configurar o Saint Mode e fazer com que esse modo identifique a instncia problemtica e d um ch de cadeira durante o tempo que voc configurar para ele se recompor. 1H50

    $ sudo apt-get install ntp

    $ ntpdate ntp.pop-sc.rnp.br

    $ crontab -e

    Select an editor. To change later, run 'select-editor'.

    1. /bin/ed

    2. /bin/nano /dev/null 2>&1

    ...

  • 6.5 SupervisordPrograma escrito em Python que parecido com o launchd do MacOS ou Daemontools, ele

    tem a ideia de gerenciar os programas em execuo, ou seja, ele inicializa e controla os programas inicializados, o que no diferente de criar um entrada em /etc/init.d, o Supervisor ele permite fazer isso, gerenciar remotamente e gerenciar o uso da memria.

    Onde o Supervisor[20] entra nessa histria?

    O Zope natural consumir muita memria por causa da modelagem do seu banco, onde tudo que acessado vrias vezes ele alocado na memria, a maneira mais fcil de combater fazendo cdigos limpos, sem o uso de getObjects() direto no ZODB sem utilizar a ferramenta de catalogao nativa do Plone.

    Tem o caso de voc ter por exemplo uma mquina com 10 (dez) instncias e cada uma ocupando 2GB de memria no fim das contas voc ter 20GB de memria ocupada, tem que gerenciar esse consumo de memria, logo a mquina iria da Swap (ver item 5.2 sobre swap) e consequentemente lentido da mquina at o servidor sentar.

    Para fazer a instalao iremos utilizar o easy_install[2 1 ] que um pacote Python para gerenciamento de instalaes de pacotes python, para utilizar necessrio instalar o python-setuptools e por fim instalar o Supervisor, aps a instalao do Supervisor necessrio instalarmos um plug-in para ele superlance[2 2 ], que ele trata do httpok (monitoramento contnuo e quando trava ele reinicia), memmon (monitorar memria) e crashmail (Enviar e-mail para paradas, travamentos).

    Dica: para ver quais pacotes Python tem instalado no S.O., utilize o seguinte comando: [dpkg --list | grep python], ele lhe dar uma lista completa.

    Linha de comando 29: instalao do supervisor e python_setuptools

    Vamos configurar o memmon para monitorar as instncias, para isso inicialize as instncias e o proxy. Colocaremos no /etc/rc.local a linha para inicializar o zeoserver. Como o nosso interesse monitoramento da memria por conta da problemtica explicada acima, para esse exemplo utilizaremos apenas o memmon os outros 2 scripts fica a critrio do sysadmin querer utilizar em

    $ sudo su -

    [sudo] password for juliano:

    # apt-get install python-setuptools

    ...

    # easy_install supervisor

    # easy_install superlance

    Adding superlance 0.5 to easy-install.pth file

    Installing httpok script to /usr/local/bin

    Installing memmon script to /usr/local/bin

    Installing crashmail script to /usr/local/bin

  • seus respectivos servidores.

    Linha de comando 30: configurao e iniciao do supervisordAs interfaces de gerenciamento pode ser atravs da linha de comando com o aplicativo

    supervisorctl (ver na linha de comando 30), e atravs da interface web http://10.0.0.102:9011/.

    Imagem 15: interface grfica do supervidord

    $ cd ~/treinamento/plone-4.0.2/zeocluster

    $ bin/zeoserver start

    $ sudo su -

    # vim /etc/rc.local

    /usr/local/bin/supervisord

    /home/juliano/treinamento/zope/squid/sbin/squid

    /home/juliano/treinamento/plone-4.0.4/zeocluster/bin/zeoserver start

    exit 0

    # vim /etc/supervisord.conf

    # /usr/local/bin/supervisord

    # supervisorctl

    memmon RUNNING pid 6618, uptime 0:02:09

    plone4-i1 RUNNING pid 6620, uptime 0:02:09

    plone4-i2 RUNNING pid 6619, uptime 0:02:0

    supervisor>?

    default commands (type help ):

    =====================================

    add clear fg open quit remove restart start stop update

    avail exit maintail pid reload reread shutdown status tail version

  • Dica: a pasta dos eggs instalados atravs do easy_install localizado em [/usr/local/lib/python2.6/dist-packages/]

    6.6 Siege

    Siege[23] uma ferramenta para teste de regreo e utilitrio de Benchmark. Pode estressar uma nica URL com um nmero definido de usurios, ou pode ler vrioas URLs dentro da memria e estressa-las simultneamente. O programa relata o total de nmeros de hits gerados, bytes transferidos, tempo de resposta, simultniedade e retorna estatus. O Siege suporta aplicaes HTTP/1.0 e 1.1, diretivas de GET e POST, manipula cookies, transaes de logins, e autenticao bsica. Suas caractersticas so configuradas em bases de usurios, escita em C, ela tem licena GPL[24].

    O Siege um complemento do Apache Benchmark para testar performance das aplicaes web, como o Jmeter para testes em especial de aplicaes Java.

    O Apache Benchmark uma aplicao simples ele no tem a funo de simular ao nvel de parecer com um usurio real, ela testa na forma de estressar a aplicao mas sem realismo, o Siege ele tenta ao mximo simular ao nvel do realismo.

    Antes de instalarmos a ferramenta iremos precisar ver os cabealhos HTTP enquanto navegamos pela pgina, para isso utilizaremos Live HTTP Headers[25] e do Web Developer[26] para poder desabilitar cache de cabealho, ambos add-ons so para o Firefox[2 7 ]. Aps instalar para habilitar no Firefox v em Exibir > Painel > LiveHTTPHeades, em seguida utilizando o plug-in Web Developer, em Desativar > Desativar Cache, esta ao ir desativar o nosso cache local (o de cabealho) e comee a navegar entre os links da sua pgina plone, faa login e navegue. Aps no add-on Live Http Headers salve (Save All...) com o nome por exemplo navegation.lhh, lembrando que necessrio apenas estar a pgina do nosso Plone Portal aberto para no misturar os cabealhos.

    Com o arquivo gerado iremos utilizar as URLs acessadas, utilize o egrep (grep com expresso regular) para retirar do arquivo apenas as URLs. Aps isso vamos fazer a instalao do Siege propriamente dito.

    Linha de comando 31: egrep e instalao do Siege

    Dica: para ver o manual do Siege passe no terminal [man siege].

    6.7 Monitoramento de performance e qualidade de servios em cluster Plone

    $ egrep ^http: navegation.lhh > https

    # apt-get install siege

    # siege -f https -i -c 100

  • 7 Suplemento

    7.1 Configurao do Squid.conf

    Configuraes customizadas para o squid.conf, quando copiar lembrar de colocar os paths corretos de sua mquina e trocar o [dstdomain].

    http_port 80 vhost

    cache_dir aufs /{home}/treinamento/zope/squid/var/cache 16384 32 512cache_effective_user juliano

    access_log /{home}/treinamento/zope/squid/var/logs/access.logcache_log /{home}/treinamento/zope/squid/var/logs/cache.logcache_store_log nonelog_icp_queries offemulate_httpd_log on

    cache_mem 128 MBmaximum_object_size 50 MB maximum_object_size_in_memory 1 MB

    acl all src 0.0.0.0/0.0.0.0acl localhost src 127.0.0.1/32acl zope_servers src 127.0.0.1acl squid_servers src 10.0.0.107acl webdav method PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK TRACEacl manager proto cache_object

    acl frontpage urlpath_regex -i /MSOffice$acl frontpage urlpath_regex -i /_vti_bin$http_access deny frontpage

    acl badrobot browser -i Twiceleracl badrobot browser -i Yetiacl badrobot browser -i Daumoaacl badrobot browser -i Yandexacl badrobot browser -i Baiduspiderhttp_access deny badrobot

    acl bot browser -i botacl bot browser -i crawleracl bot browser -i spideracl bot browser -i Slurpacl horario_comercial time MTWHF 06:00-23:00http_access deny bot horario_comercial

    # evita indexao de urls de edio de contedo, # ferramentas do plone e formulrio de envioacl url_plone urlpath_regex -i /edit$acl url_plone urlpath_regex -i /portal_acl url_plone urlpath_regex -i /sendto_form$http_access deny bot url_plone

    acl purge method PURGEhttp_access allow zope_servers purgehttp_access deny purge

  • http_access deny webdavhttp_access allow manager localhosthttp_access allow manager squid_servershttp_access deny manager

    acl accelerated_domains dstdomain juliano-VirtualBoxacl accelerated_ports myport 80acl accelerated_protocols proto httphttp_access allow accelerated_domains accelerated_ports accelerated_protocols

    acl vs dst 127.0.0.1http_access allow vsalways_direct allow vsredirector_access deny vs

    never_direct allow allicp_access allow all

    url_rewrite_program /{home}/treinamento/zope/squid/etc/iRedirector.pyurl_rewrite_children 5url_rewrite_concurrency 4url_rewrite_host_header off

    acl static_content urlpath_regex -i \.(jpg|jpeg|gif|png|tiff|tif|svg|ico|css|js|vsd|doc|ppt|pps|xls|pdf|zip|gz|bz2|tgz|tar|rar|odc|odb|odf|odg|odi|odp|ods|odt|sxc|sxd|sxi|sxw|dmg|torrent|deb|msi|iso|rpm|mpg|mpeg|mov|avi|wmv|divx|swf|rm|mp3|mp4|m4a|ogg|wav|wma|ra|mid|htc)[/]*[\?]*$no_cache allow static_content

    acl atimage_sizes urlpath_regex /(image|image_large|image_preview|image_mini|image_thumb|image_tile|image_icon|image_listing)[/]*[\?]*$no_cache allow atimage_sizes

    acl get_requests urlpath_regex \?acl fake_get_requests urlpath_regex \?$no_cache deny get_requests !fake_get_requests

    acl post_requests method POSTno_cache deny post_requests

    # evita cache para usuarios autenticadosacl ac_cookie req_header Cookie -i __acacl zope_cookie req_header Cookie -i _ZopeId=acl zope_basic req_header Authorization -i Basicno_cache deny ac_cookieno_cache deny zope_cookieno_cache deny zope_basic

    refresh_pattern -i \.(jpg|jpeg|gif|png|tiff|tif|svg|ico|css|js|vsd|doc|ppt|pps|xls|pdf|zip|gz|bz2|tgz|tar|rar|odc|odb|odf|odg|odi|odp|ods|odt|sxc|sxd|sxi|sxw|dmg|torrent|deb|msi|iso|rpm|mpg|mpeg|mov|avi|wmv|divx|swf|rm|mp3|mp4|m4a|ogg|wav|wma|ra|mid|htc)[/]*[\?]*$ 60 50% 1440refresh_pattern /(image|image_large|image_preview|image_mini|image_thumb|image_tile|image_icon|image_listing)[/]*[\?]*$ 60 50% 1140refresh_pattern . 0 20% 1440

    cache_mgr [email protected]

    collapsed_forwarding on

    ignore_expect_100 on

    #debug_options ALL,1 33,2

  • 7.2 Configuraes do squidRewriteRules.py

    import re, sys

    try: import pyexcept ImportError: pass

    # log mode (set to 1 to enable logging)debug = 0

    # logfile for debugging (only required when debug == 1)logfile = "/var/log/squid/redirector_class.log"

    # set this to -1 to get best performance (no reload)reload_after = -1

    from rewrites import rewrites

    compiled_rewrites = None

    def log(s): """ Logging facility. """ try: f = open(logfile, "a") except IOError: print >> sys.stderr, s return f.write('%s\n' % s) f.flush() f.close()

    def init(): global compiled_rewrites

    compiled_rewrites = [] for rewrite in rewrites: regexp = re.compile(rewrite[0]) template = rewrite[1] flags = {} for flag in rewrite[2].split(','): parts = flag.split('=') flag = parts[0] option = None if flag == 'R': if len(parts) > 1: option = "%s:" % parts[1] else: option = '302:' flags[flag] = option compiled = (regexp, template, flags) if debug: log('compiled: %s' % str((regexp.pattern, template, flags))) compiled_rewrites.append(compiled) compiled_rewrites = tuple(compiled_rewrites)

    def rewrite(url, src_address=''): """ just rewrites urls. """

    if debug:

  • log("args: %s" % str((url, src_address)))

    newurl = None for regexp, template, flags in compiled_rewrites: m = regexp.match(url) if m is not None and template != '-': if debug: log("match.groups ('%s'): %s" % (regexp.pattern, str(m.groups()))) url = newurl = "%s%s" % (flags.get('R', ''), m.expand(template)) if debug: log('newurl: %s' % newurl) if 'L' in flags: break

    if newurl is not None: if debug: log('finalurl: %s' % newurl) return newurl

    # redirect to something we can match by a squid acl # this special non existing domain should be denied # by squid with a http_reply_access line return "http://denypool/denyme"

    if debug: log("reloading user redirector module")init()if debug: log("reloaded user redirector module")

    7.3 Configurao do rewrites.pySubstituir o hostname e o nome do Plone Site

    rewrites = ( (r'^cache_object://(.*)', r'cache_object://\1', 'L'),

    (r'^http:///(.*)', r'http://127.0.0.1:8080/VirtualHostBase/http/:80//VirtualHostRoot/\1', 'P,L'),

    )

    7.4 Configuraes para iRedirector.py

    #!/usr/bin/python -Ou

    import sys, tracebackfrom thread import start_new_threadimport squidRewriteRules

    # set to 1 to enable loggingdebug = 0

    # set to 1 to enable squid3 multithreaded redirector support# NOTE: having this turned on saves a lot of resources# only turn this on when having redirect_concurrency in squid.conf

  • # set to something other than 0threaded = 1

    # the logfile for the redirector log (only used when debug is 1)logfile = "/var/log/squid/iRedirector.log"

    # Globally bound for speedier lookup. Run `timing.py` to see why.stdin_readline = sys.stdin.readlinestdout_write = sys.stdout.writestdout_flush = sys.stdout.flush

    class SquidRedirector: """ iRedirector main base class. """

    def __init__(self): pass

    def rewrite(self,line): if threaded: # start new thread start_new_thread(rewrite_threaded, (line,), {}) else: # run single threaded rewrite(line)

    def run(self): # wait for stdin input line = stdin_readline()[:-1] # since we bail out on a failure, there's no point in setting # up a try:except in a tight loop. Run `timing.py` for the # difference between `test3` and `test4`. try: while line: reload_after = squidRewriteRules.reload_after if reload_after < 0: pass # reload is disabled elif reload_after > 0: squidRewriteRules.reload_after = reload_after - 1 else: reload(squidRewriteRules)

    # launch rewriting function self.rewrite(line)

    # read new line line = stdin_readline()[:-1] except: exc = sys.exc_info() log(str(traceback.format_exception(exc[0],exc[1],exc[2]))) del exc # NOTE: raising the exception aborts this redirector process # when no redirector is left squid exits as well raise

    def log(s): """ Logging facility. """ try: f = open(logfile, "a") except IOError: print sys.stderr, s return f.write("%s\n" % s)

  • f.flush() f.close()

    def rewrite(line): """ Splits up the line from squid and gives it to the redirector class. This method can be called in a new thread so one redirector supports multiple redirections at the same time. This is a squid3 feature. """

    if debug: log("request : " + line)

    # format url, src, ident, method url, src_address, ident, method, urllist = line.split(" ")[:5]

    # send through redirector class new_url = squidRewriteRules.rewrite(url, src_address)

    if not new_url: # return empty line when redirector didn't return anything response = "" else: response = " ".join((new_url, src_address, ident, method))

    # write it back to squid stdout_write(response+'\n') stdout_flush()

    if debug: log("response: " + response)

    def rewrite_threaded(line, write=sys.stdout.write, flush=sys.stdout.flush): """ Splits up the line from squid and gives it to the redirector class. This method can be called in a new thread so one redirector supports multiple redirections at the same time. This is a squid3 feature. """

    if debug: log("request : " + line)

    # format index, url, src, ident, method index, url, src_address, ident, method, urllist = line.split(" ")[:6]

    # send through redirector class new_url = squidRewriteRules.rewrite(url, src_address)

    if not new_url: # return empty line when redirector didn't return anything response = index else: # give back the index response = " ".join((index, new_url, src_address, ident, method))

    # write it back to squid stdout_write(response+'\n') stdout_flush()

    if debug: log("response: " + response)

    if __name__ == "__main__": sr = SquidRedirector()

  • if debug: log('Starting SquidRedirector') sr.run() if debug: log('Stopped SquidRedirector')

    7.5 Configurao do varnish-start

    #!/bin/sh exec /home/juliano/treinamento/zope/varnish/sbin/varnishd \ -f "/home/juliano/treinamento/zope/varnish/etc/varnish/varnish.vcl" \ -a 10.0.0.104:80 \ -s file,"/home/juliano/treinamento/zope/varnish/var/varnish/storage",1000M \ -n "/home/juliano/treinamento/zope/varnish/var/varnish/coordenador-ugti" \ -P "/home/juliano/treinamento/zope/varnish/etc/varnish/varnish.pid" \ -t 0 "$@"

    7.6 Configurao do varnish-stop

    #!/bin/sh

    kill `cat /home/juliano/treinamento/zope/varnish/etc/varnish/varnish.pid`

    7.7 Configurao do varnish.vcl

    O Varnish tem uma linguagem prpria chamada de vcl.

    backend backend_1 { .host = "127.0.0.1"; .port = "8080";}

    backend backend_2 { .host = "127.0.0.1"; .port = "8081";}

    director www_director random { { .backend = backend_1; .weight = 1; } { .backend = backend_2; .weight = 1; }}

    acl purge { "localhost"; "10.0.0.102";}

    sub vcl_recv {

    /* Find the right backend for this request */ if (!req.url) { error 404 "Unknown host"; } elseif (req.http.host ~ "^coordenador-ugti") { set req.backend = www_director;

  • set req.url = regsub(req.url, "(.*)", "/VirtualHostBase/http/coordenador-ugti:80/Plone/VirtualHostRoot/\1"); } else { error 404 "Unknown host"; }

    set req.grace = 30s;

    /* Do not cache if request is POST, just pass it through */ if (req.request == "POST") { return(pass); }

    /* Do not cache if request is not GET or HEAD */ if (req.request != "GET" && req.request != "HEAD") { /* Forward to 'lookup' if request is an authorized PURGE request */ if (req.request == "PURGE") { if (!client.ip ~ purge) { error 405 "Not allowed."; } return(lookup); } set req.http.connection = "close"; return(pipe); }

    /* Do not cache if request contains an Expect header */ if (req.http.Expect) { set req.http.connection = "close"; return(pipe); }

    /* Normalize the Accept-Encoding headers */ if (req.http.Accept-Encoding) { if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") { # No point in compressing these unset req.http.Accept-Encoding; } elsif (req.http.Accept-Encoding ~ "gzip") { set req.http.Accept-Encoding = "gzip"; } elsif (req.http.Accept-Encoding ~ "deflate") { set req.http.Accept-Encoding = "deflate"; } else { # unkown algorithm unset req.http.Accept-Encoding; } }

    if (req.url ~ "\.(jpg|jpeg|gif|png|tiff|tif|svg|ico|css|js|vsd|doc|ppt|pps|xls|pdf|zip|gz|bz2|tgz|tar|rar|odc|odb|odf|odg|odi|odp|ods|odt|sxc|sxd|sxi|sxw|dmg|torrent|deb|msi|iso|rpm|mpg|mpeg|mov|avi|wmv|divx|swf|rm|mp3|mp4|m4a|ogg|wav|wma|ra|mid|htc|image|image_large|image_preview|image_mini|image_thumb|image_tile|image_icon|image_listing)") { unset req.http.Cookie; return(lookup); }

    /* Varnish doesn't do INM requests so pass it through */ if (req.http.If-None-Match) { return(pass); }

    /* Do not cache authenticated requests for pages */ if (req.http.Authenticate || req.http.Authorization || req.http.Cookie ~ "__ac(|_(name|password|persistent))=") {

  • return(pass); }

    return(lookup);}

    sub vcl_hit { if (req.request == "PURGE") { purge_url(req.url); error 200 "Purged"; } if (!obj.cacheable) { return(pass); } return(deliver);}

    sub vcl_miss { if (req.request == "PURGE") { error 404 "Not in cache"; } return(fetch);}

    sub vcl_fetch {

    set beresp.grace = 5m;

    /* Enforce a minimal ttl of 10s */ if (beresp.cacheable && beresp.ttl < 10s) { set beresp.ttl = 10s; }

    /* Enforce a minimal ttl of 1h for css, js and images */ if (req.url ~ "\.(jpg|jpeg|gif|png|tiff|tif|svg|ico|css|js|vsd|doc|ppt|pps|xls|pdf|zip|gz|bz2|tgz|tar|rar|odc|odb|odf|odg|odi|odp|ods|odt|sxc|sxd|sxi|sxw|dmg|torrent|deb|msi|iso|rpm|mpg|mpeg|mov|avi|wmv|divx|swf|rm|mp3|mp4|m4a|ogg|wav|wma|ra|mid|htc|image|image_large|image_preview|image_mini|image_thumb|image_tile|image_icon|image_listing)") { unset beresp.http.set-cookie; if (beresp.ttl < 1h) { set beresp.ttl = 1h; } }

    if (!beresp.cacheable) { return(pass); }

    if (beresp.http.set-cookie) { return(pass); }

    /* Do not cache if response contains any 'no cache' tokens */ if (beresp.http.Cache-Control ~ "(private|no-cache|no-store)") { return(pass); }

    /* Do not cache authenticated requests for pages */ if (req.http.Authenticate || req.http.Authorization || req.http.Cookie ~ "__ac(|_(name|password|persistent))=") { return(pass); }

  • return(deliver);}

    7.8 Configurao do Supervidord.conf[unix_http_server]file=/tmp/supervisor.sockchown=juliano:juliano

    [inet_http_server]port=10.0.0.102:9001username=adminpassword=admin

    [supervisord]logfile=/tmp/supervidord.loglogfile_maxbytes=50MBlogfile_backups=10loglevel=infopidfile=/tmp/supervisord.pidnodaemon=falseminfds=1024minprocs=200

    [rpcinterface:supervisor]supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

    [supervisorctl]serverurl=http://10.0.0.102:9001username=adminpassword=admin

    [program:plone4-i1]command = /home/juliano/treinamento/plone-4.0.4/zeocluster/bin/client1 consoleautorestart = trueredirect_stderr = true

    [program:plone4-i2]command = /home/juliano/treinamento/plone-4.0.4/zeocluster/bin/client2 consoleautorestart = trueredirect_stderr = true

    [eventlistener:memmon]command=/usr/local/bin/memmon -p plone4-i1=500MB -p plone4-i2=500MBevents=TICK_5

  • 8 Referncias

    [1] Solid-State Drive: http://pt.wikipedia.org/wiki/SSD

    [2] Mounting portal_catalog in a separeted ZODB: http://plone.org/documentation/kb/mount-portal_catalog-in-separate-zodb

    [3] The Definitive Guide to Plone: http://books.google.com.br/books?id=aX30gEjgUHAC&pg=PA309&lpg=PA309&dq=portal_catalog+separated+zodb&source=bl&ots=YMY_1RrLsh&sig=yRsWROdT7v6fSQEL7BNkXQ7lKCA&hl=pt-BR&ei=f35gTfezIs-CtgfRlp2ODA&sa=X&oi=book_result&ct=result&resnum=7&ved=0CFIQ6AEwBg#v=onepage&q&f=false

    [4] Apache HTTP Server: http://www.apache.org/

    [5] Servidor Apache na Wikipedia: http://pt.wikipedia.org/wiki/Servidor_Apache

    [6] Apache Rewrite Rule: http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteRule

    [7] Apache Benchmarkting Tool: http://httpd.apache.org/docs/2.0/programs/ab.html

    [8] Ngix Official Page: http://nginx.org/

    [9] Ngix Wikipedia: http://pt.wikipedia.org/wiki/Nginx

    [10] Apache vs. Nginx: web server performance deathmatch: http://www.joeandmotorboat.com/2008/02/28/apache-vs-nginx-web-server-performance-deathmatch/

    [11] File Descriptor: http://pt.wikipedia.org/wiki/Descritor_de_arquivo

    [12] Tips & Tricks: http://mixinet.net/~sto/blog/sysadmin/20080228_tandt_-_plone__nginx_and_path_rewriting/

    [13] Wiki Nginx: http://wiki.nginx.org/HttpProxyModule

    [14] Assncrono: http://pt.wikipedia.org/wiki/Assincrono

    [15] Varnish Wikipedia: http://pt.wikipedia.org/wiki/Varnish_%28software%29

    [16] Varnish: http://www.varnish-cache.org/

    [17] Varnish Director: http://www.varnish-cache.org/trac/wiki/VCLExampleDirector

    [18] Varnish VCL: http://www.varnish-cache.org/trac/wiki/VCL

    [19] Varnish Grace/Saint Mode: http://www.varnish-cache.org/docs/trunk/tutorial/handling_misbehaving_servers.html

    [20] Supervisord: http://supervisord.org/

    [21] easy_install: http://packages.python.org/distribute/easy_install.html

    [22] superlance: http://pypi.python.org/pypi/superlance

    [23] Siege: http://freshmeat.net/projects/siege/

    [24] GPL: http://pt.wikipedia.org/wiki/GNU_General_Public_License

    [25] Live HTTP Header: https://addons.mozilla.org/pt-br/firefox/addon/live-http-headers/

    [26] Web Developer: https://addons.mozilla.org/en-us/firefox/addon/web-developer/

    [27] Firefox: http://www.mozilla.com/pt-BR/firefox/?ref=logo

    O guia definitivo da insfraestrutura de servidores Zope para Plone 41 Python2 Zope3 Plone4 Consideraes5 Instalao de cluster Plone com arquitetura ZEO, para alta escalabilidade e performance5.1 Plone 45.2 Plone 3

    6 Infraestrutura de servios6.1 Apache6.2 NGINX6.3 Squid6.4 Varnish 6.5 Supervisord6.6 Siege6.7 Monitoramento de performance e qualidade de servios em cluster Plone

    7 Suplemento7.1 Configurao do Squid.conf7.2 Configuraes do squidRewriteRules.py7.3 Configurao do rewrites.py7.4 Configuraes para iRedirector.py7.5 Configurao do varnish-start7.6 Configurao do varnish-stop7.7 Configurao do varnish.vcl7.8 Configurao do Supervidord.conf

    8 Referncias