DirectAdmin met Nginx: snelheid

ICTscripters maakt gebruik van cookies. Door het gebruiken en browsen naar onze site gaat je automatisch akkoord met het gebruik van cookies. Klik hier voor meer informatie

  • Waarom Nginx gebruiken?
    Als je nginx voor je websites zet, kun je zo:
    - Kleine ddos aanvallen afslaan
    - Websites worden super snel ingeladen
    - Mogelijkheid om te combineren met mod_pagespeed, om bv je html, js, css etc te comprimeren
    - Het kan ook dienen als loadbalancer, als 1 server offline is, kun je gebruikers transparant doorsturen naar een andere server

    Wie gebruikt het?
    Wordpress.com, Facebook, Hulu, sourceforge, ...
    En natuurlijk ook ictscripters.com :thumbup:

    Goed, nu je bent overtuigd, kunnen we aan de slag gaan.
    Deze handleiding dient vooral voor gebruik in combinatie met DirectAdmin (en debian), maar je kan hem eigenlijk even goed gebruiken op andere linux distributies en hosting panelen.
    Het enige dat kan voorkomen is dat bepaalde commando's vervangen moeten worden door native commando's voor je OS.

    Stap 1: transparantie
    Als je je website achter een super snelle proxy zet, wil je wel nog weten wie je website bezoekt.
    Daarom: installeer mod_rpaf.
    Hierover heb ik een aparte tutorial geschreven:
    ictscripters.com/index.php?page=UserBlogEntry&entryID=79

    Stap 2: als we het doen, doen we het goed
    We gaan eerst de google plugin mod_pagespeed compileren.
    Deze geeft ons heel veel extra mogelijkheden om de snelheid van je site echt drastisch omhoog te halen. :D


    Volg de instructies:

    - Installeer alle voorbereidende pakketten:

    PHP Source Code

    1. sudo apt-get install build-essential zlib1g-dev libpcre3 libpcre3-dev

    - Download mod_pagespeed zelf:

    PHP Source Code

    1. cd ~
    2. wget [url]https://github.com/pagespeed/ngx_pagespeed/archive/v1.7.30.3-beta.zip[/url]
    3. unzip v1.7.30.3-beta.zip # or unzip v1.7.30.3-beta
    4. cd ngx_pagespeed-1.7.30.3-beta/
    5. wget [url]https://dl.google.com/dl/page-speed/psol/1.7.30.3.tar.gz[/url]
    6. tar -xzvf 1.7.30.3.tar.gz # expands to psol/

    MAAR:
    - vervang de versie nummers door de laatste versie
    - voer nog niet de ./configure lijn uit!

    Dan gaan we nginx zelf downloaden:
    Noot: download de laatste versie van: nginx.org/en/download.html

    PHP Source Code

    1. cd ~
    2. wget [url]http://nginx.org/download/nginx-1.4.6.tar.gz[/url]
    3. tar -xvzf nginx-1.4.6.tar.gz
    4. cd nginx-1.4.6/


    Dan dienen we tegen andere tutorials in te gaan en onze eigen opties meegeven. We willen mod_pagespeed nu mee compileren in nginx:

    PHP Source Code

    1. ./configure --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-http_ssl_module --add-module=$HOME/ngx_pagespeed-1.7.30.3-beta --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --http-log-path=/var/log/nginx/access.log

    Noot: vervang ook hierin het versie nummer van de laatste versie van ngx_pagespeed!

    Dan nog 2 commando's en je bent klaar:

    PHP Source Code

    1. make
    2. make install


    Stap 3: nu willen we zorgen dat nginx een start stop script heeft.
    Dit script heb ik van volgende link, alleen is het zo aangepast dat het werkt op de configuratie die we hierboven hebben gemaakt:
    github.com/Fleshgrinder/nginx-sysvinit-script

    PHP Source Code

    1. nano -w /etc/init.d/nginx

    PHP Source Code

    1. #!/bin/sh
    2. ### BEGIN INIT INFO
    3. # Provides: nginx
    4. # Required-Start: $local_fs $remote_fs $network $syslog $named
    5. # Required-Stop: $local_fs $remote_fs $network $syslog $named
    6. # Default-Start: 2 3 4 5
    7. # Default-Stop: 0 1 6
    8. # Short-Description: nginx LSB init script
    9. # Description: nginx Linux Standards Base compliant init script.
    10. ### END INIT INFO
    11. # -----------------------------------------------------------------------------
    12. # This is free and unencumbered software released into the public domain.
    13. #
    14. # Anyone is free to copy, modify, publish, use, compile, sell, or
    15. # distribute this software, either in source code form or as a compiled
    16. # binary, for any purpose, commercial or non-commercial, and by any
    17. # means.
    18. #
    19. # In jurisdictions that recognize copyright laws, the author or authors
    20. # of this software dedicate any and all copyright interest in the
    21. # software to the public domain. We make this dedication for the benefit
    22. # of the public at large and to the detriment of our heirs and
    23. # successors. We intend this dedication to be an overt act of
    24. # relinquishment in perpetuity of all present and future rights to this
    25. # software under copyright law.
    26. #
    27. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    28. # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    29. # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
    30. # IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
    31. # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
    32. # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
    33. # OTHER DEALINGS IN THE SOFTWARE.
    34. #
    35. # For more information, please refer to <http://unlicense.org>
    36. # -----------------------------------------------------------------------------
    37. # -----------------------------------------------------------------------------
    38. # nginx Linux Standards Base compliant init script.
    39. #
    40. # LINK: https://wiki.debian.org/LSBInitScripts
    41. # IDEAS BY: Karl Blessing <http://kbeezie.com/debian-ubuntu-nginx-init-script/>
    42. # AUTHOR: Richard Fussenegger <[email protected]>
    43. # COPYRIGHT: Copyright (c) 2013 Richard Fussenegger
    44. # LICENSE: http://unlicense.org/ PD
    45. # LINK: http://richard.fussenegger.info/
    46. # -----------------------------------------------------------------------------
    47. # -----------------------------------------------------------------------------
    48. # Includes
    49. # -----------------------------------------------------------------------------
    50. # Load the LSB log_* functions.
    51. . /lib/lsb/init-functions
    52. # -----------------------------------------------------------------------------
    53. # Variables
    54. # -----------------------------------------------------------------------------
    55. # The name of the service (must be the first variable).
    56. NAME="nginx"
    57. # Absolute path to the executable.
    58. DAEMON="/usr/local/nginx/sbin/${NAME}"
    59. # Arguments that should be passed to the executable.
    60. DAEMON_ARGS=""
    61. # Absolute path to the PID file.
    62. PIDFILE="/var/run/${NAME}.pid"
    63. # -----------------------------------------------------------------------------
    64. # Bootstrap
    65. # -----------------------------------------------------------------------------
    66. # Check return status of EVERY command
    67. set -e
    68. # Check if ${NAME} is a file and executable, if not assume it's not installed.
    69. if [ ! -x ${DAEMON} ]; then
    70. log_failure_msg ${NAME} "not installed"
    71. exit 1
    72. fi
    73. # This script is only accessible for root (sudo).
    74. if [ $(id -u) != 0 ]; then
    75. log_failure_msg "super user only!"
    76. exit 1
    77. fi
    78. # Always check if service is already running.
    79. RUNNING=$(start-stop-daemon --start --quiet --pidfile ${PIDFILE} --exec ${DAEMON} --test && echo "false" || echo "true")
    80. # -----------------------------------------------------------------------------
    81. # Functions
    82. # -----------------------------------------------------------------------------
    83. ###
    84. # Reloads the service.
    85. #
    86. # RETURN:
    87. # 0 - successfully reloaded
    88. # 1 - reloading failed
    89. ###
    90. reload_service() {
    91. start-stop-daemon --stop --signal HUP --quiet --pidfile ${PIDFILE} --exec ${DAEMON}
    92. }
    93. ###
    94. # Starts the service.
    95. #
    96. # RETURN:
    97. # 0 - successfully started
    98. # 1 - starting failed
    99. ###
    100. start_service() {
    101. start-stop-daemon --start --quiet --pidfile ${PIDFILE} --exec ${DAEMON} -- ${DAEMON_ARGS}
    102. }
    103. ###
    104. # Stops the service.
    105. #
    106. # RETURN:
    107. # 0 - successfully stopped
    108. # 1 - stopping failed
    109. ###
    110. stop_service() {
    111. start-stop-daemon --stop --quiet --pidfile ${PIDFILE} --name ${NAME}
    112. }
    113. # -----------------------------------------------------------------------------
    114. # Handle Input
    115. # -----------------------------------------------------------------------------
    116. case ${1} in
    117. force-reload|reload)
    118. if [ ${RUNNING} = "false" ]; then
    119. log_failure_msg ${NAME} "not running"
    120. else
    121. log_daemon_msg ${NAME} "reloading configuration"
    122. reload_service || log_end_msg 1
    123. log_end_msg 0
    124. fi
    125. ;;
    126. restart)
    127. if [ ${RUNNING} = "false" ]; then
    128. log_failure_msg ${NAME} "not running"
    129. else
    130. log_daemon_msg ${NAME} "restarting"
    131. stop_service || log_end_msg 1
    132. sleep 0.1
    133. start_service || log_end_msg 1
    134. log_end_msg 0
    135. fi
    136. ;;
    137. start)
    138. if [ ${RUNNING} = "true" ]; then
    139. log_success_msg ${NAME} "already started"
    140. else
    141. log_daemon_msg ${NAME} "starting"
    142. start_service || log_end_msg 1
    143. log_end_msg 0
    144. fi
    145. ;;
    146. status)
    147. status_of_proc ${DAEMON} ${NAME} && exit 0 || exit ${?}
    148. ;;
    149. stop)
    150. if [ ${RUNNING} = "false" ]; then
    151. log_success_msg ${NAME} "already stopped"
    152. else
    153. log_daemon_msg ${NAME} "stopping"
    154. stop_service && log_end_msg 0 || log_end_msg 1
    155. fi
    156. ;;
    157. *)
    158. echo "Usage: ${NAME} {force-reload|reload|restart|start|status|stop}" >&2
    159. exit 1
    160. ;;
    161. esac
    162. :
    163. exit 0
    Laat alles zien


    En dan geven we aan dit start/stop script nog de rechten om gestart te worden:
    chmod +x /etc/init.d/nginx

    Stap 4: nu nginx nog instellen om alle verzoeken van nginx door te sturen naar apache (directadmin httpd)

    Edit de config:
    nano -W /etc/nginx/nginx.conf
    En vul er het volgende in:

    PHP Source Code

    1. user apache apache;
    2. worker_processes 1;
    3. worker_rlimit_nofile 8192;
    4. pid /var/run/nginx.pid;
    5. events {
    6. worker_connections 1024;
    7. multi_accept on;
    8. use epoll;
    9. }
    10. http {
    11. include mime.types;
    12. default_type application/octet-stream;
    13. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    14. '$status $body_bytes_sent "$http_referer" '
    15. '"$http_user_agent" "$http_x_forwarded_for"';
    16. error_log /var/log/nginx/error.log debug;
    17. access_log /var/log/nginx/access.log main;
    18. sendfile on;
    19. keepalive_timeout 65;
    20. gzip on;
    21. gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    22. gzip_comp_level 9;
    23. gzip_proxied any;
    24. pagespeed on;
    25. pagespeed FileCachePath /var/ngx_pagespeed_cache;
    26. #enable CoreFilters
    27. pagespeed RewriteLevel CoreFilters;
    28. ## cache configuration
    29. proxy_cache_key $host$request_uri;
    30. proxy_cache_path /var/cache/nginx/ levels=1:2 keys_zone=images:150m;
    31. ################################
    32. server {
    33. listen xxx.xxx.xxx.xxx:81 default rcvbuf=8192 sndbuf=16384 backlog=32000; # Real IP here
    34. server_name domain.name _ ; # "_" is for handle all hosts that are not described by server_name
    35. charset off;
    36. access_log /var/log/nginx/nginx_host_general.access.log main;
    37. types_hash_max_size 2048;
    38. # Ensure requests for pagespeed optimized resources go to the pagespeed
    39. # handler and no extraneous headers get set.
    40. location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; }
    41. location ~ "^/ngx_pagespeed_static/" { }
    42. location ~ "^/ngx_pagespeed_beacon$" { }
    43. location /ngx_pagespeed_statistics { allow 127.0.0.1; deny all; }
    44. location /ngx_pagespeed_global_statistics { allow 127.0.0.1; deny all; }
    45. location /ngx_pagespeed_message { allow 127.0.0.1; deny all; }
    46. location /pagespeed_console { allow 127.0.0.1; deny all; }
    47. location / {
    48. proxy_set_header Host $host;
    49. proxy_set_header X-Real-IP $remote_addr;
    50. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    51. proxy_pass http://xxx.xxx.xxx.xxx; # Real IP here
    52. client_max_body_size 16m;
    53. client_body_buffer_size 128k;
    54. proxy_buffering on;
    55. proxy_connect_timeout 90;
    56. proxy_send_timeout 90;
    57. proxy_read_timeout 120;
    58. proxy_buffer_size 16k;
    59. proxy_buffers 32 32k;
    60. proxy_busy_buffers_size 64k;
    61. proxy_temp_file_write_size 64k;
    62. }
    63. }
    64. # below is include so that you can have separate setting per vhost.
    65. include /usr/local/nginx/vhosts/*.conf;
    66. }
    Laat alles zien

    Vervang xxx.xxx.xxx.xxx door het ip van je server!

    Stap 5: laten we nginx starten!
    Voer volgend commando uit:
    /etc/init.d/nginx start
    Dit is het startscript dat we daarnet hebben aangemaakt.

    Als alles goed gaat, kun je nu je websites bezoeken op poort 81.
    Deze zal dan naar poort 80 gaan en de websites inladen via apache.
    Alles via poort 81 wordt geoptimaliseerd en versneld.

    Zo kun je veilig je wijzigingen testen, zonder live websites per ongeluk kapot te maken.


    Stap 6: We gaan live voor iedereen
    Eens je gerust bent, kun je in csf (configServer Security & Firewall) poort 81 laten doorsturen naar poort 80.
    Dit kun je vanuit directadmin doen (als je csf hebt geïnstalleerd staan) onder "Firewall redirect".
    Onderaan in dit bestand kun je dan volgende regel toevoegen:
    xxx.xxx.xxx.xxx|80|xxx.xxx.xxx.xxx|81|tcp

    Nu wordt je site langs nginx geoptimaliseerd, gecached en doorgestuurd naar apache indien hij extra informatie nodig heeft.

    De snelheidswinst meten
    Deze transparante proxy heeft voor mijn sites een verbetering van minstens 10 punten opgeleverd (en sommige veel meer) volgend google insights.
    Je kan de snelheid van je site gratis testen op:
    developers.google.com/speed/pagespeed/insights/

    Noot: ICTscripters draait nog op een oude nginx configuratie, deze zal de komende dagen worden overgezet op de nieuwe.
    Dan zal hij pas echt snel worden. :)
    dimoweb.com draait nu bijvoorbeeld wel al op de nieuwe configuratie.
    Test hem gerust in de tool. :thumbsup:

    Veel succes met het optimaliseren van je sites!
    Heeft het jou geholpen? Post dan als dank gerust een nieuwe tutorial of blog post over je IT bezigheden op ICTscripters! Alvast bedankt. :)


    Update: ik heb nadien nog volgend commando gedraaid, dit om zeker te zijn dat als de server reboot, ook nginx mee terug opstart:

    PHP Source Code

    1. update-rc.d nginx defaults

    Dit commando is directadmin specifiek vermoed ik.
    ----------------------------------------------
    K.Rens
    Zaakvoerder DiMoWeb
    dimoweb.com

    2,763x gelezen

Reacties 5

  • ismail123 -

    Probeer maar eens nginx met phalcon C PHP extension te combineren, dan kan je low-budget VPS gebruiken voor een grote web applicatie :)
    Handelt ongeveer 2.000 RPS af, voor een low-budget VPS.
    Daarbij kan je nog apc cache gebruiken, zeer handig voor distributie data!
    Komt vele voordelen bij kijken, een full-blown professionele web-app!
    Dat is beter dan een high-end VPS die bijvoorbeeld zendframework gebruikt en 250ms nodig heeft per request om te verwerken, dan het bovenstaande en 25ms nodig hebben. Het is goedkoper om te investeren in goede code / server structuur dan meer resources kopen. Voor 10 servers zal de gebruiker nogsteeds 250ms moeten wachten op verwerking van zijn request.

  • K.Rens -

    @T.Aaron: je hebt je configuratie bestand in je /etc/init.d/nginx bestand gezet. Ik denk dat je ergens een stapje niet correct hebt gevolgd of hebt verwisseld. Ik help je verder via pb.

  • Aaron -

    bij mij lukt dit helaas niet, ik probeerde alles mooi uit, maar op poort 81 komt er niets,
    ook niet als ik de firewall afleg

  • K.Rens -

    Ja, dat maakt een zeer groot verschil!

  • Cas -

    Bedankt!

    Ik gebruikte nginx al, echter in combinatie met Mod_Pagespeed worden de websites op mijn server toch nog sneller.