简介

LNMP代表的是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构;下面介绍一下Nginx:

Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:新浪网易腾讯、淘宝等;如淘宝发行的(Tengine)功能更强大,可以动态加载模块等

优点

Nginx 可以在大多数类Unix上编译运行,并有 Windows 移植版。 Nginx 的1.4.0稳定版已经于2013年4月24日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。Nginx 是一个很强大的高性能Web和反向代理服务器,在高连接并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型

Nginx作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多

Nginx 安装非常的简单,配置文件非常简洁(还能够支持perl语法)。Nginx支持平滑加载新的配置,还能够在不间断服务的情况下进行软件版本的升级


下面基于给出的拓扑图来介绍如何安装配置LNMP架构

083800187.gif

架构注释:

Nginx服务器负责解析静态文件;php-fpm服务器负面解析php动态页面并使用Xcache缓存;而Mysql服务器只需要跟php-fpm服务器连接即可;这样做的好处是让静态文件与动态文件分开使用不同的服务器来处理,可以提高性能及高并发

软件版本:

系统版本:CentOS 6.4 x86_64

Nginx版本:nginx-1.4.2.tar.gz 点此下载

PHP版本:php-5.4.19.tar.bz2 点此下载

Xcache版本:xcache-3.0.3.tar.bz2 点此下载

Mysql版本:mysql-5.5.33.tar.gz 点此下载

phpMyAdmin版本:phpMyAdmin-4.0.6-all-languages.tar.bz2 点此下载


安装Nginx

1、安装Nginx依赖环境

[root@nginx ~]# yum -y groupinstall "Development tools" "Server Platform Development"
[root@nginx ~]# yum -y install pcre-devel

2、编译安装Nginx

######添加Nginx运行用户
[root@nginx ~]# useradd -r nginx
[root@nginx ~]# tar xf nginx-1.4.2.tar.gz
[root@nginx ~]# cd nginx-1.4.2
######编译安装Nginx
[root@nginx nginx-1.4.2]# ./configure \
>   --prefix=/usr \                      #Nginx安装目录
>   --sbin-path=/usr/sbin/nginx \        #nginx执行程序安装路径
>   --conf-path=/etc/nginx/nginx.conf \  #Nginx主配置文件存放路径
>   --error-log-path=/var/log/nginx/error.log \   #日志文件存放路径
>   --http-log-path=/var/log/nginx/access.log \
>   --pid-path=/var/run/nginx/nginx.pid  \        #PID文件存放路径
>   --lock-path=/var/lock/nginx.lock \            #锁文件存放路径
>   --user=nginx \                                #指定运行Nginx用户
>   --group=nginx \                               #指定运行Nginx组
>   --with-http_ssl_module \                      #开启SSL加密模块
>   --with-http_flv_module \                      #支持flv流媒体模块
>   --with-http_stub_status_module \              #开启状态检测模块
>   --with-http_gzip_static_module \              #开启gzip静态压缩模块
>   --http-client-body-temp-path=/var/tmp/nginx/client/ \ #客户端请求的缓存目录
>   --http-proxy-temp-path=/var/tmp/nginx/proxy/ \        #代理缓存目录
>   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \       #fcgi缓存目录
>   --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \         #uwsgi缓存目录
>   --http-scgi-temp-path=/var/tmp/nginx/scgi \           #scgi缓存目录
>   --with-pcre                                           #启动正则表达式
[root@nginx nginx-1.4.2]# make && make install

3、为Nginx提供Sysv服务脚本并加入到系统服务

#!/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
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
   # make required directories
   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    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

4、将Nginx加入到系统服务并启动

[root@nginx ~]# chmod +x /etc/rc.d/init.d/nginx
[root@nginx ~]# chkconfig --add nginx
[root@nginx ~]# service nginx start
正在启动 nginx:                                           [确定]

5、访问测试Nginx服务

183647462.gif


安装Mysql 编译安装详细介绍

1、安装Mysql依赖环境

[root@mysql ~]# yum -y groupinstall "Server Platform Development" "Development tools"
######安装cmake编译工具
[root@mysql ~]# yum -y cmake

2、创建Mysql用户并编译安装

