Archives pour la catégorie ‘Administration’

Apache : autoriser le partage cross-domain des ressources

   <IfModule mod_headers.c>
      Header set Access-Control-Allow-Origin *
   </IfModule>

Source : http://enable-cors.org/

Squid : gestion séparée des logs d’accès

Squid stocke par défaut les accès client dans un unique fichier journal. Ceci est problématique dans le cas d’un reverse-proxy mutualisé car il est nécessaire de générer des statistiques d’accès par site.

Comme toujours avec ce logiciel, la solution réside au niveau des ACL. Ici, il s’agit d’effectuer un test sur le domaine (dstdomain), voire l’URL (url_regex) s’il convient de distinguer au niveau protocole. L’ACL est ensuite à spécifier en dernier argument de l’option access_log afin de limiter les données stockées dans le log. Evidemment, il faut veiller à ce que toutes les options access_log utilisent une ACL sous peine d’avoir un beau catch-all qui va griller le disque et les temps d’accès inutilement.

Je colle ici un exemple de configuration permettant la séparation des logs d’accès de deux sites web (fichier squid.conf) :

acl LOG_SITE1 dstdomain "/etc/squid/log_site1.txt"
acl LOG_SITE2 dstdomain "/etc/squid/log_site2.txt"

logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Shcache_store_log none

access_log /var/log/squid/site1-access.log combined LOG_SITE1
access_log /var/log/squid/site2-access.log combined LOG_SITE2

Reste ensuite à créer pour chaque site le fichier listant des alias utilisés :

# more /etc/squid/log_site1.txt
www.site1.fr
site1.fr
# more /etc/squid/log_site2.txt
.site2.fr

Bref, c’est simple et performant.

Apache : redirection HTTPS générique

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Réseau : monitoring de la bande passante en console

bwm-ng est un outil pour monitorer en console la bande passante de votre réseau. Il est multiplateforme (Linux, BSD, Mac OS X, etc …) d’où son intérêt dans le cas d’une infrastructure exotique.

bwm-ng v0.6 (probing every 0.500s), press 'h' for help
 input: getifaddrs type: rate
 iface                 Rx                   Tx                Total
 ====================================================================
 em0:        1256.49 KB/s          159.00 KB/s         1286.69 KB/s
 em1:        1717.76 KB/s          111.22 KB/s         1749.13 KB/s
 em2:        9946.26 KB/s        37662.34 KB/s        38150.35 KB/s
 em3:       37537.95 KB/s        10023.27 KB/s        38024.49 KB/s
 lo0:           2.54 KB/s            2.54 KB/s            5.08 KB/s
 vlan0:         0.00 KB/s            0.00 KB/s            0.00 KB/s
 vlan1:     37505.46 KB/s         6869.97 KB/s        37949.06 KB/s
 vlan2:        96.75 KB/s         9791.27 KB/s         9875.43 KB/s
 vlan3:         0.23 KB/s            0.08 KB/s            0.31 KB/s
 pflog0:        0.00 KB/s            2.43 KB/s            2.43 KB/s
 tun0:         36.66 KB/s          134.23 KB/s          142.38 KB/s
 --------------------------------------------------------------------
 total:     75565.96 KB/s        38635.92 KB/s       114201.88 KB/s

Nginx : redirection HTTPS avec header STS

Ce n’est pas nouveau, donc direction wikipédia si besoin est.

server {
 listen 80;
 server_name     mon.webmail.fr

 # Strict Transport Security
 add_header Strict-Transport-Security max-age=2592000;

 rewrite ^.*$  https://mon.webmail.fr permanent;
}

Load Impact : tester en ligne la montée en charge d’un site web

LoadImpact est un outil en ligne permettant de tester rapidement la montée en charge d’un site web.

Voici les résultats que j’obtiens sur ce serveur :

