天天看点

lnmp

一、获取相关开源程序:

1、安装基础包

sudo -s

lang=c

yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers libevent-devel

2、下载源代码包

wget http://blog.s135.com/soft/linux/nginx_php/nginx/nginx-0.8.34.tar.gz

wget http://blog.s135.com/soft/linux/nginx_php/php/php-5.2.13.tar.gz

wget http://php-fpm.org/downloads/0.6/php-fpm-0.6~5.2.patch

wget http://blog.s135.com/soft/linux/nginx_php/mysql/mysql-5.5.2-m2.tar.gz

wget http://blog.s135.com/soft/linux/nginx_php/libiconv/libiconv-1.13.tar.gz

wget http://blog.s135.com/soft/linux/nginx_php/mcrypt/libmcrypt-2.5.8.tar.gz

wget http://blog.s135.com/soft/linux/nginx_php/mcrypt/mcrypt-2.6.8.tar.gz

wget http://blog.s135.com/soft/linux/nginx_php/memcache/memcache-2.2.5.tgz

wget http://blog.s135.com/soft/linux/nginx_php/mhash/mhash-0.9.9.9.tar.gz

wget http://blog.s135.com/soft/linux/nginx_php/pcre/pcre-8.01.tar.gz

wget http://blog.s135.com/soft/linux/nginx_php/eaccelerator/eaccelerator-0.9.6.tar.bz2

wget http://blog.s135.com/soft/linux/nginx_php/pdo/pdo_mysql-1.0.2.tgz

wget http://blog.s135.com/soft/linux/nginx_php/imagick/imagemagick.tar.gz

wget http://blog.s135.com/soft/linux/nginx_php/imagick/imagick-2.3.0.tgz

二、安装php 5.2.13(fastcgi模式)

1.         编译安装php 5.2.13所需的支持库:

tar zxvf libiconv-1.13.tar.gz

cd libiconv-1.13/

./configure --prefix=/usr/local

make

make install

cd ../

tar zxvf libmcrypt-2.5.8.tar.gz

cd libmcrypt-2.5.8/

./configure

/sbin/ldconfig

cd libltdl/

./configure --enable-ltdl-install

cd ../../

tar zxvf mhash-0.9.9.9.tar.gz

cd mhash-0.9.9.9/

ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la

ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so

ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4

ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8

ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a

ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la

ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so

ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2

ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1

ln -s /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config

tar zxvf mcrypt-2.6.8.tar.gz

cd mcrypt-2.6.8/

2.         编译安装mysql 5.5.2-m2

/usr/sbin/groupadd mysql

/usr/sbin/useradd -g mysql mysql

tar zxvf mysql-5.5.2-m2.tar.gz

cd mysql-5.5.2-m2/

./configure --prefix=/usr/local/mysql --enable-assembler --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile --with-plugins=partition,innobase,myisammrg

make && make install

chown -r mysql:mysql /usr/local/mysql

/usr/local/mysql/bin/mysql_install_db --user=mysql

cp support-files/my-huge.cnf /etc/my.cnf

vi /etc/my.cnf(优化mysql)

/usr/local/mysql/bin/mysqld_safe --user=mysql &

mysqladmin -uroot –p password 'password';

delete from user where password=’’;

cp /usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld

chkconfig --add mysqld

chkconfig --level 2345 mysqld on

3.         编译安装php(fastcgi模式)

tar zxvf php-5.2.13.tar.gz

cd php-5.2.13/

patch -p1 <../php-fpm-0.6~5.2.patch

./buildconf --force

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml  --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --with-fpm --enable-force-cgi-redirect --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-ldap --with-ldap-sasl --with-xmlrpc --enable-zip --enable-soap --enable-ftp --with-libevent=shared

make zend_extra_libs='-liconv'

cp php.ini-dist /usr/local/php/etc/php.ini

4.         编译安装php5扩展模块

tar zxvf memcache-2.2.5.tgz

cd memcache-2.2.5/

/usr/local/php/bin/phpize

./configure --with-php-config=/usr/local/php/bin/php-config

tar jxvf eaccelerator-0.9.6.tar.bz2

cd eaccelerator-0.9.6/

./configure       --enable-eaccelerator=shared --with-php-config=/usr/local/php/bin/php-config

tar zxvf pdo_mysql-1.0.2.tgz

cd pdo_mysql-1.0.2/

./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql

