====== Build and config php,apache,nginx ====== ===== Install compiler ===== yum install gcc yum install gcc-c++ yum install automake yum install make ===== Build and config PHP and Nginx ===== {{:php:architecture.png|}} {{:php:fastcgi.jpg|}} ==== Build Nginx ==== * step1: Install missing library for building source yum install -y pcre-devel.x86_64 yum install gd-devel -y yum install libxslt-devel yum install openssl-devel * step2: Build nginx tar zxvf nginx-1.8.0.tar.gz cd nginx-1.8.0 ./configure --prefix=/usr/local/nginx --with-http_gzip_static_module --with-http_ssl_module --with-http_stub_status_module make && make install * step3: Check module which built with nginx /usr/local/nginx/sbin/nginx -V output: nginx version: nginx/1.8.0 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) built with OpenSSL 1.0.1e-fips 11 Feb 2013 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx --with-http_gzip_static_module --with-http_ssl_module --with-http_stub_status_module ==== Script start nginx ==== #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 prefix="/usr/local/nginx" nginx="$prefix/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="$prefix/conf/nginx.conf" #[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { configtest || return $? stop sleep 1 start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac exit $RETVAL ==== Build PHP with php-cgi and start ==== === Build PHP with php-cgi === * step1: Install missing library for building source php yum install -y freetype-devel freetype yum install -y mysql-devel yum install mysql-devel yum install pcre-devel yum install gd-devel yum install libcurl-devel yum install openssl-devel yum install libxml2-devel yum install libxslt-devel * step2: Build libmcrypt: libmcrypt-2.5.8.tar.gz * step3: add below line into Config file **[/etc/ld.so.conf]** /usr/local/lib and active ld changes ldconfig * step4: Build PHP with --enable-fastcgi tar zxvf php-5.2.14.tar.gz cd php-5.2.14 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-libdir=lib64 --enable-fastcgi --disable-rpath --disable-ipv6 --disable-safe-mode --enable-opcache --enable-calendar --enable-bcmath --enable-ftp --enable-soap --enable-shared --enable-mbstring --enable-magic-quotes --enable-sockets --with-openssl --with-zlib --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-freetype-dir=/usr --with-zlib-dir=/usr --with-mysql --with-mysqli --with-pdo-mysql --with-pear --with-curl --with-curlwrappers --with-mcrypt=/usr/local ldd php-5.2.14/sapi/cli/php | grep mcrypt make && make install === Build spawn-fcgi === tar zxvf spawn-fcgi-1.6.3.tar.gz cd spawn-fcgi-1.6.3 ./configure --prefix=/usr/local/php make && make install === Script start php-cgi === #!/bin/sh # # php-cgi - php-fastcgi swaping via spawn-fcgi # # chkconfig: - 85 15 # description: Run php-cgi as app server # processname: php-cgi # config: /etc/sysconfig/phpfastcgi (defaults RH style) # pidfile: /var/run/php_cgi.pid # Note: See how to use this script : # http://www.cyberciti.biz/faq/rhel-fedora-install-configure-nginx-php5/ # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 spawnfcgi="/usr/local/php/bin/spawn-fcgi" php_cgi="/usr/local/php/bin/php-cgi" prog=$(basename $php_cgi) server_ip=0.0.0.0 server_port=9000 server_user=nobody server_group=nobody server_childs=1 pidfile="/var/run/php_cgi.pid" PHP_FCGI_CHILDREN=15 PHP_FCGI_MAX_REQUESTS=30 # do not edit, put changes in /etc/sysconfig/phpfastcgi [ -f /etc/sysconfig/phpfastcgi ] && . /etc/sysconfig/phpfastcgi start() { [ -x $php_cgi ] || exit 1 [ -x $spawnfcgi ] || exit 2 echo -n $"Starting $prog: " export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS daemon $spawnfcgi -F 1 -a ${server_ip} -p ${server_port} -u ${server_user} -g ${server_group} -P ${pidfile} -f ${php_cgi} retval=$? echo return $retval } stop() { echo -n $"Stopping $prog: " killproc -p ${pidfile} $prog -QUIT retval=$? echo [ -f ${pidfile} ] && /bin/rm -f ${pidfile} return $retval } restart(){ stop sleep 2 start } rh_status(){ status -p ${pidfile} $prog } case "$1" in start) start;; stop) stop;; restart) restart;; status) rh_status;; *) echo $"Usage: $0 {start|stop|restart|status}" exit 3 esac ==== Build PHP with php-fpm and start ==== === Build PHP with php-fpm === * step1: Install missing library for building source php yum install -y freetype-devel freetype yum install -y mysql-devel yum install mysql-devel yum install pcre-devel yum install gd-devel yum install libcurl-devel yum install openssl-devel yum install libxml2-devel yum install libxslt-devel yum install bison bison-devel * step2: Build libmcrypt: libmcrypt-2.5.8.tar.gz * step3: add below line into Config file **[/etc/ld.so.conf]** /usr/local/lib and active ld changes ldconfig * Step4:If you don't find file configure, run script below ./buildconf --force * step5: Build php-fpm (add option **--enable-fpm**) tar zxvf php-5.3.28.tar.gz cd php-5.3.28 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-libdir=lib64 --enable-fpm --disable-rpath --disable-ipv6 --disable-safe-mode --enable-opcache --enable-calendar --enable-bcmath --enable-ftp --enable-soap --enable-shared --enable-mbstring --enable-magic-quotes --enable-sockets --with-openssl --with-zlib --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-freetype-dir=/usr --with-zlib-dir=/usr --with-mysql --with-mysqli --with-pdo-mysql --with-pear --with-curl --with-curlwrappers --with-mcrypt=/usr/local make & make install cp php.ini-production /usr/local/php/etc/php.ini === Build PHP7.4 with php-fpm === ./configure --prefix=/onec/php7 --with-config-file-path=/onec/php7/etc --with-libdir=lib64 --enable-fpm --disable-rpath --disable-ipv6 --disable-safe-mode --enable-opcache --enable-calendar --enable-bcmath --enable-ftp --enable-soap --enable-shared --enable-mbstring --disable-mbregex --enable-magic-quotes --enable-sockets --with-openssl --with-zlib --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-freetype-dir=/usr --with-zlib-dir=/usr --with-mysql --with-mysqli --without-sqlite3 --without-pdo-sqlite --with-pdo-mysql --with-pear --with-curl --with-curlwrappers --with-mcrypt=/usr/local option **--disable-mbregex** fix error: configure: error: Package requirements (oniguruma) were not met === Script start php-fpm === php-fpm will be installed on /usr/local/php/sbin/php-fpm - Step1: Edit php-fpm.conf: pid = /var/run/php-fpm.pid => script will base on this pid to stop,start the process - Step2: create script /etc/init.d/php-fpm: #! /bin/sh # # chkconfig: - 84 16 # description: PHP FastCGI Process Manager # processname: php-fpm # config: /etc/php-fpm.conf # config: /etc/sysconfig/php-fpm # pidfile: /var/run/php-fpm/php-fpm.pid # ### BEGIN INIT INFO # Provides: php-fpm # Required-Start: $local_fs $remote_fs $network $named # Required-Stop: $local_fs $remote_fs $network # Short-Description: start and stop PHP FPM # Description: PHP FastCGI Process Manager ### END INIT INFO # Standard LSB functions #. /lib/lsb/init-functions # Source function library. . /etc/init.d/functions # Check that networking is up. . /etc/sysconfig/network # Additional environment file if [ -f /etc/sysconfig/php-fpm ]; then . /etc/sysconfig/php-fpm fi if [ "$NETWORKING" = "no" ] then exit 0 fi RETVAL=0 prog="php-fpm" pidfile="/var/run/php-fpm/php-fpm.pid" lockfile="/var/lock/subsys/php-fpm" start () { echo -n $"Starting $prog: " dir=$(dirname ${pidfile}) [ -d $dir ] || mkdir $dir daemon --pidfile ${pidfile} /usr/local/php/sbin/php-fpm --daemonize RETVAL=$? echo [ $RETVAL -eq 0 ] && touch ${lockfile} } stop () { echo -n $"Stopping $prog: " killproc php-fpm RETVAL=$? echo if [ $RETVAL -eq 0 ] ; then rm -f ${lockfile} ${pidfile} fi } restart () { stop sleep 2 start } reload () { echo -n $"Reloading $prog: " if ! /usr/local/php/sbin/php-fpm --test ; then RETVAL=6 echo $"not reloading due to configuration syntax error" failure $"not reloading $prog due to configuration syntax error" else killproc -p ${pidfile} php-fpm -USR2 RETVAL=$? fi echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status php-fpm RETVAL=$? ;; restart) restart ;; reload|force-reload) reload ;; configtest) /usr/local/php/sbin/php-fpm --test RETVAL=$? ;; condrestart|try-restart) [ -f ${lockfile} ] && restart || : ;; *) echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart|configtest}" RETVAL=2 ;; esac exit $RETVAL ==== Config nginx with php-cgi or php-fpm(fastcgi) ==== === update conf/nginx.conf === #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 20; #gzip on; server { listen 128.199.236.122:80; server_name localhost 123.30.173.67; root /data/www/default; index index.html index.htm index.php fastcgi_index index.php; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ .*\.(php|php5)?$ { include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/www/default$fastcgi_script_name; } } include /usr/local/nginx/conf.d/*.conf; } => default user which run nginx is **nobody** === add config redirect === config redirect babies.vn, www.babies.vn to shop.babies.vn server { server_name babies.vn www.babies.vn; return 301 $scheme://shop.babies.vn$request_uri; } === add config nginx for dokuwiki === chown for web: chown -R nobody.nobody /data/www add config for mynotes.babies.vn ###mynotes.babies.vn server { listen 80; server_name mynotes.babies.vn; root /data/www/mynotes; index index.html index.htm index.php; fastcgi_index index.php; access_log /usr/local/nginx/logs/mynotes.babies.vn.access_log; error_log /usr/local/nginx/logs/mynotes.babies.vn.error_log; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location ~* "^.+\.(js|ico|gif|jpg|png|css|swf|htc|xml|bmp)$" { access_log off; expires 7d; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } === add config nginx for magento === config magento for shop.babies.vn ###shop.babies.vn ###shop.babies.vn server { listen 80; server_name shop.babies.vn; root /data/www/babyshopvn; index index.html index.htm index.php; fastcgi_index index.php; access_log /usr/local/nginx/logs/shop.babies.vn.access_log; error_log /usr/local/nginx/logs/shop.babies.vn.error_log; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location ~* "^.+\.(js|ico|gif|jpg|png|css|swf|htc|xml|bmp)$" { access_log off; expires 7d; } location / { index index.html index.php; ## Allow a static html file to be shown first try_files $uri $uri/ @handler; ## If missing pass the URI to Magento's front handler expires 30d; ## Assume all files are cachable } location @handler { ## Magento uses a common front handler rewrite / /index.php; } location ~ \.php$ { if (!-e $request_filename) { rewrite / /index.php last; } fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } ===== Opcache ===== Enable PHP's opcache(Only support for **PHP version 5.6 above**): The entire purpose of the opcache is to **use memory to save CPU and speed up your apps:OPcache** improves PHP performance by **storing precompiled script bytecode in shared memory**, thereby removing the need for PHP to load and parse scripts on each request. - Step1: Build PHP with option **--enable-opcache** - Step2: Config load module opcache in **php.ini**: zend_extension=opcache.so updates in PHP 5.6: * will remove MySQL -> So you must convert from MySQL to MySQLi functions for using it * Update php.ini always_populate_raw_post_data = -1 ===== Memcache ===== ==== Build and Install Memcache server ==== - step1: Install missing package yum install libevent-devel - step2: Download memcache wget http://memcached.org/files/memcached-1.4.22.tar.gz - step3: Build and install tar xvf memcached-1.4.22.tar.gz cd memcached-1.4.22 ./configure --prefix=/usr/local/memcache make && make install ==== Build and Install PHP Memcache ==== - step1: Build and Install PHP Memcache wget http://pecl.php.net/get/memcache-2.2.7.tgz tar xf memcache-2.2.7.tgz cd memcache-2.2.7 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make & make install - step2: Check where the extension memcache was installed /usr/local/php/bin/php-config | grep extension output: --extension-dir [/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525] - step3: Check the configuration file php.ini which php auto load: /usr/local/php/bin/php -i | grep php.ini output: Configuration File (php.ini) Path => /usr/local/php/etc Loaded Configuration File => /usr/local/php/etc/php.ini - step4: Edit configuration file php.ini to load memcache.so(search **extension=**) extension=memcache.so ==== script stop, start memcache ==== - step1: create some directory for running memcache mkdir -p /var/run/memcached/ mkdir -p /var/lock/subsys/ chown -R nobody.root /var/run/memcached/ chown -R nobody.root /var/lock/subsys/ - step2: create script stop, start memcache #! /bin/sh # # chkconfig: - 55 45 # description: The memcached daemon is a network memory cache service. # processname: memcached # config: /etc/sysconfig/memcached # pidfile: /var/run/memcached/memcached.pid # Standard LSB functions #. /lib/lsb/init-functions # Source function library. . /etc/init.d/functions PORT=11211 USER=nobody MAXCONN=1024 CACHESIZE=64 OPTIONS="" if [ -f /etc/sysconfig/memcached ];then . /etc/sysconfig/memcached fi # Check that networking is up. . /etc/sysconfig/network if [ "$NETWORKING" = "no" ] then exit 0 fi RETVAL=0 prog="memcached" pidfile=${PIDFILE-/var/run/memcached/memcached.pid} lockfile=${LOCKFILE-/var/lock/subsys/memcached} start () { echo -n $"Starting $prog: " # Ensure that /var/run/memcached has proper permissions if [ "`stat -c %U /var/run/memcached`" != "$USER" ]; then chown $USER /var/run/memcached fi daemon --pidfile ${pidfile} /usr/local/memcache/bin/memcached -d -p $PORT -u $USER -m $CACHESIZE -c $MAXCONN -P ${pidfile} $OPTIONS RETVAL=$? echo [ $RETVAL -eq 0 ] && touch ${lockfile} } stop () { echo -n $"Stopping $prog: " killproc -p ${pidfile} /usr/local/memcache/bin/memcached RETVAL=$? echo if [ $RETVAL -eq 0 ] ; then rm -f ${lockfile} ${pidfile} fi } restart () { stop start } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} memcached RETVAL=$? ;; restart|reload|force-reload) restart ;; condrestart|try-restart) [ -f ${lockfile} ] && restart || : ;; *) echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart}" RETVAL=2 ;; esac exit $RETVAL ==== Memcache Admin ==== PHP memcache admin: https://github.com/clickalicious/phpmemadmin Below are steps to install and configure Memcache Admin: - Step1: download Memcache Admin source to **/onec/www/monitor/**: git clone https://github.com/clickalicious/phpmemadmin.git => source will be downloaded to /onec/www/monitor/phpmemadmin - Step2: Install composer in source directory: cd /onec/www/monitor/phpmemadmin curl -sS https://getcomposer.org/installer | /onec/php/bin/php - Step3: download and install depedency packages /onec/php/bin/php composer.phar install - Step4: Go to directory app and copy .config.dist to .config: cd app cp .config.dist .config - Step5: Change admin password in .config { "username": "admin", "password": "pass", "timeout": -1, "cluster": { "name": "Cluster", "thresholds": { "notice": 50, "warning": 75, "error": 95 }, "hosts": [ { "host": "127.0.0.1", "port": 11211 } ] }, "render": { "auto": true }, "format": { "date": "Y-m-dTH:i:s" }, "updatecheck": false } - Step6: config nginx with php-fpm for run this website: server { listen 80; server_name memcache.zplay.com; root /onec/www/monitor/phpmemadmin/web; index index.html index.htm index.php; fastcgi_index index.php; access_log /onec/nginx/logs/memcache.access_log; error_log /onec/nginx/logs/memcache.error_log; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location ~* "^.+\.(js|ico|gif|jpg|png|css|swf|htc|xml|bmp)$" { access_log off; expires 7d; } location / { index index.html index.php; ## Allow a static html file to be shown first try_files $uri $uri/ @handler; ## If missing pass the URI to zend framework's front handler expires 30d; ## Assume all files are cachable } location @handler { ## zend framework uses a common front handler rewrite / /index.php; } location ~ .php/ { ## Forward paths like /js/index.php/x.js to relevant handler rewrite ^(.*.php)/ $1 last; } location ~ \.php$ { if (!-e $request_filename) { rewrite / /index.php last; } fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } ===== Varnish Cache ===== ==== Build and Install varnish cache server ==== Build and Install varnish cache 3.0.7 yum install python-docutils yum install libedit-devel wget https://repo.varnish-cache.org/source/varnish-3.0.7.tar.gz tar xf varnish-3.0.7.tar.gz cd varnish-3.0.7 ./configure make make install ===== PHP and apache ===== refer: http://dan.drydog.com/apache2php.html ==== Build PHP and Apache ==== === Step1: Apache build from source(--enable-so for load php as module) === Build missing devel: yum install apr-devel yum install apr-util-devel yum install zlib-devel yum install openssl-devel refer: http://tldp.org/HOWTO/Apache-Compile-HOWTO/apache.html ./configure --prefix=/usr/local/http/ --enable-so --enable-cgi --enable-info --enable-rewrite --enable-speling --enable-usertrack --enable-deflate --enable-ssl --enable-mime-magic --enable-expires --enable-headers === Step2: Build PHP as PHP modules of apache(add option --with-apxs2=/usr/local/apache/bin/apxs) === ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-apxs2=/usr/local/http/bin/apxs --with-libdir=lib64 --disable-rpath --disable-ipv6 --enable-opcache --enable-calendar --enable-bcmath --enable-ftp --enable-soap --enable-shared --enable-mbstring --enable-sockets --with-openssl --with-zlib --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-freetype-dir=/usr --with-zlib-dir=/usr --with-mysql --with-mysqli --with-pdo-mysql --with-pear --with-curl --with-mcrypt=/usr/local Or optimize build(remove --with-mysql --with-mysqli --with-pear) ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-apxs2=/usr/local/http/bin/apxs --with-libdir=lib64 --disable-rpath --disable-ipv6 --enable-calendar --enable-bcmath --enable-soap --enable-shared --enable-mbstring --enable-sockets --with-zlib --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-freetype-dir=/usr --with-zlib-dir=/usr --with-pdo-mysql --with-curl === Step3: Check modules compiled witch apache === /usr/local/apache/bin/httpd -V /usr/local/apache/bin/httpd -l /usr/local/apache/bin/httpd -M === Fix error build httpd: APR version 1.4.0 or later is required, found 1.3.9 === Below are error detail checking for APR... configure: WARNING: APR version 1.4.0 or later is required, found 1.3.9 And steps below help you fix it: - Step1: download apr-1.4.8.tar.gz and apr-util-1.5.2.tar.gz from https://archive.apache.org/dist/apr/ - Step2: Extract source ap-1.4.8.tar.gz and apr-util-1.5.2.tar.gz to httpd-2.4.18/srclib httpd-2.4.18/srclib/apr httpd-2.4.18/srclib/apr-util - Step3: Rebuild the http: ./configure --prefix=/onec/http/ --enable-so --enable-cgi --enable-info --enable-rewrite --enable-speling --enable-usertrack --enable-deflate --enable-ssl --enable-mime-magic --enable-expires --enable-headers make make install ==== script stop,start apache(/etc/init.d/httpd ==== Edit the script stop, start apache #!/bin/bash # #Startup script for the Apache Web Server # # chkconfig: - 85 15 # description: Apache is a World Wide Web server. It is used to serve \ # HTML files and CGI. # processname: httpd # pidfile: /usr/local/http/logs/httpd.pid # config: /usr/local/http/conf/httpd.conf # Source function library. . /etc/rc.d/init.d/functions if [ -f /etc/sysconfig/httpd ]; then . /etc/sysconfig/httpd fi # This will prevent initlog from swallowing up a pass-phrase prompt if # mod_ssl needs a pass-phrase from the user. INITLOG_ARGS="" # Path to the apachectl script, server binary, and short-form for messages. apachectl=/usr/local/http/bin/apachectl httpd=/usr/local/http/bin/httpd pid=/usr/local/http/logs/httpd.pid prog=httpd RETVAL=0 # The semantics of these two functions differ from the way apachectl does # things -- attempting to start while running is a failure, and shutdown # when not running is also a failure. So we just do it the way init scripts # are expected to behave here. start() { echo -n $"Starting $prog: " daemon $httpd $OPTIONS RETVAL=$? echo [ $RETVAL = 0 ] && touch /var/lock/subsys/httpd return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc $httpd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f /var/lock/subsys/httpd $pid } reload() { echo -n $"Reloading $prog: " killproc $httpd -HUP RETVAL=$? echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status $httpd RETVAL=$? ;; restart) stop start ;; condrestart) if [ -f $pid ] ; then stop start fi ;; reload) reload ;; graceful|help|configtest|fullstatus) $apachectl $@ RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|reload|status" echo $"|fullstatus|graceful|help|configtest}" exit 1 esac exit $RETVAL ==== Config apache ==== === default config === ServerRoot "/usr/local/apache/" Listen 80 LoadModule php5_module modules/libphp5.so User apache Group apache ServerAdmin you@example.com DocumentRoot "/usr/local/apache//htdocs" Options FollowSymLinks AllowOverride None Order deny,allow Deny from all Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all DirectoryIndex index.html Order allow,deny Deny from all Satisfy All ErrorLog "logs/error_log" LogLevel warn LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio CustomLog "logs/access_log" common ScriptAlias /cgi-bin/ "/usr/local/apache//cgi-bin/" AllowOverride None Options None Order allow,deny Allow from all DefaultType text/plain TypesConfig conf/mime.types AddType application/x-compress .Z AddType application/x-gzip .gz .tgz SSLRandomSeed startup builtin SSLRandomSeed connect builtin AddType application/x-httpd-php .php DirectoryIndex index.php index.htm index.html === change config httpd.conf === * add config AddType application/x-httpd-php .php DirectoryIndex index.php index.htm index.html Include conf.d/*.conf * change user and group User nobody Group nobody * add config for shop.babies.vn and mynotes.babies.vn: add conf.d/babies.vn.conf NameVirtualHost *:80 ServerName shop.babies.vn DocumentRoot "/data/www/babyshopvn" SetEnv MAGE_IS_DEVELOPER_MODE "false" Options Indexes FollowSymLinks MultiViews AllowOverride all Order Deny,Allow Allow from all ErrorLog logs/shop.babies.vn-error_log CustomLog logs/shop.babies.vn-access_log common ServerName mynotes.babies.vn DocumentRoot "/data/www/mynotes" Options Indexes FollowSymLinks MultiViews AllowOverride all Order Deny,Allow Allow from all ErrorLog logs/mynotes.babies.vn-error_log CustomLog logs/mynotes.babies.vn-access_log common Notice: * If you use VirtualHost *:80 => all virtuals host must be VirtualHost *:80, **not IP:80** * If you use **Options Indexes FollowSymLinks MultiViews**, all other vitual hosts must be this option === change config mpm === Edit httpd.conf: Include conf/extra/httpd-mpm.conf == default config == StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0 == change config for digitalocean == StartServers 2 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0 ==== check php information which was built in apache ==== First we create the phpinfo.php with content below: Second we run the the phpinfo.php from browser to check PHP information Configure Command './configure' '--prefix=/usr/local/php' '--with-config-file-path=/usr/local/php/etc' '--with-apxs2=/usr/local/http/bin/apxs' '--with-libdir=lib64' '--disable-rpath' '--disable-ipv6' '--enable-calendar' '--enable-bcmath' '--enable-ftp' '--enable-soap' '--enable-fpm' '--enable-shared' '--enable-mbstring' '--enable-sockets' '--with-openssl' '--with-zlib' '--with-gd' '--with-jpeg-dir=/usr' '--with-png-dir=/usr' '--with-freetype-dir=/usr' '--with-zlib-dir=/usr' '--with-mysql' '--with-mysqli' '--with-pdo-mysql' '--with-pear' '--with-curl' '--with-mcrypt=/usr/local' Configuration File (php.ini) Path /usr/local/php/etc Loaded Configuration File /usr/local/php/etc/php.ini ===== PHP config and modules check ===== ==== Basic config ==== - Step1: Create first php.ini: cp php.ini-production /usr/local/php/etc/php.ini - Step2: Change some basic parameters: date.timezone = Asia/Saigon session.name = PHPSESSID session.save_path = "/tmp" upload_max_filesize = 20M post_max_size = 8M ==== PHP check ==== - Module check: php -m - Check configuration load: /usr/local/php/sbin/php-fpm -i | grep php.ini output: Configuration File (php.ini) Path => /usr/local/php/etc Loaded Configuration File => /usr/local/php/etc/php.ini - Check option which is used to build the php /usr/local/php/sbin/php-fpm -i | grep configure output: Configure Command => './configure' '--prefix=/usr/local/php' '--with-config-file-path=/usr/local/php/etc' '--with-libdir=lib64' '--enable-fpm' '--disable-debug' '--disable-rpath' '--disable-ipv6' '--disable-safe-mode' '--enable-calendar' '--enable-bcmath' '--enable-ftp' '--enable-soap' '--enable-shared' '--enable-mbstring' '--enable-magic-quotes' '--enable-sockets' '--with-openssl' '--with-zlib' '--with-gd' '--with-jpeg-dir=/usr' '--with-png-dir=/usr' '--with-freetype-dir=/usr' '--with-zlib-dir=/usr' '--with-mysql' '--with-mysqli' '--with-pdo-mysql' '--with-pear' '--with-curl' '--with-curlwrappers' '--with-mcrypt=/usr/local' ==== check PHP config which web server using ==== - Step1: Create the phpinfo.php - Step2: Run the phpinfo.php from web server to see the path of php.ini which web server was using, for example: Configuration File (php.ini) Path /usr/local/php/etc Loaded Configuration File /usr/local/php/etc/php.ini ==== Check image, font support ==== /gb/php/bin/php -r 'print_r(gd_info());' => output Array ( [GD Version] => bundled (2.1.0 compatible) [FreeType Support] => [T1Lib Support] => [GIF Read Support] => 1 [GIF Create Support] => 1 [JPEG Support] => 1 [PNG Support] => 1 [WBMP Support] => 1 [XPM Support] => [XBM Support] => 1 [JIS-mapped Japanese Font Support] => ) ==== check config to display error log ==== - Step1: Create the test.php file which wrong syntax - Step2: Run the test.php from command line to see the error log /usr/local/php/bin/php test.php => If we see the error log in error_log file(path of error_log file in configuration file /usr/local/php/etc/php.ini) [31-Mar-2015 06:43:53 UTC] PHP Fatal error: Call to undefined function hello() in ......./test.php on line 1 - Step3: Run the test.php from the browser to see error log the same the error log above. If we don't see the error log, we need to review the php config in phpinfo.php and chown for the webserver can update the **error_log** file ==== Config connet PHP to MySQL ==== - Method1 **Change /etc/my.cnf**: default PHP will use /tmp/mysql.sock for connecting to MySQL, So we will configure the sock in /etc/my.cnf follow below config: socket = /tmp/mysql.sock - Method2 **Change php.ini**: change base on config socket path in /etc/my.cnf [Pdo_mysql] .......... pdo_mysql.default_socket= /gb/mysql/tmp/mysql.sock ==== Config to run the web from home directory ==== Default the web server will be run with user nobody or www. To run the web from home which owned by another user, for example: drwx------. 4 quangftp quangftp 4096 Jun 26 14:02 quangftp we need to run the chmod command to allow user www(other user) to allow read and excute the file and directory of quangftp: chmod -R 755 /home/quangftp ==== Config to run PHP code with tag ==== Edit php.ini: short_open_tag = On ===== PHP Security ===== refer: * http://www.madirish.net/199 * http://www.cyberciti.biz/tips/php-security-best-practices-tutorial.html ==== Security Hardening Config ==== ==== Security Scripts Check php.ini ==== ==== Security Scripts Check PHP Project ==== refer: * https://github.com/FriendsOfPHP/security-advisories * https://github.com/sensiolabs/security-checker