阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

高性能Web服务之LNMP架构应用

160次阅读
没有评论

共计 26199 个字符,预计需要花费 66 分钟才能阅读完成。

传统上基于进程或线程模型架构的 web 服务通过每进程或每线程处理并发连接请求,这势必会在网络和 I / O 操作时产生阻塞,其另一个必然结果则是对内存或 CPU 的利用率低下。生成一个新的进程 / 线程需要事先备好其运行时环境,这包括为其分配堆内存和栈内存,以及为其创建新的执行上下文等。这些操作都需要占用 CPU,而且过多的进程 / 线程还会带来线程抖动或频繁的上下文切换,系统性能也会由此进一步下降。

在设计的最初阶段,nginx 的主要着眼点就是其高性能以及对物理计算资源的高密度利用,因此其采用了不同的架构模型。受启发于多种操作系统设计中基于“事件”的高级处理机制,nginx 采用了模块化、事件驱动、异步、单线程及非阻塞的架构,并大量采用了多路复用及事件通知机制。在 nginx 中,连接请求由为数不多的几个仅包含一个线程的进程 worker 以高效的回环 (run-loop) 机制进行处理,而每个 worker 可以并行处理数千个的并发连接及请求。

如果负载以 CPU 密集型应用为主,如 SSL 或压缩应用,则 worker 数应与 CPU 数相同;如果负载以 IO 密集型为主,如响应大量内容给客户端,则 worker 数应该为 CPU 个数的 1.5 或 2 倍。

Nginx 会按需同时运行多个进程:一个主进程 (master) 和几个工作进程 (worker),配置了缓存时还会有缓存加载器进程(cache loader) 和缓存管理器进程 (cache manager) 等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以 root 用户身份运行,而 worker、cache loader 和 cache manager 均应以非特权用户身份运行。

主进程主要完成如下工作:
1. 读取并验正配置信息;
2. 创建、绑定及关闭套接字;
3. 启动、终止及维护 worker 进程的个数;
4. 无须中止服务而重新配置工作特性;
5. 控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;
6. 重新打开日志文件,实现日志滚动;
7. 编译嵌入式 perl 脚本;

worker 进程主要完成的任务包括:
1. 接收、传入并处理来自客户端的连接;
2. 提供反向代理及过滤功能;
3. nginx 任何能完成的其它任务;

cache loader 进程主要完成的任务包括:
1. 检查缓存存储中的缓存对象;
2. 使用缓存元数据建立内存数据库;

cache manager 进程的主要任务:
1. 缓存的失效及过期检验;

Nginx 的配置有着几个不同的上下文:main、http、server、upstream 和 location(还有实现邮件服务反向代理的 mail)。配置语法的格式和定义方式遵循所谓的 C 风格,因此支持嵌套,还有着逻辑清晰并易于创建、阅读和维护等优势。

Nginx 的代码是由一个核心和一系列的模块组成, 核心主要用于提供 Web Server 的基本功能,以及 Web 和 Mail 反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由 nginx 的模块实现的。这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协议、upstream 和负载均衡几个类别,这些共同组成了 nginx 的 http 功能。事件模块主要用于提供 OS 独立的 (不同操作系统的事件机制有所不同) 事件通知机制如 kqueue 或 epoll 等。协议模块则负责实现 nginx 通过 http、tls/ssl、smtp、pop3 以及 imap 与对应的客户端建立会话。

在 nginx 内部,进程间的通信是通过模块的 pipeline 或 chain 实现的;换句话说,每一个功能或操作都由一个模块来实现。例如,压缩、通过 FastCGI 或 uwsgi 协议与 upstream 服务器通信,以及与 memcached 建立会话等。

一、安装 Nginx:

1、解决依赖关系

编译安装 nginx 需要事先需要安装开发包组 ”Development Tools” 和 “Server Platform Libraries”。同时,还需要专门安装 pcre-devel 包:
# yum -y groupinstall “Development Tools” “Server Platform Libraries”
# yum -y install pcre-devel openssl-devel

2、安装

首先添加用户 nginx,实现以之运行 nginx 服务进程:

# groupadd -r nginx
# useradd -r -g nginx nginx