Niveau configuration :

  • CPU Intel Core2Duo 2 x 2.33Ghz
  • RAM 2 Go
  • OS FreeBSD 8.1 64 bits
  • 6 jails dont 1 avec un environnement web dédié à ce blog
  • Nginx 1.0.0 avec exécution PHP par FastCGI
  • PHP 5.3 (PHP-FPM, 4 processus PHP)
  • cache mémoire APC de 64 Mo.

Le graph est quasi linéaire donc niveau matos çà suffit largement.

Iptables : flusher les règles IPv4/IPv6

La manière simple (et dangereuse) de flusher un firewall iptables :

#!/bin/sh
# ipv4
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# ipv6
ip6tables -F
ip6tables -X
ip6tables -t mangle -F
ip6tables -t mangle -X
ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT

Zabbix : monitoring Nginx / PHP-FPM / MySQL

Voici les scripts que j’utilise pour monitorer avec Zabbix des serveurs Nginx / MySQL / PHP-FPM. Je vous livre également une template contenant l’ensemble des items et triggers.

zabbix_agentd.conf :

UserParameter=nginx.active,/etc/zabbix/scripts/nginx.pl|cut -f1|cut -d" " -f2
UserParameter=nginx.requests,/etc/zabbix/scripts/nginx.pl|cut -f2|cut -d" " -f2
UserParameter=nginx.reading,/etc/zabbix/scripts/nginx.pl|cut -f3|cut -d" " -f2
UserParameter=nginx.writing,/etc/zabbix/scripts/nginx.pl|cut -f4|cut -d" " -f2
UserParameter=nginx.waiting,/etc/zabbix/scripts/nginx.pl|cut -f5|cut -d" " -f2
UserParameter=php.ping,/etc/zabbix/scripts/php-fpm_ping.pl
UserParameter=php.conn,/etc/zabbix/scripts/php-fpm_status.pl|cut -f1|cut -d" " -f3
UserParameter=php.idle,/etc/zabbix/scripts/php-fpm_status.pl|cut -f2|cut -d" " -f3
UserParameter=php.active,/etc/zabbix/scripts/php-fpm_status.pl|cut -f3|cut -d" " -f3
UserParameter=php.total,/etc/zabbix/scripts/php-fpm_status.pl|cut -f4|cut -d" " -f3
UserParameter=php.maxchildren,/etc/zabbix/scripts/php-fpm_status.pl|cut -f5|cut -d" " -f3
UserParameter=mysql.status[*],/etc/zabbix/scripts/mysql_status.pl $1

/etc/zabbix/scripts/nginx.pl :

#!/usr/bin/perl#
# Boris HUISGEN <bhuisgen@hbis.fr>

use LWP::UserAgent;

my $URL = "http://127.0.0.1/nginx_status";

#
# DO NOT MODIFY AFTER THIS LINE
#

my $ua = LWP::UserAgent->new(timeout => 15);
my $response = $ua->request(HTTP::Request->new('GET', $URL));

my $active =  0;
my $reading = 0;
my $writing = 0;
my $waiting = 0;
my $requests = 0;

foreach (split(/\n/, $response->content)) {
 $active = $1 if (/^Active connections:\s+(\d+)/);

 if (/^Reading:\s+(\d+).*Writing:\s+(\d+).*Waiting:\s+(\d+)/) {
 $reading = $1;
 $writing = $2;
 $waiting = $3;
 }

 $requests = $3 if (/^\s+(\d+)\s+(\d+)\s+(\d+)/);
}

print "Active: $active\tRequests: $requests\tReading: $reading\tWriting: $writing\tWaiting: $waiting\n";

php-fpm_ping.pl :

#!/usr/bin/perl
#
# Boris HUISGEN <bhuisgen@hbis.fr>

use LWP::UserAgent;

my $URL = "http://127.0.0.1/php5fpm-ping";

#
# DO NOT MODIFY AFTER THIS LINE
#

my $ua = LWP::UserAgent->new(timeout => 15);
my $response = $ua->request(HTTP::Request->new('GET', $URL));

if ($response->is_success) {
 print "1\n";
}
else {
 print "0\n";
}

