å©çšå¯èœãªã¡ã¢ãªãšã¹ã¯ããã¢ã¯ãã£ããã£ã決å®ããŸãã
æé©åãéå§ããåã«ã䜿çšãããã¡ã¢ãªã®éãèŠãŠã¿ãŸãããã ãããè¡ãã«ã¯ã次ã®ã³ãã³ããå®è¡ããŸãã
$ free -m
ãã®ããã«ã å®è¡äžã®ããã»ã¹ã®ãªã¹ãã衚瀺ããã¡ã¢ãªäœ¿çšéã§ãœãŒãããã«ã¯ã次ã®ã³ãã³ããå®è¡ããå¿ èŠããããŸãã
$ ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -r | less
å°éã®RAMãæ¶è²»ããããã«LAMPãµãŒããŒãæ§æããŸãã åæ¢ããäžèŠãªãµãŒãã¹ãç¡å¹ã«ããŸã
æåã«æãããªè³ªåã¯ãã䜿çšããå¿ èŠã®ãªããµãŒãã¹ã¯äœã§ããïŒãã§ãã æè¿ããµãŒãã¹ã管çããããã®éåžžã«äŸ¿å©ãªãŠãŒãã£ãªãã£ãçºèŠããŸããã ã sysv-rc-conf ããšåŒã°ããæ¬äŒŒã°ã©ãã£ãã¯ãšãã§ãã¯ããã¯ã¹ã䜿çšããŠãµãŒãã¹ã管çããŸãã 次ã®ããã«ãªããŸãã