接着开始编译和安装 nginx:
# tar xf nginx-1.11.3.tar.gz
# cd nginx-1.11.3
# ./configure –prefix=/usr/local/nginx \
> –sbin-path=/usr/local/nginx/sbin/nginx \
> –conf-path=/etc/nginx/nginx.conf \
> –error-log-path=/var/log/nginx/error.log \
> –http-log-path=/var/log/nginx/access.log \
> –pid-path=/var/run/nginx/nginx.pid  \
> –lock-path=/var/lock/nginx.lock \
> –user=nginx \
> –group=nginx \
> –with-http_ssl_module \
> –with-http_stub_status_module \
> –with-http_gzip_static_module \
> –with-http_flv_module \
> –with-http_mp4_module \
> –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/ \
> –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi/ \
> –http-scgi-temp-path=/var/tmp/nginx/scgi/ \
> –with-pcre
# make && make install

3、为 nginx 提供 SysV init 脚本:

新建文件 /etc/rc.d/init.d/nginx,内容如下:
# vim /etc/rc.d/init.d/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/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/local/nginx/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

而后为此脚本赋予执行权限:
# chmod +x /etc/rc.d/init.d/nginx

添加至服务管理列表,并让其开机自动启动:
# chkconfig –add nginx
# chkconfig nginx on

配置 nginx 常用环境变量

– 配置 nginx 程序执行环境变量
# echo “export PATH=/usr/local/nginx/sbin:$PATH” > /etc/profile.d/nginx.sh
# . /etc/profile.d/nginx.sh 
– 配置 nginx 语法着色
# mkdir .vim
# cp -ra /usr/src/nginx-1.11.3/contrib/vim/* .vim/

而后就可以启动服务并测试了:
# service nginx start

以上为 LNMP 架构 nginx 配置过程。

二、安装 MySQL-5.5.28

1、准备数据存放的文件系统
新建一个逻辑卷,并将其挂载至特定目录即可。过程如下:
– 新建大小为 20G 的分区为 LVM
# fdisk -l /dev/sda | grep sda3
/dev/sda3            7675      10286    20976471  8e  Linux LVM
– 新建物理逻辑卷
# pvcreate /dev/sda3
– 新建逻辑卷组
# vgcreate myvg /dev/sda3
– 新建大小为 15G 的逻辑卷
# lvcreate -L 15G -n mydata myvg
# mke2fs -t ext4 /dev/myvg/mydata

这里假设其逻辑卷的挂载目录为 /mydata,而后需要创建 /mydata/data 目录做为 mysql 数据的存放目录。
# mkdir /mydata
# vim /etc/fstab 
/dev/myvg/mydata        /mydata                ext4    defaults,acl        0 0
# mount -a
# mkdir /mydata/data

2、新建用户以安全方式运行进程:

# groupadd -r mysql
# useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql
# mkdir /mydata/binlogs
# chown -R mysql:mysql /mydata/data/
# chown -R mysql:mysql /mydata/binlogs

3. 安装编译代码需要的包
# yum -y install ncurses-devel  cmake
# rpm -ivh bison-devel-2.4.1-5.el6.x86_64.rpm

4、安装并初始化 mysql-5.6.32
# tar xf mysql-5.6.32.tar.gz
# cd mysql-5.6.32
# 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
# make && make install

5、授予 mysql 程序目录权限:
# cd /usr/local/mysql/
# chown -R :mysql /usr/local/mysql/

6、初始化 mysql 数据基本目录及库文件
# scripts/mysql_install_db –user=mysql –datadir=/mydata/data/

7、为 mysql 提供主配置文件
# cp support-files/my-default.cnf /etc/my.cnf 
# vim /etc/my.cnf
[mysqld]
port        = 3306
socket        = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 2
datadir = /mydata/data
innodb_file_per_table = on
binlog_format=mixed
log-bin=/mydata/binlogs/mysql-binlog
server-id = 1

8、为 mysql 提供 SysV init 脚本:
# cp support-files/mysql.server /etc/init.d/mysqld
# chkconfig –add mysqld

9、配置 mysql 常用环境变量

– 配置 mysql 程序执行环境变量
# echo “export PATH=/usr/local/mysql/bin/:$PATH” > /etc/profile.d/mysql.sh
# . /etc/profile.d/mysql.sh

10、提供 man 手册至 man 命令的查找路径
# vim/etc/man.config – 加入下行内容
MANPATH    /usr/local/mysql/man

11、输出 mysql 的头文件至系统头文件路径
# ln -sv /usr/local/mysql/include /usr/include/mysql

12、输出 MariaDB 的库文件给系统的查找路径
# echo “/usr/local/mysql/lib” > /etc/ld.so.conf.d/mysql.conf
# ldconfig 
# ldconfig -v | grep mysql

以上为 mysql 编译安装过程

