Archivio

Archivio per la categoria ‘Lamp’

Installare ionCube su Debian

11 febbraio 2010 Nessun commento

In questa guida vedremo come installare l’encoder ionCube per criptare le vostre pagine PHP su Debian Lenny.
La prima cosa da fare è scaricare l’archivio dal sito di riferimento:

wget http://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86.tar.gz

A questo punto possiamo scompattare l’archivio:

tar zxvf ioncube_loaders_lin_x86.tar.gz

Consiglio prima di proseguire, la lettura del README.txt, presente nella directory ioncube.
Spostiamo la directory appena scompattata in un percorso definitivo:

mv ioncube /usr/local/

Ora dobbiamo inserire nel php.ini il modulo di ionCube, in base alla versione di PHP installata:

vi /etc/php5/apache2/php.ini
zend_extension = /usr/local/ioncube/ioncube_loader_lin_5.2.so

Riavviamo apache:

/etc/init.d/apache2 stop
/etc/init.d/apache2 start

Infine nell’output del phpinfo troveremo:

with the ionCube PHP Loader v3.3.10, Copyright (c) 2002-2009, by ionCube Ltd.

MySQL Tuning

6 febbraio 2010 Nessun commento

Con l’installazione di default la configurazione del servizio mysql viene impostata ad un livello “standard” che va piu’ o meno bene su tutti i server.
In questo articolo vedremo come ottimizzare il valore associato alle variabili presenti nella configurazione, ottimizzandola in base alla memoria e all’hardware disponibile sul nostro server.

key_buffer_size

Indica la quantita’ di indici (i file con estensione MYI) delle tabelle di tipo MYISAM mantenuti in memoria.
L’ideale sarebbe quello di poter contenere in RAM tutti i file di questo tipo.
Il valore attribuito a questa variabile non deve superare la meta’ di tutta la RAM dedicata al servizio mysqld.
Se non potete mettere in memoria tutti i file MYI potrete fare questa ottimizzazione:

Accedete nella console di mysql ed eseguite questa query

show status like ‘%key_read%’;

Dividete il valore di key_read_requests per key_read;
Il risultato deve essere maggiore di 100.

Si imposta nella sezione [mysql] ad es.

[mysqld]
key_buffer_size = 64M

table_cache

Quando mysql accede ad una tabella, la carica in cache. La migliore delle situazioni sarebbe quella di avere una cache talmente grande da contenere
tutte le tabelle aperte in un dato momento.
Per verificare quante tabelle sono aperte in un determinato istante eseguiamo questa query

show status like ‘open_tables’;

Analizzando questo valore nel tempo, possiamo valutare i picchi massimi

Possiamo verificare anche quante tabelle sono state aperte dall’esecuzione del servizio mysql

show status like ‘opened_tables’;

Avremo modo cosi’ di capire se open_tables e’ “attendibile” oppure momentaneamente superiore/inferiore alla media.

Si imposta nella sezione [mysql] ad es.

[mysqld]
table_cache  = NUMERO

thread_concurrency

Questa variabile limita il numero di thread avviati simultaneamente. Il valore da impostare e’ questo

2 * (numero di CPU)

Si imposta nella sezione [mysql] ad es.

[mysqld]
thread_concurrency  = 4

read_rnd_buffer_size

Viene utilizzata a seguito di una query che prevede un ordinamento delle righe, il classico ORDER BY per intenderci.
E’ consigliabile impostare 1Kb per ogni MB di memoria destinata al servizio mysqld.

Si imposta nella sezione [mysql] ad es.

[mysqld]

read_rnd_buffer_size = 256k

tmp_table_size

Il valore associato a questa variabile indica la dimensione massima delle tabelle temporanee create in memoria.
Si riferisce alle tabelle di tipo MyIsam e quando e’ insufficente la tabella verra’ creata sul disco, con conseguente perdita di performance.
Eseguendo questo comando

mysqladmin -uroot -pPASSWORD processlist -i1

si puo’ verificare se ci sono tabelle temporanee gestite lentamente. Se dovesse essere questo il caso, e’ necessario (memoria permettendo) aumentare tmp_table_size

Si imposta nella sezione [mysql] ad es.

[mysqld]

tmp_table_size = 96M

innodb_buffer_pool_size

Come tmp_table_size ma per le tabelle di tipo InnoDB. Si puo’ impostare questo valore pari al 70/80% della memoria dedicata al servizio mysql

skip-innodb

Se non state utilizzando tabelle di tipo innodb, aggiungete questa direttiva nella sezione [mysqld] della configurazione del servizio

Utilizzare la cache per le query

Per abilitare la cache sulle query impostare

query-cache-type = 1

query-cache-size = 16777216

(questo valore e’ espresso in byte)

Adesso nella console di mysql eseguite questo:

show status like ‘%qcache%’;

e guardate il valore di

Qcache_free_memory
Qcache_lowmem_prunes

Qcache_free_memory indica la memoria disponibile che potra’ essere ancora utilizzata per la cache.
Il valore di Qcache_lowmem_prunes viene aumentato ogni qualvolta che viene rimossa una query dalla cache. Se vedete aumentare questo valore molto rapidamente, dovrete aumentare query-cache-size.

N.B. query_cache_limit indica la dimensione massima del risultato di una query. Se viene superato quella query non sara’ inserita nella cache

Per ripulire la cache bastera’ eseguire questo comando dalla console di mysql

RESET QUERY CACHE

Installare mod_fcgid con apache2 in CentOS GNU/Linux

24 dicembre 2009 1 commento