[root@mysql ~]# useradd -r mysql
[root@mysql ~]# tar xf mysql-5.5.33.tar.gz
[root@mysql ~]# cd mysql-5.5.33
[root@mysql mysql-5.5.33]# cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/mydata/data \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
[root@mysql mysql-5.5.33]# make && make install

3、为Mysql提供主配置文件及Sysv服务脚本并加入到系统服务

[root@mysql mysql-5.5.33]# cp support-files/my-large.cnf /etc/my.cnf
######创建数据存放目录
[root@mysql mysql-5.5.33]# mkdir -p /mydata/data
[root@mysql mysql-5.5.33]# chown -R mysql:mysql /mydata/data
######修改数据存放目录
[root@mysql mysql-5.5.33]# vim /etc/my.cnf
datadir=/mydata/data
[root@mysql mysql-5.5.33]# cd /usr/local/mysql/
[root@mysql mysql]# chown -R root.mysql ./*
######初始化数据库
[root@mysql mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
######为Mysql提供Sysv服务脚本并加入到系统服务
[root@mysql mysql-5.5.33]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@mysql mysql-5.5.33]# chmod +x /etc/rc.d/init.d/mysqld
[root@mysql mysql-5.5.33]# chkconfig --add mysqld
[root@mysql mysql-5.5.33]# chkconfig mysqld on
######修改PATH变量及库文件
[root@mysql ~]# echo '/usr/local/mysql/lib' >> /etc/ld.so.conf
[root@mysql ~]# ldconfig
[root@mysql ~]# ln -s /usr/local/mysql/include /usr/include/mysql
[root@mysql ~]# echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
[root@mysql ~]# . /etc/profile

4、启动Mysqld服务并授权一个用户便于后面做测试

[root@mysql ~]# service mysqld start
Starting MySQL..                                           [  OK  ]
[root@mysql ~]# mysql -e "grant all on *.* to 'root'@'%' identified by 'mypass';"
[root@mysql ~]# mysql -e 'flush privileges;'


安装php 编译安装php详细介绍

1、安装Php依赖环境包

[root@php ~]# yum -y groupinstall "X Software Development"
[root@php ~]# yum -y install libmcrypt-devel libmcrypt mhash mhash-devel mcrypt libevent libevent-devel  gcc gcc-c++ libxml2-devel openssl-devel bzip2-devel libcurl-devel

2、解压并安装php软件包

[root@php ~]# tar xf php-5.4.19.tar.bz2
[root@php ~]# cd php-5.4.19
[root@php php-5.4.19]# ./configure --prefix=/usr/local/php --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-libxml-dir=/usr --enable-xml  --with-mhash --with-mcrypt  --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --with-curl --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd
[root@php php-5.4.19]# make && make install

3、为php提供配置文件并为php-fpm提供Sysv服务脚本然后加入到系统服务

[root@php php-5.4.19]# mkdir /etc/php.d
[root@php php-5.4.19]# cp php.ini-production /etc/php.ini
[root@php php-5.4.19]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
[root@php php-5.4.19]# chmod +x /etc/rc.d/init.d/php-fpm
[root@php php-5.4.19]# chkconfig --add php-fpm
[root@php php-5.4.19]# chkconfig php-fpm on
[root@php php-5.4.19]# cd /usr/local/php/etc/
[root@php etc]# cp php-fpm.conf.default php-fpm.conf
######修改php-fpm配置文件监听地址为主机的IP
[root@php etc]# vim php-fpm.conf
listen = 172.16.14.2:9000

4、安装Xcache

[root@php ~]# tar xf xcache-3.0.3.tar.bz2
[root@php ~]# cd xcache-3.0.3
[root@php xcache-3.0.3]# /usr/local/php/bin/phpize
[root@php xcache-3.0.3]# ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
[root@php xcache-3.0.3]# make && make install
#在安装结束时会提示如下代码:
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
#提供Xcache配置文件到php
[root@php xcache-3.0.3]# cp xcache.ini /etc/php.d/
#在php.ini文件中装载xcache.so模块
[root@php xcache-3.0.3]# vim /etc/php.ini
extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/xcache.so