三、编译安装 php-5.6.18
1、解决依赖关系
# yum -y install pcre-devel openssl-devel libxml2-devel bzip2-devel 
# yum -y install php-gd freetype-devel libjpeg-devel libpng-devel 
# yum -y install libmcrypt-2.5.8-9.el6.x86_64.rpm
# yum -y install libmcrypt-devel-2.5.8-9.el6.x86_64.rpm
#  yum -y install mhash-0.9.9.9-3.el6.x86_64.rpm 
#  yum -y install mhash-devel-0.9.9.9-3.el6.x86_64.rpm 
#  yum -y install libcurl-devel

2、编译安装
# tar xf php-5.6.18.tar.gz
# cd php-5.6.18
./configure –prefix=/usr/local/php \
–with-config-file-path=/usr/local/php/etc \
–enable-inline-optimization \
–disable-debug \
–disable-rpath \
–enable-shared \
–enable-opcache \
–enable-fpm \
–with-mysql=/usr/local/mysql \
–with-mysqli=/usr/local/mysql/bin/mysql_config \
–with-pdo-mysql=/usr/local/mysql \
–with-gettext \
–enable-mbstring \
–with-iconv \
–with-mcrypt \
–with-mhash \
–with-openssl \
–enable-bcmath \
–enable-soap \
–with-libxml-dir \
–enable-pcntl \
–enable-shmop \
–enable-sysvmsg \
–enable-sysvsem \
–enable-sysvshm \
–enable-sockets \
–with-curl \
–with-zlib \
–enable-zip \
–with-bz2 \
–with-gd \
–with-freetype-dir \
–with-jpeg-dir \
–with-png-dir
# make -j 4 && make install

3、为 php 提供配置文件
# cp php.ini-production /usr/local/php/etc/php.ini 
# vim /usr/local/php/etc/php.ini
date.timezone = Asia/Shanghai

4、为 php-fpm 提供 Sysv init 脚本,并将其添加至服务列表:

# cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm
# chmod +x /etc/rc.d/init.d/php-fpm
# chkconfig –add php-fpm
# chkconfig php-fpm on

5、为 php-fpm 提供配置文件:
# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

6、编辑 php-fpm 的配置文件:

# vim /usr/local/php/etc/php-fpm.conf

配置 fpm 的相关选项为你所需要的值,并启用 pid 文件(如下最后一行):

1234567 pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2      #这个数值不能大于 start_server,想想知道,不然 php 服务起不来
pm.max_spare_servers = 8
pid = /usr/local/php/var/run/php-fpm.pid
– 检查配置文件正确性
# /usr/local/php/sbin/php-fpm -t

7、配置 php 命令环境变量
# echo “export PATH=/usr/local/php/bin/:$PATH” > /etc/profile.d/php.sh
# . /etc/profile.d/php.sh

8、接下来就可以启动 php-fpm 了:

# service php-fpm start

使用如下命令来验证(如果此命令输出有中几个 php-fpm 进程就说明启动成功了):

1 # ps aux | grep php-fpm

9、整合 nginx 和 php5
1、编辑 /etc/nginx/nginx.conf,配置如下:

并在所支持的主页面格式中添加 php 格式的主页,类似如下:
location / {
    root  html;
    index  index.php index.html index.htm;
}
启用如下选项:
location ~ \.php$ {
    root                html;
    fastcgi_pass        127.0.0.1:9000;
    fastcgi_index      index.php;
    fastcgi_param      SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include            fastcgi_params;
}

2、在 /usr/local/nginx/html 新建 index.php 的测试页面,测试 php 是否能正常工作:

# cat > /usr/local/nginx/html/index.php << EOF
> <?php
> phpinfo();
> ?>
> EOF

接着就可以通过浏览器访问此测试页面了。

五、安装 xcache,为 php 加速
1、安装
# tar xf xcache-3.2.0.tar.gz 
# cd xcache-3.2.0
# /usr/local/php/bin/phpize 
Configuring for:
PHP Api Version:        20131106
Zend Module Api No:      20131226
Zend Extension Api No:  220131226
# ./configure –enable-xcache –with-php-config=/usr/local/php/bin/php-config 
# make && make install

安装结束时,会出现类似如下行:

1 Installing shared extensions:    /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

2、编辑 php.ini,整合 php 和 xcache:

首先将 xcache 提供的样例配置导入 php.ini

# mkdir /etc/php.d
# cp xcache.ini /etc/php.d

说明:xcache.ini 文件在 xcache 的源码目录中。

接下来编辑 /etc/php.d/xcache.ini,找到 extension 开头的行,修改为如下行:

extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/xcache.so
 
– 将配置追加至 php.ini 配置文件中
# cat /etc/php.d/xcache.ini >> /usr/local/php/etc/php.ini