å€æŽãããµãŒãã¹ã®ãªã¹ãã以äžã«ç€ºããŸãã
- åŸçœ® ãã®ãµãŒãã¹ã䜿çšãããšããã¡ã€ã³ã®é»åã¡ãŒã«ã¡ãã»ãŒãžãéåä¿¡ã§ããŸãã ãããã®ç®çã®ããã«ãGoogle Appsã䜿çšããŠã¡ãŒã«ãšã¡ãŒã«ãã³ãããã¥ãŒã¹è³Œèªè ã«éä¿¡ããŸãã ãã®ããããã®ãµãŒãã¹ãåæ¢ããŠãªãã«ããŸããã
- ãã€ã³ã9 ã ãã¡ã€ã³ã®DNSã¬ã³ãŒãã管çããå¿ èŠããããŸãã DNSã¬ã³ãŒãã¯ãã¹ãŠãã¹ãã«ä¿åããããããç¡å¹ã«ããããšãã§ããŸãã
- SSHD ã¯ããã«å°ãªãã¡ã¢ãªã䜿çšããä»ã®å®è£ ããããŸãããsftpããµããŒãããªãããããã®ãµãŒãã¹ã¯å€æŽããŸããã
XãµãŒããŒãèµ·åããããã¹ãŠã®äžèŠãªãµãŒãã¹ããªãã«ããŠãåºæ¬çãªå¿ èŠãªæ©èœã®ã¿ã§ApacheãMySQLãPHPãæ§æããªãã§ãã ããã
ã¢ããã
Apacheã®æ倧ã®åé¡ã¯ãApacheã䜿çšããRAMã®éã§ãã äœæ¥ãé«éåããRAMã®æ¶è²»ãåæžããããã«ã次ã®æ¹æ³ãæ€èšããŸãã
- åæãªã¯ãšã¹ãã®åŠçãæžãã
- ã¢ãžã¥ãŒã«ã®èªã¿èŸŒã¿ãå°ãªãïŒæªäœ¿çšãç¡å¹ã«ããïŒã
- ãã®ã³ã°ãå°ãªããªããŸãã
å®è¡äžã®æãå°ãªãåããã»ã¹ã®ã¿ã䜿çšããããã«Apacheãæ§æãã
Preforkã¯æ¬åœã®éæ³ãèµ·ããå Žæã§ãã ããã¯ãå€ãã®ããã»ã¹ãçæããããã«Apacheã«æ瀺ããå Žæã§ãã ããã©ã«ãã§ã¯ã倧éãå²ãåœãŠããããµãŒããŒã®RAMãæ¶è²»ãããŸãã apache2.confãããŸãã«ãå€ãã®ãµãŒããŒãå®è¡ããããã«æ§æãããŠããªãããšããŸãã¯å€ãã®äºåãµãŒããŒãããããšã確èªããŠãã ããã 以äžã«äŸã瀺ããŸãã
<IfModule mpm_prefork_module> StartServers 1 MinSpareServers 1 MaxSpareServers 3 MaxClients 10 MaxRequestsPerChild 3000 </IfModule> <IfModule mpm_worker_module> StartServers 1 MinSpareThreads 5 MaxSpareThreads 15 ThreadLimit 25 ThreadsPerChild 5 MaxClients 25 MaxRequestsPerChild 200 </IfModule>
ãŸããã KeepAliveTimeout ããã©ã¡ãŒã¿ãŒãå¿ ã10ãŸãã¯15ã«èª¿æŽããŠãã ãããç§ã®æèŠã§ã¯ã15ç§ã¯å°ããªããŒãžã衚瀺ããã®ã«å¿ èŠãªé·ããããé·ããããŒãžã®è¡šç€ºã«é·ãæéãããããããçããªããŸãã
æãå¿ èŠãªã¢ãžã¥ãŒã«ã®ã¿ãããŠã³ããŒããã
ããã©ã«ãã®Apache WebãµãŒããŒã¯ãäžèŠãªã¢ãžã¥ãŒã«ã倧éã«ããŒãããŸãã 次ã®ã³ãã³ãã䜿çšããŠãã€ã³ã¹ããŒã«ããã³æå¹åãããŠããã¢ãžã¥ãŒã«ã確èªã§ããŸãã
# apache2ctl -M
以äžã¯ãWordpressãæ©èœããããã«å¿ èŠãªã¢ãžã¥ãŒã«ã®ãªã¹ãã§ãã
LoadModule dir_module modules/mod_dir.so LoadModule log_config_module modules/mod_log_config.so LoadModule mime_module modules/mod_mime.so LoadModule setenvif_module modules/mod_setenvif.so LoadModule alias_module modules/mod_alias.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule rewrite_module modules/mod_rewrite.so
ã¡ã¢ãªãç¯çŽããããã«ãæ®ãã®ã¢ãžã¥ãŒã«ãã³ã¡ã³ãåããå¿ èŠããããŸãã ãŸãã¯ãã³ãã³ãã©ã€ã³ããã¢ãžã¥ãŒã«ãæå¹/ç¡å¹ã«ããããšãã§ããŸãã æå¹ã«ããã«ã¯ã次ã®ã³ãã³ãã䜿çšããŸãã
# a2enmod module_name
ç¡å¹ã«ããã«ã¯ïŒ
# a2dismod module_name
æäœåŸãApache WebãµãŒããŒã確å®ã«åèµ·åããå¿ èŠããããŸãã
# service apache2 restart
ãã®ã³ã°ãåæž
ããã©ãŒãã³ã¹ãæ倧éã«é«ãããå Žåã¯ããã®ã³ã°ãå¶éããå¿ èŠããããŸãã ç§ã®ãµãŒããŒã§ã¯ãã¬ãã«ãããšã©ãŒãã«èšå®ããŸããã ãŸãã詳现ãªçµ±èšæ å ±ãå¿ èŠãªãå Žåã¯ãUser-AgentãŸãã¯http-refererãã®ã³ã°ãç¡å¹ã«ããããšãã§ããŸãã
# ErrorLog: The location of the error log file. # If you do not specify an ErrorLog directive within a <VirtualHost> # container, error messages relating to that virtual host will be # logged here. If you *do* define an error logfile for a <VirtualHost> # container, that host's errors will be logged there and not here. # ErrorLog ${APACHE_LOG_DIR}/error.log # # LogLevel: Control the number of messages logged to the error_log. # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. # LogLevel error
ç§ã¯ãã®ãããªèšå®ã«æºè¶³ããŠããŸãããããªãã決ããŸãã
MySQLãµãŒããŒã®æé©å
å°éã®RAMã䜿çšããããã«MySQLã調æŽããã®ã¯éåžžã«ç°¡åã§ãã
次ã«ã次ã®ã¿ã€ãã®MySQLèšå®ãæ€èšããŸãã
- ãªãã«ã§ãããã®ã
- MySQLãµãŒããŒã®ãã©ã¡ãŒã¿ãŒã®æé©åã
- ãµãŒãããŒãã£ã®MySQLæ§æã«ã¹ã¿ãã€ãºããŒã«ã
MySQLãæé©åããã«ã¯ã / etc / mysql / my.cnfãã¡ã€ã«ãç·šéããå¿ èŠããããŸãã
ãªãã«ããå¿ èŠããããã®
Mysqlã¯ããã€ãã®ããŒãã«ã¹ãã¬ãŒãžãšã³ãžã³ãæäŸããŸãã ãã®ãã¡ã®2ã€ãæã人æ°ãããã InnoDBãšMyISAMã§ãã ãããã®äž»ãªéãïŒ
- MyISAMã¯ããŒãã«ã¬ãã«ã®ããã¯ãæäŸããŸããã€ãŸããæ å ±ãããŒãã«ã«æžã蟌ãŸãããšãããŒãã«å šäœãããã¯ããããã®æç¹ã§åãããŒãã«ã§åæã«å®è¡ããå¿ èŠãããã¬ã³ãŒããããå Žåãæåã®ã¬ã³ãŒããæ£åžžã«è¿œå ããããŸã§åŸ æ©ããå¿ èŠããããŸã;
- äžæ¹ã InnoDBã¯è¡ã¬ãã«ã®ããã¯ãæäŸããŸããã€ãŸããæååãžã®æžã蟌ã¿ãçºçãããšããã®åäžã®è¡ã®ã¿ãããã¯ãããŸãã æ®ãã¯èšé²ã«äœ¿çšã§ããŸãã
ããŒãã«ã¬ãã«ã®ããã¯ã®åé¡ã¯ãéåžžã«ããžãŒãªãµãŒããŒã§ã®ã¿é¡èã§ãã éåžžã®Webãµã€ãã®å ŽåãMyISAMã¯å®äŸ¡ãªãµãŒããŒã§æé«ã®ããã©ãŒãã³ã¹ã瀺ããŸãã
MyISAMããŒãã«ã䜿çšããå Žåã¯ãmy.cnfæ§æãã¡ã€ã«ã«æ¬¡ã®è¡ãè¿œå ããå¿ èŠããããŸãã
default-storage-engine=MyISAM default-tmp-storage-engine=MyISAM
MyISAMããŒãã«ã®ã¿ãããå Žåã¯ãInnoDBãšã³ãžã³ãç¡å¹ã«ããŠãmy.cnfã«1è¡ã ãè¿œå ããããšã§RAMãç¯çŽã§ããŸãã
skip-innodb
éå»ã«InnoDBã䜿çšããŠããå Žåã以äžã§ãã¹ãŠã®InnoDBããŒãã«ãMyISAMã«èªåçã«å€æããã¹ã¯ãªãããæäŸããŸãã
#!/bin/bash MYSQLCMD=mysql for db in `echo show databases | $MYSQLCMD | grep -v Database`; do for table in `echo show tables | $MYSQLCMD $db | grep -v Tables_in_`; do TABLE_TYPE=`echo show create table $table | $MYSQLCMD $db | sed -e's/.*ENGINE=\([[:alnum:]\]\+\)[[:space:]].*/\1/'|grep -v 'Create Table'` if [ $TABLE_TYPE = "InnoDB" ] ; then mysqldump $db $table > $db.$table.sql echo "ALTER TABLE $table ENGINE = MyISAM" | $MYSQLCMD $db fi done done
MySQLãµãŒããŒã®ãã©ã¡ãŒã¿ãŒãæé©åããŸã
以äžã¯ãMySQLãµãŒããŒãé«éåããããã«èª¿æŽã§ããããã€ãã®ãã©ã¡ãŒã¿ãŒã§ãã
ããŒãããã¡ãµã€ãº
ããã¯ãRAMã®æ¶è²»ãšæé©åã«å¿ èŠãªããã©ãŒãã³ã¹ã«åœ±é¿ããæãéèŠãªãã©ã¡ãŒã¿ãŒã®1ã€ã§ãã MySQLã¯ã€ã³ããã¯ã¹åããããã¹ãŠã®ãã®ãããŒãããã¡ã«é 眮ããããšããããããã®ãªãã·ã§ã³ã¯éåžžã«é«ãããã©ãŒãã³ã¹ããããããŸãã SQLã¯ãšãªã¯RAMããçŽæ¥éä¿¡ãããŸãã ããŒãããã¡ã«èšå®ãããµã€ãºãèšãããšã¯ã§ããŸããã䜿çšã§ããRAMã®éããããã®ã¯ããªãã ãã ããã§ãã
ã¯ãšãªãã£ãã·ã¥
åãã¯ãšãªãé£ç¶ããŠ2åå®è¡ãããšãçµæãã¯ãšãªãã£ãã·ã¥ã«æ ŒçŽããããããmysqlã¯ã¯ãšãªãå床å®è¡ããå¿ èŠããªããªããŸãã ããã©ãŒãã³ã¹ãæ¹åããå Žåããã®ãªãã·ã§ã³ã¯å€§ããªã¡ãªããããããŸãããã¡ã¢ãªæ¶è²»ãå¢å ããŸãã ãããã£ãŠããã®ãã©ã¡ãŒã¿ãŒã¯å€§ãããããå°ããããªãããã«ãã€ãŸãWebãµã€ãã«å¿ èŠãªã ãèšå®ããå¿ èŠããããŸãã
以äžã¯ãã¯ãšãªãã£ãã·ã¥ã®åäœã«åœ±é¿ãäžãã3ã€ã®å€æ°ã§ãã
query_cache_size query_cache_limit query_cache_type
æ¥ç¶ã®æ倧æ°
ããã¯ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒã§ãã ãã§ã«apacheããã»ã¹ã®æ°ãå¶éããŠããå Žåããã¹ãŠããã§ã«åé¡ãããŸããã ããã§ãªããæ°åã®ãŠãŒã¶ãŒãåæã«åŠçããå¿ èŠãããå Žåã¯ããã®ãã©ã¡ãŒã¿ãŒã®å€ãå¢ããå¿ èŠããããŸãã
ããŒãã«ãã£ãã·ã¥
ããŒãã«ã«ã¢ã¯ã»ã¹ãããã³ã«ãMySQLã¯ããŒãã«åç §ãããŒãã«ãã£ãã·ã¥ã®1ã€ã®ãšã³ããªãšããŠããŒãããŸãã ããã¯ããŒãã«ãžã®äžŠåã¢ã¯ã»ã¹ããšã«è¡ãããŸãããã¡ã¢ãªäœ¿çšéã§ã¯ãªããããã©ãŒãã³ã¹ã«ãšã£ãŠéåžžã«éèŠã§ãã ããŒãã«ãã£ãã·ã¥ã¯åžžã«å¢ããããšãã§ããŸããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§éããŠãããã¡ã€ã«ã®æ°ãå¶éã«éããããããã®ããšã«æ³šæããŠãã ããã ããŒãã«ãã£ãã·ã¥ãå°ããããå Žåãmysqlã¯ããªããukeããŸãããããã¯æãŸãããããŸããã
以äžã¯æ£ããmy.cnfã§ãæäœæéãã©ã³ã®VPSã§æé©åããŸããã
ç§ã®my.cnf
[mysqld] port = 3306 socket = /var/lib/mysql/mysql.sock skip-locking key_buffer = 16K max_allowed_packet = 1M table_cache = 4 sort_buffer_size = 64K read_buffer_size = 256K read_rnd_buffer_size = 256K net_buffer_length = 2K thread_stack = 64K # For low memory, InnoDB should not be used so keep skip-innodb uncommented unless required skip-innodb # Uncomment the following if you are using InnoDB tables #innodb_data_home_dir = /var/lib/mysql/ #innodb_data_file_path = ibdata1:10M:autoextend #innodb_log_group_home_dir = /var/lib/mysql/ #innodb_log_arch_dir = /var/lib/mysql/ # You can set .._buffer_pool_size up to 50 - 80 % # of RAM but beware of setting memory usage too high #innodb_buffer_pool_size = 16M #innodb_additional_mem_pool_size = 2M # Set .._log_file_size to 25 % of buffer pool size #innodb_log_file_size = 5M #innodb_log_buffer_size = 8M #innodb_flush_log_at_trx_commit = 1 #innodb_lock_wait_timeout = 50 [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash # Remove the next comment character if you are not familiar with SQL #safe-updates [isamchk] key_buffer = 8M sort_buffer_size = 8M [myisamchk] key_buffer = 8M sort_buffer_size = 8M [mysqlhotcopy] interactive-timeout
ãµãŒãããŒãã£ã®MySQLã»ããã¢ãããŠã£ã¶ãŒã
ç¡æã®MySQLãã¥ãŒãã³ã°ãæäŸããæé«ã®ããã©ãŒãã³ã¹ãéæããæéãç¯çŽããmy.cnfãèšå®ãããšãã«çºçããå¯èœæ§ã®ããå°é£ãªç¬éãšãªã¹ã¯ãåé¿ããããã«æé©ãªMySQLãµãŒããŒæ©èœãéžæã§ããPerconaãèŠã€ããŸããã
MySQLãµãŒããŒã®ç£èŠ
MySQLã¯ã䜿çšããæé©ãªå€ã決å®ããã®ã«åœ¹ç«ã€çµ±èšãä¿åããŸãã ããã«ããããã®çµ±èšãèªã¿åã£ãŠç解ãããã圢åŒã§è¡šç€ºããããã«äœ¿çšã§ãã䟿å©ãªãŠãŒãã£ãªãã£ã2ã€ãããŸããtuning-primer.shãšmysqltuner.plã§ãã
ãããã®ã¹ã¯ãªããã䜿çšãããšãMySQLãµãŒããŒãç£èŠãããµãŒããŒã§æ§æããå¿ èŠããããã©ã¡ãŒã¿ãŒã«é¢ãããã³ããæäŸã§ããŸãã
PHPã®æé©åãšãã£ãã·ã¥
PHPã¯ã¡ã¢ãªãããŸãéäžçã«äœ¿çšããªãããããããã®ããã»ã¹ã®ã¡ã¢ãªæ¶è²»ãå¿é ããå¿ èŠã¯ãªããšæããŸããã¢ããªã±ãŒã·ã§ã³ããããå¿ èŠãšããªãå Žåã§ããæé©åãå¿ èŠãªå Žåã§ããã¡ã¢ãªæ¶è²»ã®å€§å¹ ãªåæžã¯ãããŸããã ãããã調æ»ããŠãããWebãµãŒããŒã®ã¡ã¢ãªæ¶è²»ãåæžããPHPæ§æã®èšå®ãããã€ãèŠã€ããŸããã
; Limit the memory to 40M should be fine for barebones Wordpress memory_limit = 48M realpath_cache_ttl=300 realpath_cache_size=1M
代æ¿PHPãã£ãã·ã¥
代æ¿PHPãã£ãã·ã¥ãªã©ã®PHPãã£ãã·ã¥ãã€ã³ã¹ããŒã«ããŸãã PHPãã£ãã·ã¥ã¯ãã³ã³ãã€ã«ãããPHPã¹ã¯ãªããããã³ã³ãã€ã«ããã«åå©çšãããããã«ä¿åãããããè² è·ãçºçããŸããã
# pecl install apc
以äžã¯ç§ã®èšå®ãããphp.iniãã¡ã€ã«ã§ãã
ç§ã®php.ini
[APC] extension=apc.so apc.enabled=1 apc.shm_segments=1 ;32M per WordPress install apc.shm_size=128M ;Relative to the number of cached files (you may need to watch your stats for a day or two to find out a good number) apc.num_files_hint=7000 ;Relative to the size of WordPress apc.user_entries_hint=4096 ;The number of seconds a cache entry is allowed to idle in a slot before APC dumps the cache apc.ttl=7200 apc.user_ttl=7200 apc.gc_ttl=3600 ;Setting this to 0 will give you the best performance, as APC will ;not have to check the IO for changes. However, you must clear ;the APC cache to recompile already cached files. If you are still ;developing, updating your site daily in WP-ADMIN, and running W3TC ;set this to 1 apc.stat=1 ;This MUST be 0, WP can have errors otherwise! apc.include_once_override=0 ;Only set to 1 while debugging apc.enable_cli=0 ;Allow 2 seconds after a file is created before it is cached to prevent users from seeing half-written/weird pages apc.file_update_protection=2 ;Leave at 2M or lower. WordPress does't have any file sizes close to 2M apc.max_file_size=2M ;Ignore files apc.filters = "/var/www/apc.php" apc.cache_by_default=1 apc.use_request_time=1 apc.slam_defense=0 apc.mmap_file_mask=/var/www/temp/apc.XXXXXX apc.stat_ctime=0 apc.canonicalize=1 apc.write_lock=1 apc.report_autofilter=0 apc.rfc1867=0 apc.rfc1867_prefix =upload_ apc.rfc1867_name=APC_UPLOAD_PROGRESS apc.rfc1867_freq=0 apc.rfc1867_ttl=3600 apc.lazy_classes=0 apc.lazy_functions=0
éçãã£ãã·ã¥
å°èŠæš¡ãªãµãŒããŒäžã®ããã°ã«ã¯ãVarnishã®ãããªéçHTTPãã£ãã·ã¥ã®åã«ããã°ã眮ãããšããå§ãããŸãã ããã«ãããã¹ã±ãŒã©ããªãã£ãæ¬åœã«åäžããŸãã ã¯ãã¹ã®æ§æã¯ãå¥ã®ãããã¯ãå¿ èŠãšããå¥ã®å€§ããªèšäºã§ãã
ãããã«
512MB RAMãš1Ghz CPUãåããæãå®äŸ¡ãªVPSã³ã³ããããã§ãé«ãããã©ãŒãã³ã¹ãéæã§ããããšã蚌æããããã«ãWebãµãŒããŒã®æ§æãå ¬éããŸããã Ubuntu 12.04 LTSãLAMPãVarnishãAPC Cacheã䜿çšããŠã1æ¥ããã10kã®ãã©ãã£ãã¯ã§ïŒãã«ããµã€ãã§ã¯ãªãïŒWordpressã§äœæããã3ã€ã®Webãµã€ãããã¹ãããŸãã Blitz.ioã®ãã¹ãçµæãèŠãŠã¿ãŸãããã

ã芧ã®ããã«ãç§ã®Webãµã€ãã®1æ¥ãããã®ãããæ°ïŒWOWïŒã42,735,587ã§ããå Žåã0.23ïŒ ã®ãŠãŒã¶ãŒãæ¥ç¶ã¿ã€ã ã¢ãŠãã«ãªããŸããä»ã®äœããæé©åã§ããŸãããWebãµãŒããŒã®ä»äºã楜ããã§ããŸãã ãã®ããã¥ã¢ã«ã«ããããããŠãããââãæåã§ãããããªãå Žåã¯ãPuPHPetãVagrantãªã©ã®ãµãŒãã¹ã䜿çšã§ããŸãã