php-fpm_status.pl :

#!/usr/bin/perl
#
# Boris HUISGEN <bhuisgen@hbis.fr>

use LWP::UserAgent;

my $URL = "http://127.0.0.1/php5fpm-status";

#
# DO NOT MODIFY AFTER THIS LINE
#

my $ua = LWP::UserAgent->new(timeout => 15);
my $response = $ua->request(HTTP::Request->new('GET', $URL));

my $conn = 0;
my $idle = 0;
my $active = 0;
my $total = 0;
my $maxchildren = 0;

foreach (split(/\n/, $response->content)) {
 $conn = $1 if (/^accepted conn:\s+(\d+)/);
 $idle = $1 if (/^idle processes:\s+(\d+)/);
 $active = $1 if (/^active processes:\s+(\d+)/);
 $total = $1 if (/^total processes:\s+(\d+)/);
 $maxchildren = $1 if (/^max children reached:\s+(\d+)/);
}

print "Accepted conn: $conn\tIdle proc: $idle\tActive proc: $active\tTotal proc: $total\tMax children: $maxchildren\n";

mysql_status.pl :

#!/usr/bin/perl
#
# Boris HUISGEN <bhuisgen@hbis.fr>

my($mysql)   = "/usr/bin/mysql";
my($user)    = "zabbix";
my($passwd)  = "abcdef123";
my($host)    = "localhost";

#
# DO NOT MODIFY AFTER THIS LINE
#

=head1 NAME

mysql_status.pl - show MySQL variable status

=head1 SYNOPSIS

 mysql_status.pl VARIABLE

 --help                      print this help message
 --version                   print version information

=head1 DESCRIPTION

This program shows the status of a MySQL variable.

=head1 AUTHOR

Boris HUISGEN <bhuisgen@hbis.fr>

=cut

use strict;
use warnings;

use Getopt::Long qw(:config auto_help auto_version);
use Pod::Usage;

$main::VERSION = "0.1-2011051101";

exit main();

sub show_variable {
 my ($variable) = $_[0];

 my ($cmd) = "$mysql -u $user -p$passwd -h $host --execute \"SHOW STATUS LIKE '$variable'\" --skip-column-name";
 my ($ret) =`$cmd 2> /dev/null`;
 exit(1) unless($ret);

 $ret =~ m/^$variable.[\s\t]*(.*)/;
 print "$1\n";
}

