Apache : autoriser le partage cross-domain des ressources
- Mardi 20 septembre 2011
- Par Boris HUISGEN
- Ecrire
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin *
</IfModule>
Source : http://enable-cors.org/
Archives pour la catégorie ‘Administration’
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin *
</IfModule>
Source : http://enable-cors.org/
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.
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
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
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;
}
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 :
Le graph est quasi linéaire donc niveau matos çà suffit largement.
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
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
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}}
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 :)