3、重新启动 php-fpm 及 nginx

# service php-fpm restart
# service nginx restart

4、测试访问如下所示:

高性能 Web 服务之 LNMP 架构应用

以上为 lnmp 架构应用所有内容。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-09/135112p2.htm

Memcached 是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对 Database 的访问来加速 web 应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API 调用或页面引用结果的直接数据,如字符串、对象等。

memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件。现在
已成为 mixi、hatena、Facebook、Vox、LiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。

Memcached 是一款开发工具,它既不是一个代码加速器,也不是数据库中间件。其设计哲学思想主要反映在如下方面:

1. 简单 key/value 存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成;
2. 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期;
3. 各服务器间彼此无视:不在服务器间进行数据同步;
4. O(1)的执行效率
5. 清理超期数据:默认情况下,Memcached 是一个 LRU 缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached 不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached 也不会真正按期限清理缓存,而仅是当 get 命令到达时检查其时长;

Memcached 提供了为数不多的几个命令来完成与服务器端的交互,这些命令基于 memcached 的协议实现。
memcahe 常用使用命令:

存储类命令:set, add, replace, append, prepend
获取数据类命令:get, delete, incr/decr
统计类命令:stats, stats items, stats slabs, stats sizes
清理命令:flush_all

一、实验系统环境

系统平台:CentOS release 6.5 (Final)
web1.linuxidc.com 172.16.100.100 lnmp 环境
web2.linuxidc.com 172.16.100.7 nginx 服务
mem1.linuxidc.com 172.16.100.8 memcache 服务

——————– 以下操作在 mem.linuxidc.com 主机上操作 ———————–

二、使用 yum 安装 memcached 及 libevent
# yum -y install libevent memcached

三、memcached 的常用选项说明

-l <ip_addr>:指定进程监听的地址;
-d: 以服务模式运行;
-u <username>:以指定的用户身份运行 memcached 进程;
-m <num>:用于缓存数据的最大内存空间,单位为 MB,默认为 64MB;
-c <num>:最大支持的并发连接数,默认为 1024;
-p <num>: 指定监听的 TCP 端口,默认为 11211;
-U <num>:指定监听的 UDP 端口,默认为 11211,0 表示关闭 UDP 端口;
-t <threads>:用于处理入站请求的最大线程数,仅在 memcached 编译时开启了支持线程才有效;
-f <num>:设定 Slab Allocator 定义预先分配内存空间大小固定的块时使用的增长因子;
-M:当内存空间不够使用时返回错误信息,而不是按 LRU 算法利用空间;
-n: 指定最小的 slab chunk 大小;单位是字节;
-S: 启用 sasl 进行用户认证;

四、临时启动 memcached 服务及信息查询
– 启动 memcached
# memcached -u memcached
 
– 查询 memcached 缓存信息
# memcached -u memcached -vv
 
– 指定增长因子为 1.1 倍查询
# memcached -u memcached -f 1.1 -vv

五、配置 memcached 主配置文件
# vim /etc/sysconfig/memcached
PORT=”11211″
USER=”memcached”
MAXCONN=”1024″
CACHESIZE=”64″
OPTIONS=””

六、启动 memcached 服务进程并配置开机自启动
# chkconfig memcached on
# service memcached start

七、使用 telnet 命令测试 memcached 的使用
Memcached 提供一组基本命令用于基于命令行调用其服务或查看服务器状态等。

# telnet 127.0.0.1 11211

示例如下: 添加一个缓存,查询缓存操作
add 命令:
add keyname flag  timeout  datasize
如:

add mykey 0 60 12
Hello world!

get 命令:
get keyname

如:get mykey
VALUE mykey 0 12
Hello world!
END

——————– 以下操作在 web1.linuxidc.com 主机上操作 ———————–
八、安装 Memcache 的 PHP 扩展
1、安装 PHP 的 memcache 扩展
# tar xf memcache-3.0.8.tgz 
# cd memcache-3.0.8
# /usr/local/php/bin/phpize 
# ./configure –with-php-config=/usr/local/php/bin/php-config –enable-memcache
# make && make install

上述安装完后会有类似以下的提示:
 /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

2、编辑 /usr/local/php/etc/php.ini,在“动态模块”相关的位置添加如下一行来载入 memcache 扩展:
; extension_dir = “ext”
extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/memcache.so

而后对 memcached 功能进行测试,在网站目录中建立测试页面 test.php,添加如下内容:

<?php
$mem = new Memcache;
$mem->connect(“127.0.0.1”, 11211)  or die(“Could not connect”);
 