tar zxvf imagemagick.tar.gz

cd imagemagick-6.5.1-2/

tar zxvf imagick-2.3.0.tgz

cd imagick-2.3.0/

5.         修改php.ini文件

       手工修改:查找/usr/local/php/etc/php.ini中的 extension_dir = "./"修改为extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"

  并在此行后增加以下几行,然后保存:

extension = "memcache.so"

extension = "pdo_mysql.so"

extension = "imagick.so"

  再查找 output_buffering = off

  修改为output_buffering = on

配置eaccelerator加速php:

mkdir -p /usr/local/eaccelerator_cache

vi /usr/local/php/etc/php.ini

            按shift+g键跳到配置文件的最末尾,加上以下 配置信息:

[eaccelerator]

zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"

eaccelerator.shm_size="64"

eaccelerator.cache_dir="/usr/local/eaccelerator_cache"

eaccelerator.enable="1"

eaccelerator.optimizer="1"

eaccelerator.check_mtime="1"

eaccelerator.debug="0"

eaccelerator.filter=""

eaccelerator.shm_max="0"

eaccelerator.shm_ttl="3600"

eaccelerator.shm_prune_period="3600"

eaccelerator.shm_only="0"

eaccelerator.compress="1"

eaccelerator.compress_level="9"

6.         创建www用户和组,以及供www.carl.com虚拟主机使用的目录:

/usr/sbin/groupadd www

/usr/sbin/useradd -g www www

mkdir -p /data0/htdocs/blog

chmod +w /data0/htdocs/blog

chown -r www:www /data0/htdocs/blog

7.         创建php-fpm配置文件(php-fpm是为php打的一个fastcgi管理补丁,可以平滑变更php.ini配置而无需重启php- cgi):

       在/usr/local/php/etc/目录中创建php-fpm.conf文件:

rm -f /usr/local/php/etc/php-fpm.conf

vi /usr/local/php/etc/php-fpm.conf

输入以下内容(如果您安装 nginx + php 用于程序调试,请将以下的<value name="display_errors">0</value>改为<value name="display_errors">1</value>,以便显示php错误信息,否则,nginx 会报状态为500的空白错误页):

<?xml version="1.0" ?>

<configuration>

  all relative paths in this config are relative to php's install prefix

  <section name="global_options">

    pid file

    <value name="pid_file">/usr/local/php/logs/php-fpm.pid</value>

    error log file

    <value name="error_log">/usr/local/php/logs/php-fpm.log</value>

    log level

    <value name="log_level">notice</value>

    when this amount of php processes exited with sigsegv or sigbus ...

    <value name="emergency_restart_threshold">10</value>

    ... in a less than this interval of time, a graceful restart will be initiated.

    useful to work around accidental curruptions in accelerator's shared memory.

    <value name="emergency_restart_interval">1m</value>

    time limit on waiting child's reaction on signals from master

    <value name="process_control_timeout">5s</value>

    set to 'no' to debug fpm

    <value name="daemonize">yes</value>

  </section>

  <workers>

    <section name="pool">

      name of pool. used in logs and stats.

      <value name="name">default</value>

      address to accept fastcgi requests on.

      valid syntax is 'ip.ad.re.ss:port' or just 'port' or '/path/to/unix/socket'

      <value name="listen_address">127.0.0.1:9000</value>

      <value name="listen_options">

        set listen(2) backlog

        <value name="backlog">-1</value>

        set permissions for unix socket, if one used.

        in linux read/write permissions must be set in order to allow connections from web server.

        many bsd-derrived systems allow connections regardless of permissions.

        <value name="owner"></value>

        <value name="group"></value>

        <value name="mode">0666</value>

      </value>

      additional php.ini defines, specific to this pool of workers.

      <value name="php_defines">

        <value name="sendmail_path">/usr/sbin/sendmail -t -i</value>

        <value name="display_errors">0</value>

      unix user of processes

      <value name="user">www</value>

      unix group of processes

      <value name="group">www</value>

      process manager settings

      <value name="pm">

        sets style of controling worker process count.

        valid values are 'static' and 'apache-like'

        <value name="style">static</value>

        sets the limit on the number of simultaneous requests that will be served.

        equivalent to apache maxclients directive.

        equivalent to php_fcgi_children environment in original php.fcgi

        used with any pm_style.

        <value name="max_children">128</value>

        settings group for 'apache-like' pm style

        <value name="apache_like">

          sets the number of server processes created on startup.

          used only when 'apache-like' pm_style is selected

          <value name="startservers">20</value>

          sets the desired minimum number of idle server processes.

          <value name="minspareservers">5</value>

          sets the desired maximum number of idle server processes.

          <value name="maxspareservers">35</value>

        </value>

      the timeout (in seconds) for serving a single request after which the worker process will be terminated

      should be used when 'max_execution_time' ini option does not stop script execution for some reason

      '0s' means 'off'

      <value name="request_terminate_timeout">0s</value>

      the timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file

      <value name="request_slowlog_timeout">0s</value>

      the log file for slow requests

      <value name="slowlog">logs/slow.log</value>

      set open file desc rlimit

      <value name="rlimit_files">65535</value>

      set max core size rlimit

      <value name="rlimit_core">0</value>

      chroot to this directory at the start, absolute path

      <value name="chroot"></value>

      chdir to this directory at the start, absolute path

      <value name="chdir"></value>

      redirect workers' stdout and stderr into main error log.

      if not set, they will be redirected to /dev/null, according to fastcgi specs

      <value name="catch_workers_output">yes</value>

      how much requests each process should execute before respawn.

      useful to work around memory leaks in 3rd party libraries.

      for endless request processing please specify 0

      equivalent to php_fcgi_max_requests

      <value name="max_requests">1024</value>

      comma separated list of ipv4 addresses of fastcgi clients that allowed to connect.

      equivalent to fcgi_web_server_addrs environment in original php.fcgi (5.2.2+)

      makes sense only with af_inet listening socket.

      <value name="allowed_clients">127.0.0.1</value>

      pass environment variables like ld_library_path

      all $variables are taken from current environment

      <value name="environment">

        <value name="hostname">$hostname</value>

        <value name="path">/usr/local/bin:/usr/bin:/bin</value>

        <value name="tmp">/tmp</value>

        <value name="tmpdir">/tmp</value>

        <value name="temp">/tmp</value>

        <value name="ostype">$ostype</value>

        <value name="machtype">$machtype</value>

        <value name="malloc_check_">2</value>

    </section>

  </workers>