sub main {
 GetOptions ()
 or pod2usage(1);

 pod2usage (1) unless ($#ARGV == 0);

 my ($variable) = $ARGV[0];

 show_variable($variable);
}

# end of script

nginx.conf :

server {
 listen          127.0.0.1:80;
 listen          [::1]:80;
 server_name     localhost;
 root            /var/www/default/www/html;
 access_log      /var/www/default/www/logs/access.log;
 error_log       /var/www/default/www/logs/error.log;
 index           index.html;

 location /nginx_status {
 stub_status on;
 access_log off;
 allow 127.0.0.1;
 deny all;
 }

 location = /php5fpm-status {
 fastcgi_pass    unix:/var/run/php5-fpm.sock;
 fastcgi_index   index.php;
 fastcgi_param   SCRIPT_FILENAME  /var/www/default/www/html$fastcgi_script_name;
 include         fastcgi_params;
 }

 location = /php5fpm-ping {
 fastcgi_pass    unix:/var/run/php5-fpm.sock;
 fastcgi_index   index.php;
 fastcgi_param   SCRIPT_FILENAME  /var/www/default/www/html$fastcgi_script_name;
 include         fastcgi_params;
 }

php-fpm.conf :

pm.status_path = /php5fpm-status
ping.path = /php5fpm-ping
ping.path = /php5fpm-ping

Template Zabbix : template_HBIS.xml

Firewall Builder 4.1.3 : patch IPv6 forwarding

Un petit patch pour corriger les règles automatiques dans le cadre du IPv6 forwarding. Ce cas est injustement oublié par l’option « Add rules to accept IPv6 Neighbor Discovery packets » qu’il convient d’activer dans les paramètres de l’objet firewall.

Dans le cas où vous possédez une version 3, la mise à jour en version 4 est obligatoire.

--- /usr/local/share/fwbuilder-4.1.3/configlets/linux24/automatic_rules.old    2010-12-06 03:00:45.000000000 +0100
+++ /usr/local/share/fwbuilder-4.1.3/configlets/linux24/automatic_rules    2011-02-11 09:39:42.830967384 +0100
@@ -83,12 +83,24 @@
 # rules to permit IPv6 Neighbor discovery
 {{$begin_rule}} INPUT  -p ipv6-icmp -m icmp6 --icmpv6-type router-solicitation -m hl --hl-eq 255 -j ACCEPT {{$end_rule}}
 {{$begin_rule}} OUTPUT -p ipv6-icmp -m icmp6 --icmpv6-type router-solicitation -m hl --hl-eq 255 -j ACCEPT {{$end_rule}}
+{{if ipforw}}
+{{$begin_rule}} FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type router-solicitation -m hl --hl-eq 255 -j ACCEPT {{$end_rule}}
+{{endif}}
 {{$begin_rule}} INPUT  -p ipv6-icmp -m icmp6 --icmpv6-type router-advertisement -m hl --hl-eq 255 -j ACCEPT {{$end_rule}}
 {{$begin_rule}} OUTPUT -p ipv6-icmp -m icmp6 --icmpv6-type router-advertisement -m hl --hl-eq 255 -j ACCEPT {{$end_rule}}
+{{if ipforw}}
+{{$begin_rule}} FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type router-advertisement -m hl --hl-eq 255 -j ACCEPT {{$end_rule}}
+{{endif}}
 {{$begin_rule}} INPUT  -p ipv6-icmp -m icmp6 --icmpv6-type neighbour-solicitation -m hl --hl-eq 255 -j ACCEPT {{$end_rule}}
 {{$begin_rule}} OUTPUT -p ipv6-icmp -m icmp6 --icmpv6-type neighbour-solicitation -m hl --hl-eq 255 -j ACCEPT {{$end_rule}}
+{{if ipforw}}
+{{$begin_rule}} FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type neighbour-solicitation -m hl --hl-eq 255 -j ACCEPT {{$end_rule}}
+{{endif}}
 {{$begin_rule}} INPUT  -p ipv6-icmp -m icmp6 --icmpv6-type neighbour-advertisement -m hl --hl-eq 255 -j ACCEPT {{$end_rule}}
 {{$begin_rule}} OUTPUT -p ipv6-icmp -m icmp6 --icmpv6-type neighbour-advertisement -m hl --hl-eq 255 -j ACCEPT {{$end_rule}}
+{{if ipforw}}
+{{$begin_rule}} FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type neighbour-advertisement -m hl --hl-eq 255 -j ACCEPT {{$end_rule}}
+{{endif}}
 {{endif}}

 {{if drop_invalid}}

Linux : reboot automatique suite à un kernel panic

Par défaut, un « kernel panic » gèle complètement le système. Il n’y a pas de miracle :  il y a un bug logiciel (userland/kernel) voire matériel. Dans le cas d’un serveur/système obsolète, le plus simple reste à activer le reboot automatique par le biais des paramètres noyaux. Par exemple, sur un noyau 2.6 où le reboot est désactivé :

# sysctl -a|grep kernel.panic
kernel.panic = 0
kernel.panic_on_oops = 0

Il faut modifier au moins kernel.panic et kernel.panic_on_oops. Les valeurs associées correspondent au délai en secondes avant le reboot automatique (0 le désactivant).

# nano /etc/sysctl.conf
kernel.panic = 15
kernel.panic_on_oops = 15
# sysctl -p

Moralité : à défaut de vouloir ou pouvoir corriger, on met un pansement pour faire joli :)

Haut de page