$version = $mem->getVersion();
echo “Server’s version: “.$version.”<br/>\n”;
 
$mem->set(‘hellokey’, ‘Hello World’, 0, 600) or die(“Failed to save data at the memcached server”);
echo “Store data in the cache (data will expire in 600 seconds)<br/>\n”;
 
$get_result = $mem->get(‘hellokey’);
echo “$get_result is from memcached server.”;         
?>

如果有输出“Hello World is from memcached.”等信息,则表明 memcache 已经能够正常工作, 如下所示:

高性能 Web 服务之 LNMP 架构应用

在 memcache 缓存服务器上查询缓存数据:
# telnet 127.0.0.1 11211
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ‘^]’.
get hellokey
VALUE hellokey 0 11
Hello World
END

九、安装 memcahephp 图形监控工具
1、到 memcahe 安装程序包复制 memcache.php 至网页目录下

# tar xf memcache-3.0.8.tgz 
# cd memcache-3.0.8
# cp /usr/src/memcache-3.0.8/memcache.php /usr/local/nginx/html/

2. 编辑 memcached.php 文件,修改如下选项:
12345678 $VERSION=’$Id: memcache.php,v 0.2 2008/06/02 Exp $’;
define(‘ADMIN_USERNAME’,’memcacheadmin’);    // Admin Username 管理用户名
define(‘ADMIN_PASSWORD’,’RedHat’);      // Admin Password    管理用户密码
define(‘DATE_FORMAT’,’Y/m/d H:i:s’);
define(‘GRAPH_SIZE’,200);
define(‘MAX_ITEM_DUMP’,50);
$MEMCACHE_SERVERS[] = ‘mem.linuxidc.com:11211’; // add more as an array memcache 服务器定义
//$MEMCACHE_SERVERS[] = ‘mymemcache-server2:11211’; // add more as an array

注意 $MEMCACHE_SERVERS[]可以配置多个 memcache

3、打开 IE 浏览器,输入 http://172.16.100.100/memcache.php 打开即可,注意第一次访问的时候提示输入登录用户名和密码。默认的的用户名密码:memcacheadmin/redhat,可以在 php 文件中配置

高性能 Web 服务之 LNMP 架构应用

监控界面:
        在上面监控画面看出,左侧显示的是 memcache 的主机、端口,运行时间等信息;右侧显示的是 cache 利用率、缓存命中率、点击率(Hit)等信息。
        注意:右则显示的信息,默认是多个 memcache 缓存的总数,需要选中 Memcached Hosts 对单个主机进行刷新,显示单个主机的信息

十、安装 memadmin 管理工具
1、将 memadmin 解压至网页目录下

# tar xf memadmin-1.0.12.tar.gz  -C /usr/local/nginx/html/
# cd /usr/local/nginx/html/

2、打开 IE 浏览器,输入 http://172.16.100.100/memadmin 打开即可, 注意第一次访问的时候提示输入登录用户名和密码。默认的的用户名密码:admin/admin,可以在 config.php 文件中配置

高性能 Web 服务之 LNMP 架构应用

十一、Nginx 整合 memcached
 server {
        listen      80;
        server_name  web1.linuxidc.com;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        location / {
                set $memcached_key $uri;
                memcached_pass    172.16.100.8:11211;
                default_type      text/html;
                error_page        404 @fallback;
        }
 
        location @fallback {
                proxy_pass http://172.16.100.7;
        }
}

访问测试如下:

高性能 Web 服务之 LNMP 架构应用

以上为 lnmp 架构应用所有内容!

LNMP 安装参考如下文章

Ubuntu 14.04 搭建 LNMP  http://www.linuxidc.com/Linux/2015-05/116933.htm

Ubuntu 14.04 LTS 安装 LNMP Nginx\PHP5 (PHP-FPM)\MySQL  http://www.linuxidc.com/Linux/2014-05/102351.htm

Ubuntu 13.04 安装 LAMP\Vsftpd\Webmin\phpMyAdmin 服务及设置 http://www.linuxidc.com/Linux/2013-06/86250.htm

在部署 LNMP 的时候遇到 Nginx 启动失败的 2 个问题 http://www.linuxidc.com/Linux/2013-03/81120.htm

Ubuntu 安装 Nginx php5-fpm MySQL(LNMP 环境搭建) http://www.linuxidc.com/Linux/2012-10/72458.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-09/135112.htm