</configuration>

8.         启动php-cgi进程,监听127.0.0.1的9000端口,进程数为128(如果服务器内存小于3gb,可以只开启64个进程),用户为www:

ulimit -shn 65535

/usr/local/php/sbin/php-fpm start

三、安装nginx 0.8.34

1、  安装nginx所需的pcre库:

tar zxvf pcre-8.01.tar.gz

cd pcre-8.01/

2、  安装nginx

tar zxvf nginx-0.8.34.tar.gz

cd nginx-0.8.34/

./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

3、  创建nginx配置文件

rm -f /usr/local/nginx/conf/nginx.conf

vi /usr/local/nginx/conf/nginx.conf

输入以下内容:

user  www www;

worker_processes 8;

error_log  /usr/local/nginx/logs/error.log  crit;

pid        /usr/local/nginx/logs/nginx.pid;

#specifies the value for maximum file descriptors that can be opened by this process.

worker_rlimit_nofile 65535;

events

{

  use epoll;

  worker_connections 65535;

}

http

  include       mime.types;

  default_type  application/octet-stream;

  #charset  gb2312;

  server_names_hash_bucket_size 128;

  client_header_buffer_size 32k;

  large_client_header_buffers 4 32k;

  client_max_body_size 8m;

  sendfile on;

  tcp_nopush     on;

  keepalive_timeout 60;

  tcp_nodelay on;

  fastcgi_connect_timeout 300;

  fastcgi_send_timeout 300;

  fastcgi_read_timeout 300;

  fastcgi_buffer_size 64k;

  fastcgi_buffers 4 64k;

  fastcgi_busy_buffers_size 128k;

  fastcgi_temp_file_write_size 128k;

  gzip on;

  gzip_min_length  1k;

  gzip_buffers     4 16k;

  gzip_http_version 1.0;

  gzip_comp_level 2;

  gzip_types       text/plain application/x-javascript text/css application/xml;

  gzip_vary on;

  #limit_zone  crawler  $binary_remote_addr  10m;

  server

  {

    listen       80;

    server_name  www.carl.com;

    index index.html index.htm index.php;

    root  /data0/htdocs/blog;

    #limit_conn   crawler  20;    

    location ~ .*\.(php|php5)?$

    {      

      #fastcgi_pass  unix:/tmp/php-cgi.sock;

      fastcgi_pass  127.0.0.1:9000;

      fastcgi_index index.php;

      include fcgi.conf;

    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

    {

      expires      30d;

    location ~ .*\.(js|css)?$

      expires      1h;

    }    

    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '

              '$status $body_bytes_sent "$http_referer" '

              '"$http_user_agent" $http_x_forwarded_for';

    access_log  /usr/local/nginx/logs/carl_access.log  access;

      }

    listen  80;

    server_name  status.blog.s135.com;

    location / {

    stub_status on;

    access_log   off;

  }

              在/usr/local/nginx/conf/目录中创建fcgi.conf文件:

              vi /usr/local/nginx/conf/fcgi.conf

fastcgi_param  gateway_interface  cgi/1.1;

fastcgi_param  server_software    nginx;

fastcgi_param  query_string       $query_string;

fastcgi_param  request_method     $request_method;

fastcgi_param  content_type       $content_type;

fastcgi_param  content_length     $content_length;

fastcgi_param  script_filename    $document_root$fastcgi_script_name;

fastcgi_param  script_name        $fastcgi_script_name;

fastcgi_param  request_uri        $request_uri;

fastcgi_param  document_uri       $document_uri;

fastcgi_param  document_root      $document_root;

fastcgi_param  server_protocol    $server_protocol;

fastcgi_param  remote_addr        $remote_addr;

fastcgi_param  remote_port        $remote_port;

fastcgi_param  server_addr        $server_addr;

fastcgi_param  server_port        $server_port;

fastcgi_param  server_name        $server_name;

# php only, required if php was built with --enable-force-cgi-redirect

fastcgi_param  redirect_status    200;

4、  启动nginx

/usr/local/nginx/sbin/nginx

四、配置开机自动启动nginx + php

              vi /etc/rc.local

五、优化linux内核参数

vi /etc/sysctl.conf

net.ipv4.tcp_max_syn_backlog = 65536

net.core.netdev_max_backlog =  32768

net.core.somaxconn = 32768

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_recycle = 1

#net.ipv4.tcp_tw_len = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_max_orphans = 3276800

#net.ipv4.tcp_fin_timeout = 30

#net.ipv4.tcp_keepalive_time = 120

net.ipv4.ip_local_port_range = 1024  65535

        /sbin/sysctl –p 使新添加的内核参数生效!

六、在不停止nginx服务的情况下平滑变更nginx配置

1、修改/usr/local/nginx/conf/nginx.conf配置文件后,请执行以下命令检查配置文件是否正确:

/usr/local/nginx/sbin/nginx -t

                如果屏幕显示以下两行信息,说明配置文件正确:

  the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

  the configuration file /usr/local/nginx/conf/nginx.conf was tested successfully

  2、平滑重启:

  ①、对于nginx 0.8.x版本,现在平滑重启nginx配置非常简单,执行以下命令即可:

/usr/local/nginx/sbin/nginx -s reload

②、对于nginx 0.8.x之前的版本,平滑重启稍微麻烦一些,按照以下步骤进行即可。输入以下命令查看nginx主进程号:

ps -ef | grep "nginx: master process" | grep -v "grep" | awk -f ' ' '{print $2}'

  屏幕 显示的即为nginx主进程号,例如:

  6302

   这时,执行以下命令即可使修改过的nginx配置文件生效:

kill -hup 6302

  或者无需这么麻烦,找到nginx的pid文件:

kill -hup `cat /usr/local/nginx/nginx.pid`

七、编写每天定时切割nginx日志的脚本

  1、创建脚本/usr/local/nginx/sbin /cut_nginx_log.sh

vi /usr/local/nginx/sbin/cut_nginx_log.sh

                输入 以下内容:

#!/bin/bash

# this script run at 00:00

# the nginx logs path

logs_path="/usr/local/nginx/logs/"

mkdir -p ${logs_path}$(date -d "yesterday" +"%y")/$(date -d "yesterday" +"%m")/

mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%y%m%d").log

kill -usr1 `cat /usr/local/nginx/nginx.pid`

   2、设置crontab,每天凌晨00:00切割nginx访问日志

crontab -e

 输入以下内容:

00 00 * * * /bin/bash  /usr/local/nginx/sbin/cut_nginx_log.sh

继续阅读