apacheDi default il web server apache esegue gli script php di un sito con l’utente “www-data”. Per permettere ad uno script di memorizzare dati all’interno di una directory, allora i permessi di quest’ultima devono essere settati a 777 oppure il proprietario della cartella deve essere l’utente “www-data”. In questo caso, se sul vostro server web e’ attivo piu’ di un sito internet, allora uno script di un dominio potrebbe modificare i dati di un’altro. Come fare per ovviare a questo problema?  Eseguendo gli script di ogni sito con un utente distinto installando la suexec, mod_fcgid ed utilizzando il php in modalita’ cgi. Piu’ difficile a dirsi che a farsi, bastano difatti pochi comandi e qualche minuto per configurare il tutto:

1) Occorre disabilitare SELinux

setenforce 0

Editare il file /etc/selinux/config ed impostare SELINUX a ‘disable’

SELINUX=disabled

2) Installare mod_fcgid. Questo modulo  non e’ disponibile nel repository ufficiale di CentOS ma possiamo prelevarlo da un’altra fonte

cd /etc/yum.repos.d/
wget http://centos.karan.org/kbsingh-CentOS-Extras.repo

Editare /etc/yum.repos.d/kbsingh-CentOS-Extras.repo ed impostare gpgcheck a 0 ed enabled a 1 nella sezione [kbs-CentOS-Testing]:

[...]
[kbs-CentOS-Testing]
gpgcheck=0
enabled=1
[..]

Eseguire adesso questo comando

yum install mod_fcgid

4)
Commentare tutte le righe del file /etc/httpd/conf.d/php.conf (per evitare che il php venga caricato come modulo), anteponendo il carattere # ad inizio riga

5)
Adesso dovremo forzare il PHP a correggere il percorso del cgi in modo conforme alle specifiche PATH_INFO/PATH_TRANSLATED. Bastera’ aggiungere nel php.ini (/etc/php.ini) questa direttiva:

cgi.fix_pathinfo = 1

6) Creiamo l’utente con cui dovranno essere eseguiti gli script del sito

groupadd sito1
useradd -s /bin/false -d /var/www/sito1 -m -g web1 web1
chmod 755 /var/www/sito1

7) Creiamo la cartella che dovra’ ospitare i file del sito

mkdir -p /var/www/sito1/htdocs
chown sito1:sito1 /var/www/sito1/htdocs

8) Creiamo il wrapper che utilizzeremo per avviare il php e configurare mod-fcgid:

mkdir -p /var/www/fcgid-conf-sito1

9) Inseriamo queste righe nel file /var/www/fcgid-conf-sito1/sito1.conf

#!/bin/sh
export PHPRC=/etc/
export PHP_FCGI_MAX_REQUESTS=400
export PHP_FCGI_CHILDREN=2
exec /usr/bin/php-cgi

PHPRC,PHP_FCGI_MAX_REQUESTS e PHP_FCGI_CHILDREN sono opzionali e se verranno omessi sara’ impostato il valore di default. Sono utili per poter indicare il percorso del php.ini, permettendo cosi’ di utilizzare una configurazione diversa da sito a sito, oppure per definire il numero di child per processo ed il numero di richieste che puo’ gestire prima di terminare.

10) Impostiamo i corretti permessi/proprietario

chmod 755 /var/www/fcgid-conf-sito1/sito1.conf
chown -R sito1:sito1 /var/www/fcgid-conf-sito1

11) Creiamo in /etc/httpd/conf/httpd.conf la configurazione del sito

<VirtualHost *:80>
ServerName www.sito1.it
ServerAdmin postmaster@sito1.it
DocumentRoot /var/www/sito1/htdocs/

<IfModule mod_fcgid.c>
SuexecUserGroup sito1 sito1
PHP_Fix_Pathinfo_Enable 1
<Directory /var/www/sito1/htdocs/>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/fcgid-conf-sito1/sito1.conf .php
Order allow,deny
Allow from all
</Directory>
</IfModule>

# ErrorLog /var/log/apache2/error.log
# CustomLog /var/log/apache2/access.log combined
ServerSignature Off

</VirtualHost>

12) Salvare il file e riavviare il web server

/etc/init.d/httpd restart

Categorie:Altro, Apache, How-to, Server, Sicurezza Tag:

Mysql: Illegal mix of collations

15 novembre 2009 Nessun commento

Un errore che può capitare, quando si effettuano query su due db o due tabelle con una collations differente, è il seguente:

ERROR 1267 (HY000): Illegal mix of collations (latin1_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation ‘=’

Questo errore indica che i due campi su cui stiamo effettuando la query hanno una collations differente e non compatibile. Facciamo qualche esempio ecco la nostra tabella:

show create table a;

CREATE TABLE `a` (
`campo1` varchar(64) character set latin1 collate latin1_bin NOT NULL default ”
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

show create table b;

CREATE TABLE `b` (
`campo2` varchar(255) NOT NULL default ”
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

La tabella b non avendo alcuna collations impostata, prenderà quella di default, ovvero:

collate latin1_general_ci

Ora se andiamo a fare una query che preleva i dati da entrambe le tabelle, otterremo il seguente errore:

SELECT *  FROM a,b WHERE campo1 = campo2;

ERROR 1267 (HY000): Illegal mix of collations (latin1_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation ‘=’

Ora per risolvere il problema forziamo la collate  latin1_bin in latin1_general_ci:

ALTER TABLE a character set latin1 collate latin1_general_ci , modify column campo1 varchar(64) character set latin1 collate latin1_general_ci NOT NULL;

A questo punto lo show create table ci mostrerà la nuova collate impostata per il campo campo1 e la query che prima ci restituiva l’errore ora sarà eseguita correttamente.