传统上基于进程或线程模型架构的 web 服务通过每进程或每线程处理并发连接请求,这势必会在网络和 I / O 操作时产生阻塞,其另一个必然结果则是对内存或 CPU 的利用率低下。生成一个新的进程 / 线程需要事先备好其运行时环境,这包括为其分配堆内存和栈内存,以及为其创建新的执行上下文等。这些操作都需要占用 CPU,而且过多的进程 / 线程还会带来线程抖动或频繁的上下文切换,系统性能也会由此进一步下降。

在设计的最初阶段,nginx 的主要着眼点就是其高性能以及对物理计算资源的高密度利用,因此其采用了不同的架构模型。受启发于多种操作系统设计中基于“事件”的高级处理机制,nginx 采用了模块化、事件驱动、异步、单线程及非阻塞的架构,并大量采用了多路复用及事件通知机制。在 nginx 中,连接请求由为数不多的几个仅包含一个线程的进程 worker 以高效的回环 (run-loop) 机制进行处理,而每个 worker 可以并行处理数千个的并发连接及请求。

如果负载以 CPU 密集型应用为主,如 SSL 或压缩应用,则 worker 数应与 CPU 数相同;如果负载以 IO 密集型为主,如响应大量内容给客户端,则 worker 数应该为 CPU 个数的 1.5 或 2 倍。

Nginx 会按需同时运行多个进程:一个主进程 (master) 和几个工作进程 (worker),配置了缓存时还会有缓存加载器进程(cache loader) 和缓存管理器进程 (cache manager) 等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以 root 用户身份运行,而 worker、cache loader 和 cache manager 均应以非特权用户身份运行。

主进程主要完成如下工作:
1. 读取并验正配置信息;
2. 创建、绑定及关闭套接字;
3. 启动、终止及维护 worker 进程的个数;
4. 无须中止服务而重新配置工作特性;
5. 控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;
6. 重新打开日志文件,实现日志滚动;
7. 编译嵌入式 perl 脚本;

worker 进程主要完成的任务包括:
1. 接收、传入并处理来自客户端的连接;
2. 提供反向代理及过滤功能;
3. nginx 任何能完成的其它任务;

cache loader 进程主要完成的任务包括:
1. 检查缓存存储中的缓存对象;
2. 使用缓存元数据建立内存数据库;

cache manager 进程的主要任务:
1. 缓存的失效及过期检验;

Nginx 的配置有着几个不同的上下文:main、http、server、upstream 和 location(还有实现邮件服务反向代理的 mail)。配置语法的格式和定义方式遵循所谓的 C 风格,因此支持嵌套,还有着逻辑清晰并易于创建、阅读和维护等优势。

Nginx 的代码是由一个核心和一系列的模块组成, 核心主要用于提供 Web Server 的基本功能,以及 Web 和 Mail 反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由 nginx 的模块实现的。这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协议、upstream 和负载均衡几个类别,这些共同组成了 nginx 的 http 功能。事件模块主要用于提供 OS 独立的 (不同操作系统的事件机制有所不同) 事件通知机制如 kqueue 或 epoll 等。协议模块则负责实现 nginx 通过 http、tls/ssl、smtp、pop3 以及 imap 与对应的客户端建立会话。

在 nginx 内部,进程间的通信是通过模块的 pipeline 或 chain 实现的;换句话说,每一个功能或操作都由一个模块来实现。例如,压缩、通过 FastCGI 或 uwsgi 协议与 upstream 服务器通信,以及与 memcached 建立会话等。

一、安装 Nginx:

1、解决依赖关系

编译安装 nginx 需要事先需要安装开发包组 ”Development Tools” 和 “Server Platform Libraries”。同时,还需要专门安装 pcre-devel 包:
# yum -y groupinstall “Development Tools” “Server Platform Libraries”
# yum -y install pcre-devel openssl-devel

2、安装

首先添加用户 nginx,实现以之运行 nginx 服务进程:

# groupadd -r nginx
# useradd -r -g nginx nginx

接着开始编译和安装 nginx:
# tar xf nginx-1.11.3.tar.gz
# cd nginx-1.11.3
# ./configure –prefix=/usr/local/nginx \
> –sbin-path=/usr/local/nginx/sbin/nginx \
> –conf-path=/etc/nginx/nginx.conf \
> –error-log-path=/var/log/nginx/error.log \
> –http-log-path=/var/log/nginx/access.log \
> –pid-path=/var/run/nginx/nginx.pid  \
> –lock-path=/var/lock/nginx.lock \
> –user=nginx \
> –group=nginx \
> –with-http_ssl_module \
> –with-http_stub_status_module \
> –with-http_gzip_static_module \
> –with-http_flv_module \
> –with-http_mp4_module \
> –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/ \
> –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi/ \
> –http-scgi-temp-path=/var/tmp/nginx/scgi/ \
> –with-pcre
# make && make install