5、启动php-fpm并查看监听端口

[root@php ~]# service php-fpm start
[root@php ~]# ss -tnal |grep 9000
LISTEN     0      128             172.16.14.2:9000                     *:*


=======================================================================


整合Nginx与php-fpm

1、修改nginx主配置文件

[root@nginx ~]# cd /etc/nginx/
[root@nginx nginx]# vim nginx.conf
#user  nobody;              #运行Nginx用户
worker_processes  2;        #进程数,根据CPU核心来设置
#worder_cpu_affinity  4;    #明确指定使用哪些CPU 如使用1、3核心: 1000 0010
worker_rlimit_nofile    51200;      #设置最大系统连接数
#error_log  logs/error.log;         #定义错误日志文件
#error_log  logs/error.log  notice; #错误日志级别有:(debug|info|notice|warn|rror|crit)
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;     #定义PID文件
events {          #事件模块指令
    use epoll;    #指定事件驱动类型
    worker_connections  1024; #设置每个worker进程所能处理的连接数
}
http {                                      #Http内核模块指令
    include       mime.types;               #加载MIME类型配置文件
    default_type  application/octet-stream; #设置默认的MIME类型
    #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超时时间
    keepalive_timeout  65;
    gzip  on;                #启用gzip压缩
    server {                 #定义虚拟主机
        listen       80;     #定义虚拟主机监听端口
        server_name  localhost; #定义虚拟主机名称
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   /web;    #定义网站目录
            index  index.php index.html index.htm; #定义访问默认主页文件
        }
        location /status {
                stub_status on; #开启Nginx服务状态
                access_log off; #关闭访问日志
        }
        location ~ \.php$ {   #以.php结尾的文件都转到172.16.14.2服务器
            root           /web; #php-fpm服务器上面的网站文件目录
            fastcgi_pass   172.16.14.2:9000; #为php-fpm服务器IP与PORT
            fastcgi_index  index.php;        #指定默认主页文件
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;   #定义返回错误页
        location = /50x.html {
            root   html;
        }
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
    # HTTPS server    #下面是定义Https服务器
    #
    #server {
    #    listen       443;
    #    server_name  localhost;
    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
    #    ssl_session_timeout  5m;
    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers   on;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


2、修改nginx的fastcgi文件

[root@nginx nginx]# vim fastcgi_params
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;

3、创建网站存放目录并提供一个测试页面文件如:

[root@nginx ~]# mkdir /web
[root@nginx ~]# echo 'nginx.allen.com' > /web/index.html
[root@nginx ~]# service nginx restart #这里修改过端口所以需要重新启动

4、测试访问新建的静态测试文件

231843816.gif

5、访问"status"状态页面

003722898.gif

6、为php-fpm提供一个"phpinfo"页面来访问测试如下:

[root@php ~]# echo '<?php phpinfo();' > /web/test.php

001903554.gif

7、在php-fpm服务器上面创建网站存放目录并解压phpMyAdmin然后复制到网站存放目录

[root@php ~]# tar xf phpMyAdmin-4.0.6-all-languages.tar.bz2
[root@php ~]# mkdir /web
[root@php ~]# cp -rf phpMyAdmin-4.0.6-all-languages/* /web/

8、修改phpMyAdmin配置文件,连接到Mysql数据库

[root@php ~]# cd /web
[root@php web]# cp config.sample.inc.php config.inc.php
######修改或添加如下行
[root@php web]# vim config.inc.php
$cfg['Servers'][$i]['host'] = '172.16.14.3';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = 'mypass';

9、在Mysql服务器上导入phpMyAdmin数据库文件

[root@mysql ~]# scp root@172.16.14.2:/web/examples/create_tables.sql ./
root@172.16.14.2's password:
create_tables.sql                                                 100% 7688     7.5KB/s   00:00
[root@mysql ~]# mysql < create_tables.sql

10、测试在客户端访问"172.16.14.1/index.php"

002739340.gif

002742137.gif

到此LNMP平台已经成功搭建完成,后续将会介绍Nginx的更多其他功能,比如:反向代理、缓存等,如有时间会介绍一下(Tengine)安装及配置...