ToutSurTout.biz
Nginx et CloudFlare


http://www.zupmage.eu/i/SlvtC3hwbt.png

Pour lancer un site à haute performance, une solution peu onéreuse et très efficace existe: combiner le CDN gratuit CloudFlare et le serveur web Nginx (prononcer "engine-x"). On aura ainsi l'amélioration de performances notable de CloudFlare qui prendra toutes les requêtes en front (grosses économies de BP et de requêtes) et Nginx qui servira CloudFlare de façon plus efficace qu'un Apache ou Lighttpd.

On aura donc besoin d'un dédié (dans notre cas Debian, mais rien ne devrait changer pour des plateformes Linux) et d'un compte CloudFlare gratuit.

Sur le dédié, on aura installé: Nginx (bien sûr) mais aussi php5-fpm (pour PHP sur Nginx). En gros:

apt-get install nginx

service nginx start

apt-get install php5-fpm

service php5-fpm start

Je vous laisse le soin de configurer/optimiser le tout, de bons articles existent (gzip, etc).

On va plutôt s'intéresser à adapter notre serveur web au CDN.

Pour cela, on va modifier nginx.conf (souvent dans /etc/nginx/nginx.conf)

On commence par ajouter les lignes suivantes:

# IP CloudFlare
    set_real_ip_from    204.93.240.0/24;
    set_real_ip_from    204.93.177.0/24;
    set_real_ip_from    199.27.128.0/21;
    set_real_ip_from    173.245.48.0/20;
    set_real_ip_from    103.21.244.0/22;
    set_real_ip_from    103.22.200.0/22;
    set_real_ip_from    103.31.4.0/22;
    set_real_ip_from    141.101.64.0/18;
    set_real_ip_from    108.162.192.0/18;
    set_real_ip_from    190.93.240.0/20;
    set_real_ip_from    188.114.96.0/20; 
    set_real_ip_from    197.234.240.0/22;
    set_real_ip_from    198.41.128.0/17;
    set_real_ip_from    162.158.0.0/15;
    set_real_ip_from    2400:cb00::/32;
    set_real_ip_from    2606:4700::/32;
    set_real_ip_from    2803:f800::/32;
    set_real_ip_from    2405:b500::/32;
    set_real_ip_from    2405:8100::/32;
    real_ip_header      CF-Connecting-IP;

Cela nous permettra d'avoir les vraies IP dans les logs, et non celles des serveurs de CloudFlare (puisqu'il n'y a plus qu'eux qui se connecteront au serveur). Source pour les IP de CloudFlare.

Pensez à vérifer que votre version de Nginx a été compilée avec http_realip_module, c'est possible avec la commande

nginx -V

Ensuite, pour éviter les erreurs "Website currently unreachable", on va augmenter la taille des buffers proxy pour Nginx. En gros, on va autoriser aux proxys plus de mémoire (et il faut le faire, puisque ce sont les seuls qui contacteront votre serveur désormais)

# Augmenter taille buffers pour CF
    proxy_buffer_size    128k;
    proxy_buffers     4 256k;
    proxy_busy_buffers_size 256k;
    proxy_temp_file_write_size 256k;

Enfin, si vous ne l'avez pas fait, pensez à allouer à PHP une mémoire suffisante pour que vos applis tournent proprement:

# Augmenter taille buffers pour PHP
    fastcgi_temp_file_write_size 10m;
    fastcgi_busy_buffers_size 512k;
    fastcgi_buffer_size 512k;
    fastcgi_buffers 16 512k;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_intercept_errors on;
    fastcgi_next_upstream error invalid_header timeout http_500;

Bonus: si vous utilisez Fail2ban, comme je vous le recommande, pensez à laisser passer les IP CloudFlare: dans jail.conf, remplacez la ligne ignoreip comme suit

ignoreip = 127.0.0.1/8 204.93.240.0/24 204.93.177.0/24 199.27.128.0/21 173.245.48.0/20 103.21.244.0/22 103.22.200.0/22 103.31.4.0/22 141.101.64.0/18 108.162.192.0/18 190.93.240.0/20 188.114.96.0/20 197.234.240.0/22 198.41.128.0/17 162.158.0.0/15