3、为 nginx 提供 SysV init 脚本:

新建文件 /etc/rc.d/init.d/nginx,内容如下:
# vim /etc/rc.d/init.d/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/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/local/nginx/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

而后为此脚本赋予执行权限:
# chmod +x /etc/rc.d/init.d/nginx

添加至服务管理列表,并让其开机自动启动:
# chkconfig –add nginx
# chkconfig nginx on

配置 nginx 常用环境变量

– 配置 nginx 程序执行环境变量
# echo “export PATH=/usr/local/nginx/sbin:$PATH” > /etc/profile.d/nginx.sh
# . /etc/profile.d/nginx.sh 
– 配置 nginx 语法着色
# mkdir .vim
# cp -ra /usr/src/nginx-1.11.3/contrib/vim/* .vim/

而后就可以启动服务并测试了:
# service nginx start

以上为 LNMP 架构 nginx 配置过程。

二、安装 MySQL-5.5.28

1、准备数据存放的文件系统
新建一个逻辑卷,并将其挂载至特定目录即可。过程如下:
– 新建大小为 20G 的分区为 LVM
# fdisk -l /dev/sda | grep sda3
/dev/sda3            7675      10286    20976471  8e  Linux LVM
– 新建物理逻辑卷
# pvcreate /dev/sda3
– 新建逻辑卷组
# vgcreate myvg /dev/sda3
– 新建大小为 15G 的逻辑卷
# lvcreate -L 15G -n mydata myvg
# mke2fs -t ext4 /dev/myvg/mydata

这里假设其逻辑卷的挂载目录为 /mydata,而后需要创建 /mydata/data 目录做为 mysql 数据的存放目录。
# mkdir /mydata
# vim /etc/fstab 
/dev/myvg/mydata        /mydata                ext4    defaults,acl        0 0
# mount -a
# mkdir /mydata/data

2、新建用户以安全方式运行进程:

# groupadd -r mysql
# useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql
# mkdir /mydata/binlogs
# chown -R mysql:mysql /mydata/data/
# chown -R mysql:mysql /mydata/binlogs

3. 安装编译代码需要的包
# yum -y install ncurses-devel  cmake
# rpm -ivh bison-devel-2.4.1-5.el6.x86_64.rpm

4、安装并初始化 mysql-5.6.32
# tar xf mysql-5.6.32.tar.gz
# cd mysql-5.6.32
# 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
# make && make install

5、授予 mysql 程序目录权限:
# cd /usr/local/mysql/
# chown -R :mysql /usr/local/mysql/

6、初始化 mysql 数据基本目录及库文件
# scripts/mysql_install_db –user=mysql –datadir=/mydata/data/

7、为 mysql 提供主配置文件
# cp support-files/my-default.cnf /etc/my.cnf 
# vim /etc/my.cnf
[mysqld]
port        = 3306
socket        = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 2
datadir = /mydata/data
innodb_file_per_table = on
binlog_format=mixed
log-bin=/mydata/binlogs/mysql-binlog
server-id = 1

8、为 mysql 提供 SysV init 脚本:
# cp support-files/mysql.server /etc/init.d/mysqld
# chkconfig –add mysqld

9、配置 mysql 常用环境变量

– 配置 mysql 程序执行环境变量
# echo “export PATH=/usr/local/mysql/bin/:$PATH” > /etc/profile.d/mysql.sh
# . /etc/profile.d/mysql.sh

10、提供 man 手册至 man 命令的查找路径
# vim/etc/man.config – 加入下行内容
MANPATH    /usr/local/mysql/man

11、输出 mysql 的头文件至系统头文件路径
# ln -sv /usr/local/mysql/include /usr/include/mysql

12、输出 MariaDB 的库文件给系统的查找路径
# echo “/usr/local/mysql/lib” > /etc/ld.so.conf.d/mysql.conf
# ldconfig 
# ldconfig -v | grep mysql

以上为 mysql 编译安装过程

三、编译安装 php-5.6.18
1、解决依赖关系
# yum -y install pcre-devel openssl-devel libxml2-devel bzip2-devel 
# yum -y install php-gd freetype-devel libjpeg-devel libpng-devel 
# yum -y install libmcrypt-2.5.8-9.el6.x86_64.rpm
# yum -y install libmcrypt-devel-2.5.8-9.el6.x86_64.rpm
#  yum -y install mhash-0.9.9.9-3.el6.x86_64.rpm 
#  yum -y install mhash-devel-0.9.9.9-3.el6.x86_64.rpm 
#  yum -y install libcurl-devel

2、编译安装
# tar xf php-5.6.18.tar.gz
# cd php-5.6.18
./configure –prefix=/usr/local/php \
–with-config-file-path=/usr/local/php/etc \
–enable-inline-optimization \
–disable-debug \
–disable-rpath \
–enable-shared \
–enable-opcache \
–enable-fpm \
–with-mysql=/usr/local/mysql \
–with-mysqli=/usr/local/mysql/bin/mysql_config \
–with-pdo-mysql=/usr/local/mysql \
–with-gettext \
–enable-mbstring \
–with-iconv \
–with-mcrypt \
–with-mhash \
–with-openssl \
–enable-bcmath \
–enable-soap \
–with-libxml-dir \
–enable-pcntl \
–enable-shmop \
–enable-sysvmsg \
–enable-sysvsem \
–enable-sysvshm \
–enable-sockets \
–with-curl \
–with-zlib \
–enable-zip \
–with-bz2 \
–with-gd \
–with-freetype-dir \
–with-jpeg-dir \
–with-png-dir
# make -j 4 && make install

3、为 php 提供配置文件
# cp php.ini-production /usr/local/php/etc/php.ini 
# vim /usr/local/php/etc/php.ini
date.timezone = Asia/Shanghai

4、为 php-fpm 提供 Sysv init 脚本,并将其添加至服务列表:

# cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm
# chmod +x /etc/rc.d/init.d/php-fpm
# chkconfig –add php-fpm
# chkconfig php-fpm on

5、为 php-fpm 提供配置文件:
# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

6、编辑 php-fpm 的配置文件:

# vim /usr/local/php/etc/php-fpm.conf

配置 fpm 的相关选项为你所需要的值,并启用 pid 文件(如下最后一行):

1234567 pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2      #这个数值不能大于 start_server,想想知道,不然 php 服务起不来
pm.max_spare_servers = 8
pid = /usr/local/php/var/run/php-fpm.pid
– 检查配置文件正确性
# /usr/local/php/sbin/php-fpm -t

7、配置 php 命令环境变量
# echo “export PATH=/usr/local/php/bin/:$PATH” > /etc/profile.d/php.sh
# . /etc/profile.d/php.sh

8、接下来就可以启动 php-fpm 了:

# service php-fpm start

使用如下命令来验证(如果此命令输出有中几个 php-fpm 进程就说明启动成功了):

1 # ps aux | grep php-fpm

9、整合 nginx 和 php5
1、编辑 /etc/nginx/nginx.conf,配置如下:

并在所支持的主页面格式中添加 php 格式的主页,类似如下:
location / {
    root  html;
    index  index.php index.html index.htm;
}
启用如下选项:
location ~ \.php$ {
    root                html;
    fastcgi_pass        127.0.0.1:9000;
    fastcgi_index      index.php;
    fastcgi_param      SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include            fastcgi_params;
}

2、在 /usr/local/nginx/html 新建 index.php 的测试页面,测试 php 是否能正常工作:

# cat > /usr/local/nginx/html/index.php << EOF
> <?php
> phpinfo();
> ?>
> EOF

接着就可以通过浏览器访问此测试页面了。

五、安装 xcache,为 php 加速
1、安装
# tar xf xcache-3.2.0.tar.gz 
# cd xcache-3.2.0
# /usr/local/php/bin/phpize 
Configuring for:
PHP Api Version:        20131106
Zend Module Api No:      20131226
Zend Extension Api No:  220131226
# ./configure –enable-xcache –with-php-config=/usr/local/php/bin/php-config 
# make && make install

安装结束时,会出现类似如下行:

1 Installing shared extensions:    /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

2、编辑 php.ini,整合 php 和 xcache:

首先将 xcache 提供的样例配置导入 php.ini

# mkdir /etc/php.d
# cp xcache.ini /etc/php.d

说明:xcache.ini 文件在 xcache 的源码目录中。

接下来编辑 /etc/php.d/xcache.ini,找到 extension 开头的行,修改为如下行:

extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/xcache.so
 
– 将配置追加至 php.ini 配置文件中
# cat /etc/php.d/xcache.ini >> /usr/local/php/etc/php.ini

3、重新启动 php-fpm 及 nginx

# service php-fpm restart
# service nginx restart

4、测试访问如下所示:

高性能 Web 服务之 LNMP 架构应用

以上为 lnmp 架构应用所有内容。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-09/135112p2.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计26199字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中