LNMP架构服务

编译软件的过程与经验:
1,./configure  通过指定参数,来确认你想要安装的软件安装在哪里,加上哪些功能和去掉哪些功能(如果这一步报错,基本都是缺少依赖包;
解决方法:使用yum去安装,一般来说,rhel做为一个成熟的linux操作系统,常见的底层依赖包都自带了,所以去安装下面这两个组,一般都会有你所需要的依赖包。
# yum groupinstall "Development tools" -y
# yum groupinstall "Desktop Platform Development" -y
如果缺少依赖包在rhel的yum源里找不到,则上网下载第三方的软件,先编译第三方软件,再编译本软件

2,make   相当于是把你上一步定义好的,把这个软件给做出来(这一步一般很少出错,如果出错,问题都比较麻烦。可能是一些兼容性的问题等等,你可以尝试上网查询解决方法,如果查不到,只能换个环境或者换个软件版本或者换些编译参数重新编译)

3, make install  把做好的软件,安装到你第一步所指定的安装目录里(这一步几
乎不会出错的)

--------------------------------

讨论1:
关于./configure参数选择的基本方法:
./configure --help 查看所有的编译参数
第一个重要参数
--prefix=    此参数指定安装目录(一般安装到/usr/local/或者/usr/local/软件名下)

第二类重要参数:
--enable-xxx    打开一个功能(默认是关闭的)
--disable-xxx    关闭一个功能(默认是打开的)

如果你是新手,你就不加任何功能参数,全部使用默认值。但又如果你怕少了功能造成以后需要重编,你可以加上所有的enable参数(但加得越多,错误概率也越大,因为调用的依赖会多,有可能会因为少包而报错)

第三类参数:
--with-xxx=DIR    指定一个目录,调用此目录的功能

讨论2:
假设一个软件abc,安装到/usr/local和安装到/usr/local/abc之间的区别?
安装到/usr/local下:
优点:此软件的命令一般会安装到/usr/local/bin或/usr/local/sbin等;这些路径都默认在$PATH里,所以安装的命令可以直接用,而不用使用绝对路径。
    库文件一般都会安装到/usr/local/lib下,所以把它加入ldconfig,以后所有安装在此目录的库文件都可以被找到。
缺点:不方便删除,因为很多软件都安装到/usr/local下

安装到/usr/local/abc下:
优缺点与上面正好相反

最终建议:小软件一般默认安装/usr/local/;大软件安装/usr/local/软件名/下

讨论3:
关于ldconfig,一个软件的库文件是有可能被其它软件所调用,那么其它软件能否找到你的库文件呢?
一般来说,库文件安装到/lib,/lib64,/usr/lib/,/usr/lib64等,都可以被找得到.那么如果一个软件abc把库文件安装到/usr/local/abc/lib,别人想要找到,你就要把这个路径加入到ldconfig可以找到的路径列表里面去。
做法为:
# vim /etc/ld.so.conf    --在这个主配置文件里加上一行,写上让别人要查找库文件的路径
include ld.so.conf.d/*.conf        --或者在这里的任意.conf结尾的子配置文件里加上一行也可以
/usr/local/abc/lib

# ldconfig   --上面加入路径后,就使用此命令让其生效

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

nginx

survey.netcraft.net

查看各大网站使用的web服务器,使用下面的命令
curl -I www.sina.com

结论:现在大型网站几乎统一都使用nginx或nginx做二次开发的版本(如tengine,OpenResty等)

nginx相对于apache的优势?
资源占用少
支持大并发

linux+nginx+mysql+php(fastcgi)

lnmp搭建过程
(nginx,mysql,php这三个软件用新的编译方法编译顺序无所谓)

编译lnmp所有的软件包在
笔记目录/lnmp_soft/
Discuz_X3.2_SC_UTF8.zip        mcrypt-2.6.6.tar.gz      ngx_cache_purge-2.3.tar.gz
ImageMagick-6.7.8-9.tar.gz     memcache-2.2.7.tgz       pcre-7.9.tar.gz
imagick-3.1.2.tgz              memcached-1.4.22.tar.gz  php-5.6.12.tar.bz2
libevent-1.4.11-stable.tar.gz  mhash-0.9.9.9.tar.bz2    webbench-1.5.tar.gz
libiconv-1.13.tar.gz           mysql-5.6.26.tar.gz
libmcrypt-2.5.8.tar.bz2        nginx-1.8.0.tar.gz

只下载共享的软件包的方法
# wget -m -np -k http://10.1.1.35/program/lnmp_soft/    --m是镜像下载,k是转成本地链接,np表示noparent(也就是只下载当前目录,不会下载上级目录)

编译安装前准备,先确认编译所需要的依赖软件包已经安装    
# yum groupinstall "Desktop Platform Development" -y
# yum groupinstall "Development tools" -y
# yum install curl-devel ncurses-devel net-snmp-* *icu* libxml2-devel  -y

第一大步:
编译mysql
mysql-5.6.26.tar.gz

# rm /mysqldata56 -rf
# rm /usr/local/mysql  -rf
# rm /usr/src/mysql-*/ -rf
--删除以前编译过的,重新编译

# yum install cmake

# tar xvf mysql-5.6.26.tar.gz -C /usr/src/
# cd /usr/src/mysql-5.6.26/
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=gbk,gb2312 -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1

# make ;make install

安装后
1,手动编写my.cnf配置文件
# mkdir /usr/local/mysql/etc
# vim /usr/local/mysql/etc/my.cnf

[mysqld]
port=3307
datadir=/mysqldata56
pid-file=/mysqldata56/mysql56.pid
socket=/mysqldata56/mysql56.socket
log-error=/mysqldata56/mysql56-err.log
user=mysql

[client]
socket=/mysqldata56/mysql56.socket

2:创建相关目录,并修改权限
# mkdir /mysqldata56
# chown mysql.mysql  /mysqldata56  /usr/local/mysql/ -R

3:初始化数据库
# /usr/local/mysql/scripts/mysql_install_db --defaults-file=/usr/local/mysql/etc/my.cnf --user=mysql --basedir=/usr/local/mysql/

4:启动服务
# /usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/etc/my.cnf &

5:登录
# /usr/local/mysql/bin/mysql

第二大步:编译安装php
编译之前,确认把以前编译过的给删除
# rm -rf /usr/src/lnmp
# rm -rf /usr/local/php

1,在安装php之前,先安装php扩展包,这些包是rpm里没有自带,所以这里还是编译一下

libiconv-1.13.tar.gz  --语言编码转换
# mkdir /usr/src/lnmp/        --我这里自己专门建立一个目录存放lnmp项目的所有源码

# tar xvf libiconv-1.13.tar.gz -C /usr/src/lnmp/
# cd /usr/src/lnmp/libiconv-1.13/

#    ./configure ;make ;make install
#    echo /usr/local/lib  > /etc/ld.so.conf.d/lnmp.conf
#    /sbin/ldconfig

pcre-7.9.tar.gz      --perl兼容正则表达式,或者使用rpm自带的也可以(yum install pcre pcre-devel -y)

# tar xvf pcre-7.9.tar.gz -C /usr/src/lnmp/
# cd /usr/src/lnmp/pcre-7.9/

#    ./configure ;make ;make install
#    /sbin/ldconfig

# tar xf php-5.6.12.tar.bz2 -C /usr/src/lnmp/

# cd /usr/src/lnmp/php-5.6.12/

# ./configure --prefix=/usr/local/php/ --with-config-file-path=/usr/local/php/etc --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath  --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl  --enable-mbregex --enable-fpm --enable-mbstring  --enable-ftp --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets  --with-xmlrpc --enable-zip --enable-soap --with-gettext --enable-mysqlnd --with-pcre-dir=/usr/local/  --enable-opcache

# make
# make install

--上面的编译参数要注意的几点;
一,php安装路径这一次不是默认的/usr/local,我换成了/usr/local/php,你不换也是可以的,我这里只是不想去覆盖以前的lamp编译到/usr/local下的php
二,with-pcre-dir是指定pcre库的路径,因为我前面使用的是编译版本的pcre,路径装到/usr/local/下
三,with-pdo-mysql是指定php与mysql的连接,以前pdo-mysql是得去php官网单独下载安装的,较新的php版本都自带了,用这个参数指定mysql的路径就可以了
四,with-config-file-path这是指定php.ini配置文件的路径,没有使用默认的路径,这一步也是可选的,无论你指定到哪,后面的过程要使用php.ini,路径与你现在编译的对应好就行
五:--enable-fpm参数是支持php的fastcgi模式
六:关于--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd
三个参数的说明
传统的安装php的方式中,我们在编译PHP时,一般需要指定以下几项:
--with-mysql=/usr/local/mysql
--with-mysqli=/usr/local/mysql/bin/mysql_config
--with-pdo-mysql=/usr/local/mysql
这实际上就是使用了mysql官方自带的libmysql驱动, 这是比较老的驱动, PHP 5.3开始已经不建议使用它了, 而建议使用mysqlnd

因为mysqlnd内置于PHP源代码,故你在编译安装php时就不需要预先安装mysql server也可以提供mysql client API (mysql_connect, pdo , mysqli),这样就可以实现不用安装mysql,也可以编译php(上次讲lamp时讲的先装mysql,再编php,最后不用mysql,而用远程的另一个mysql的做法为老的做法)

把上面的三个参数换为--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd 就可以了

-----------------------------------------------
编译php时可能会出现的几种错误总结:

错误一:
# ./configure时报下面的错误
configure: error: Don‘t know how to define struct flock on this system, set --enable-opcache=no

解决方法:
# ln -s /usr/local/mysql/lib/libmysqlclient.so /usr/lib/
# ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18
# ldconfig
--或者echo /usr/local/mysql/lib >> /etc/ld.so.conf.d/lnmp.conf && ldconfig

错误二:
# ./configure之后如果直接make会报下面的错误

collect2: ld returned 1 exit status
make: *** [sapi/cli/php] Error 1

--就最好删掉php的源码目录,再重新解压,重新编译,使用下面的参数来编译
# make ZEND_EXTRA_LIBS=‘-liconv‘
# make install

错误三:
chmod: cannot access `ext/phar/phar.phar‘: No such file or directory"

# cp ext/phar/phar.php ext/phar/phar.phar

------------------------------------------------

2,php成功安装后,继续安装php第三方模块

安装缓存模块memcache

# tar xvf memcache-2.2.7.tgz -C /usr/src/lnmp/
# cd /usr/src/lnmp/memcache-2.2.7/
# /usr/local/php/bin/phpize     --用phpize生成编译的configure文件。注意使用的路径要为编译的/usr/local/php的路径;

phpize prepare a PHP extension for compiling
如果你不用phpize,你的这个目录里根本就没有configure这个文件

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

# make ;make install

注意安装信息
Libraries have been installed in:
   /usr/src/lnmp/memcache-2.2.7/modules

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

# echo /usr/src/lnmp/memcache-2.2.7/modules/ >> /etc/ld.so.conf.d/lnmp.conf
#    /sbin/ldconfig

安装绘图引擎模块imagemagick,与GD类似
# tar xf ImageMagick-6.7.8-9.tar.gz -C /usr/src/lnmp/

# cd /usr/src/lnmp/ImageMagick-6.7.8-9/

#    ./configure
#    make;make install
#    /sbin/ldconfig

安装imagick(连接php与imagemagick的通道)

# tar xf imagick-3.1.2.tgz -C /usr/src/lnmp/

# cd /usr/src/lnmp/imagick-3.1.2/

# /usr/local/php/bin/phpize
#     ./configure --with-php-config=/usr/local/php/bin/php-config
#    make;make install

注意安装的库路径的模块路径信息
Libraries have been installed in:
   /usr/src/lnmp/imagick-3.1.2/modules

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

# echo /usr/src/lnmp/imagick-3.1.2/modules >> /etc/ld.so.conf.d/lnmp.conf

# /sbin/ldconfig

到此,与nginx之前要编译的所有软件及扩展模块完成

验证此目录里有三个安装模块,表示安装OK
# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
imagick.so  memcache.so  opcache.so opcache.a

--------------------------------------------

3,拷贝并配置php配置文件,加上前面所编译的模块支持

# cp /usr/src/lnmp/php-5.6.12/php.ini-production /usr/local/php/etc/php.ini
--拷配置文件,拷的路径是根据编译时的--sysconfigdir参数决定的(因为,我指定安装路径为/usr/local/php,所以就要拷到/usr/local/php/etc/)

配置php.ini文件加上前面安装的扩展的模块支持

# vim /usr/local/php/etc/php.ini
--直接在最后加上下面一段

extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/"
extension = "memcache.so"
extension = "imagick.so"

[opcache]
zend_extension = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/opcache.so"
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.optimization_level=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.save_comments=0

关于下面几个参数的说明
opcache.memory_consumption=128    --共享内存大小, 这个根据你们的需求可调
opcache.interned_strings_buffer=8   --interned string的内存大小, 也可调
opcache.max_accelerated_files=4000   --最大缓存的文件数目
opcache.revalidate_freq=60         --60s检查一次文件更新
opcache.fast_shutdown=1         --打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高
opcache.save_comments=0         --不保存文件或函数的注释

------------------------------------------------------

第三大步:编译安装nginx

--今天使用的是稳定版1.8.0版本的nginx来做

# useradd -r -d /dev/null -s /sbin/nologin nginx    --我这里建立一个用户来跑nginx,不做也可以,它默认是用daemon用户来跑

# id nginx        --nginx的uid,gid无所谓是多少
uid=493(nginx) gid=487(nginx) groups=487(nginx)

# tar xf nginx-1.8.0.tar.gz -C /usr/src/lnmp/
# cd /usr/src/lnmp/nginx-1.8.0/

# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module  --with-http_stub_status_module  --with-http_ssl_module  --with-pcre=/usr/local/

--with-http_stub_status_module模块记得要加,后面做查看nginx状态需要这个模块

# make ;make install

# ls /usr/local/nginx    --看到这些文件,则表示nginx安装成功
conf  html  logs  sbin

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

第四大步:配置优化php的fastcgi配置文件,并启动fastcgi模式的php

配置php-fpm配置文件 (配置fastcgi)
# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
--先改名,把.default去掉

要在些配置文件配置的选项有:    
        监听的IP,端口或者socket
        初始化的进程数
        执行身份
        错误是否显示
        打开的资源限制等

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

164 listen = /var/run/fastcgi/fastcgi.socket

534 php_flag[display_errors] = on

149 user = nginx
150 group = nginx

235 pm.max_children = 64
240 pm.start_servers = 20
255 pm.min_spare_servers = 5
250 pm.max_spare_servers = 35
261 pm.max_requests = 3000

458 rlimit_files = 65535

175 listen.owner = nginx
176 listen.group = nginx
177 listen.mode = 0660
--这三行是控制启动fastcgi之后的socket文件的权限(特别是新版本的php,修复了以前socket访问权限的bug,所以这里指好权限,那么nginx才能有权限读取socket来访问fastcgi)

# mkdir /var/run/fastcgi
# chown nginx.nginx /var/run/fastcgi/

启动php fastcgi进程

# /usr/local/php/sbin/php-fpm -D -y /usr/local/php/etc/php-fpm.conf

--启动fastcgi,直接这样启动,5.3.3版本之前的php需要加start参数来启动

ls /var/run/fastcgi/        --启动过后,就可以在/var/run/fastcgi/目录下找到socket文件
fastcgi.socket

# ps -ef |grep fpm    --也可以用此命令来查看php的factcgi的进程,有20个进程,因为我在前面配置pm.start_servers = 20

--如果要关闭fpm,可以直接pkill fpm就可以了

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

第五大步:
配置nginx.conf主配置文件

# vim /usr/local/nginx/conf/nginx.conf

user nginx  nginx;            --运行用户和组
worker_processes  8;            --启动ngnix的服务的工作进程数
error_log  logs/error.log  info;    --错误日志以及日志等级
pid        logs/nginx.pid;        --pid文件
worker_rlimit_nofile 65535;        --能打开的最大的文件描述符    
events {
    use epoll;            --epoll工作模式
    worker_connections  65535;    --每个进程允许打开的并发连接数
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;    
    sendfile        on;
    tcp_nopush     on;
    keepalive_timeout  65;
    gzip  on;
    server {
        listen       8000;        --监听的端口
        server_name  10.1.1.35;    --域名或者IP    
        charset utf8;            --字符集
    
            root   /lnmp/web;            --家目录
            index  index.php index.html index.htm;    --主页文件

error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ .*\.php$ {
            fastcgi_pass    unix:/var/run/fastcgi/fastcgi.socket;--对应php-fpm.conf里的设置
            fastcgi_index  index.php;    
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;        --把/scripts改成$document_root,表示家目录下的.php文件也当会以php来执行
            include        fastcgi_params;
        }
    }
}

# mkdir /lnmp/web -p    --把定义的网站家目录也创建出来

启动nginx
# /usr/local/nginx/sbin/nginx
reload的方法
# /usr/local/nginx/sbin/nginx -s  reload
关闭的方法
# /usr/local/nginx/sbin/nginx -s  stop

最基本的验证:
vim /lnmp/web/index.html --建立一个主页,去访问它

# vim /lnmp/web/test.php    --和以前lamp时一样,在家目录下建立一个php测试页面来测试
<?php
        phpinfo();
?>

使用http://10.1.1.35:8000/test.php能验证支持php,说明整个基本的lnmp搭建完成

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

ngnix 基本配置

例 1
server {
    listen  80;   --端口
    root /web;    --使用绝对路径配置网站家目录
    server_name  li.cluster.com;    --绑定域名或者IP
    index  index.php index.html;  --主页文件
    }

例 2
虚拟主机的配置
基于ip的虚拟主机
基于端口的虚拟主机
基于域名的虚拟主机

基于ip的
http {
    server {
        listen 80;
        server_name 10.1.1.35;
        root /web1;
        }

server {
        listen 80;
        server_name 10.1.1.9;
        root /web2;
        }    
}

基于端口的
http {
    server {
        listen 80;
        server_name 10.1.1.35;
        root /web1;
        }

server {
        listen 8080;
        server_name 10.1.1.35;
        root /web2;
        }    
}

基于域名的

需要DNS的支持

http {
    server {
        listen 80;
        server_name new.cluster.com;
        root /web1;
        }

server {
        listen 80;
        server_name sports.cluster.com;
        root /web2;
        }    
}

例 3
访问控制的实现
写法一:
http {
    server {
        listen 80;
        server_name li.cluster.com;
        root /web
        location /sports/ {
            deny 10.1.1.35;
            allow all;    --location标签,只拒绝35访问
            }
        }

写法二
http {
    server {
        listen 80;
        server_name li.cluster.com;
        root /web;
        deny 10.1.1.35;
        allow all;    --不使用location标签,只拒绝35访问
        }
    }
写法三;
全局控制
http  {
    deny 10.1.1.35;
    allow all;        --全局的访问控制要写到http { }的大括号里
    server {
        listen 80;
        server_name li.cluster.com;
        root /web;
        }

server {
        listen 80;
        server_name sports.cluster.com;
        root /web2;
        }    
}

例 4
在server {} 配置段里加上下面一段

location /nginxstatus {
                stub_status on;
                access_log      on;
                auth_basic      "nginxstatus";
        }

访问http://10.1.1.35:8000/nginxstatus

Active connections: 3         --活动的连接数
server accepts handled requests
 206909 206909 207011         --共创建了206909个连接,成功创建206909次握手,总共处理了207011个请求
Reading: 0 Writing: 1 Waiting: 2

例五:
日志格式,和日志切割

在server {  
}    配置段里加上下面一段日志格式的控制

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;

访问日志的切割,把每天的access.log保存到一个日期的目录下

提示如何打印昨天的时间,使用-d ‘yesterday‘
[[email protected] ~]# date -d ‘yesterday‘ +‘%Y-%m-%d‘
2015-08-29

vim /usr/local/nginx/sbin/nginx_logrotate.sh

logpath="/usr/local/nginx/logs"

year=`date -d ‘yesterday‘ +‘%Y‘`
month=`date -d ‘yesterday‘ +‘%m‘`
day=`date -d ‘yesterday‘ +‘%Y-%m-%d‘`

mkdir $logpath/$year/$month   -p

mv $logpath/access.log $logpath/$year/$month/$day.accesslog    
touch $logpath/access.log

kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`    ---USR1是一个自定义的singal,(相当于reload刷新,在apache的日志切割脚本里用kill -HUP)主要是mv了日志之后,让nginx新产生一个空的日志

最后把这个写到crontab里,让它每天晚上凌晨执行
crontab -e

01 0 * * *  sh  /usr/local/nginx/sbin/nginx_logrotate.sh

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

安装Discuz论坛
Discuz_X3.2_SC_UTF8.zip

# unzip Discuz_X3.2_SC_UTF8.zip -d /lnmp/web/

# cd /lnmp/web
# mv upload/*  .
# rm upload/ -rf

然后使用firefox用下面的路径来安装
http://10.1.1.35:8000/install/

环境检查这一步,有些目录和文件权限需要修改

# chown nginx.nginx /lnmp/web/ -R

数据库授权

# /usr/local/mysql/bin/mysql

mysql> create database discuz;    --创建一个库,用于存放将要安装的discuz论坛的表

mysql> grant all on discuz.* to ‘discuzuser‘@‘localhost‘ identified by ‘123‘;    --授权一个用户,用于discuz论坛程序连接mysql

mysql> flush privileges;

安装会出现下面的报错
Can‘t connect to local MySQL server through socket ‘/tmp/mysql.sock‘ (2)

解决方法1:
把mysql的配置socket路径改成/tmp/mysql.sock
# vim /usr/local/mysql/etc/my.cnf
[mysqld]
port=3307
datadir=/mysqldata56
pid-file=/mysqldata56/mysql56.pid
socket=/tmp/mysql.sock
log-error=/mysqldata56/mysql56-err.log

[client]
socket=/tmp/mysql.sock

改完后,重启mysql

解决方法2:
如果不想改,可以把原来的socket做一个软链接到/tmp/mysql.sock
# ln -s /mysqldata56/mysql56.socket /tmp/mysql.sock

解决方法3:
不使用socket连接,直接在安装界面填mysql的host为127.0.0.1:3307指定以tcp/ip协议的3307端口来连接

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

memcache介绍与安装

memcache是一个开源分布式的内存对象缓存系统(另一个类似功能的软件叫redis).一般放在web程序与数据库,帮助缓存程序取数据库的数据。

web
            |
            memcache
            |
            mysql

笔记目录/lnmp_soft/
libevent-1.4.11-stable.tar.gz    --memcache的事件驱动库
memcached-1.4.22.tar.gz        --memcache主程序包(memcache官网下载)
memcache-2.2.7.tgz        --php的memcache扩展包(php官网下载)

上面三个软件包,第三个在安装php第三方扩展模块时就已经安装并支持了,所以下面继续安装另两个软件包

# tar xf libevent-1.4.11-stable.tar.gz -C /usr/src/lnmp
# cd /usr/src/lnmp/libevent-1.4.11-stable/

# ./configure ;make ;make install

# tar xf memcached-1.4.22.tar.gz -C /usr/src/lnmp
# cd /usr/src/lnmp/memcached-1.4.22/

# ./configure --with-libevent=/usr/local/ ;make ;make install

# /usr/local/bin/memcached -d -m 100 -u root    --启动memcached守护进程,-d表示启动daemon,-m 100表示分配100MB内存给memcached做缓存,-u root指定以root用户来跑这个daemon

关闭方法(kill -TERM PID)

# lsof -i:11211        --默认端口为11211
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
memcached 28795 root   26u  IPv4 268755      0t0  TCP *:memcache (LISTEN)
memcached 28795 root   27u  IPv6 268756      0t0  TCP *:memcache (LISTEN)
memcached 28795 root   28u  IPv4 268759      0t0  UDP *:memcache
memcached 28795 root   29u  IPv4 268759      0t0  UDP *:memcache
memcached 28795 root   30u  IPv4 268759      0t0  UDP *:memcache
memcached 28795 root   31u  IPv4 268759      0t0  UDP *:memcache
memcached 28795 root   32u  IPv6 268760      0t0  UDP *:memcache
memcached 28795 root   33u  IPv6 268760      0t0  UDP *:memcache
memcached 28795 root   34u  IPv6 268760      0t0  UDP *:memcache
memcached 28795 root   35u  IPv6 268760      0t0  UDP *:memcache

测试:做完上面的步骤,其实你的工作基本就完成了,只需要告诉php开发人员,你的memcache的端口和IP,他们就可以写程序连接了

# vim /lnmp/web/memcachetest.php    --在家目录下做一个测试页面,使用firefox访问这个页面,如果能显示This is a test!,则表示成功

<?php
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211);
$mem->set(‘key‘, ‘This is a test!‘, 0, 60);
$val = $mem->get(‘key‘);
echo $val;
?>

测试memcache方法一
(开memcache显示,关闭memcache不能显示)
# vim /usr/local/php/etc/php.ini
;extension = "memcache.so"        --前面加;符号注释来模拟关闭

# pkill fpm
# /usr/local/php/sbin/php-fpm -D -y /usr/local/php/etc/php-fpm.conf
--再使用这两句把php的fastcgi重启,使之生效

测试memcache方法二
关闭memcache的11211,上面的This is a test!就无法显示.打开就OK

-----------------

上面是安装完memcached后,可以让开发人员使用。
如果是象discuz这种开源论坛安装完后,我没有开发能力,如何让discuz使用memcache?

使用安装时的admin用户和密码登陆后台http://172.16.2.35:8000/admin.php

点全局--》性能优化--》内存优化
可以看到memcache是支持,但是关闭的

把关闭状态改成打开的方法为:
# vim /lnmp/web/config/config_global.php
 25 $_config[‘memory‘][‘memcache‘][‘server‘] = ‘127.0.0.1‘;    --把这个IP127.0.0.1配上(如果memcache在另一台机器上,就写它的IP)

保存后,再刷新后台的内存优化界面状态就变为打开了

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

补充一:

如果你编译安装好的lnmp在安装某个应用时,出现了php模块功能(或者叫extension扩展)缺失的报错,如何解决?
例:
我今天前面的php编译参数里并没有加--enable-mcrypt这个编译参数,所以并不支持mcrypt这个功能
可以通过三个方法来验证:
1,安装一个需要使用mcrypt功能的应用,就会告诉你缺少此功能(但这样比较麻烦,所以这里我选择后面两种)
2,访问http://172.16.2.35:8000/test.php,查找mcrypt功能,发现没有支持mcrypt
3,使用/usr/local/bin/php -m 命令显示所有php支持的extension扩展,发现没有支持mcrypt

解决方法:
第一种方法:重新编译php,在原来参数基础上加上--enable-mcrypt

第二种方法:不需要重编译php(也分两种情况自带扩展或第三方扩展)
1,ls /usr/src/lnmp/php-5.6.12/ext/ 看一下php的安装源码目录下的ext子目录里,这里就有自带的各种php扩展,如果你少了一个第三方的,那么就直接下载相关的软件包,编译安装成xxx.so,然后修改php.ini配置文件,加上这个so的支持就可以了

2,如果是/usr/src/lnmp/php-5.6.12/ext/目录里有的扩展,那么可以不用重编php,编译这个扩展,并加上此功能
(我这里以增加mcrypt扩展功能为例,操作过程如下:)

先安装mcrypt的依赖包mhash和libmcrypt(但rhel6.5没有自带,需要第三方下载再安装)
            mhash-0.9.9.9.tar.bz2

# tar xvf mhash-0.9.9.9.tar.bz2 -C /usr/src/lnmp/
# cd /usr/src/lnmp/mhash-0.9.9.9/

#    ./configure ;make ;make install
#    /sbin/ldconfig

libmcrypt-2.5.8.tar.bz2
        
# tar xvf libmcrypt-2.5.8.tar.bz2 -C /usr/src/lnmp/
# cd /usr/src/lnmp/libmcrypt-2.5.8/
    
#    ./configure ;make ;make install
#    /sbin/ldconfig

# cd /usr/src/lnmp/php-5.6.12/ext/mcrypt/
# /usr/local/php/bin/phpize        --目录默认没有configure文件,需要使用你安装的对应版本phpize命令执行一下,才会出现configure

# ./configure --with-php-config=/usr/local/php/bin/php-config
# make
# make install

# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/mcrypt.so
--产生了mcrpyt.so,表示安装成功

# vim /usr/local/php/etc/php.ini    --在配置文件最后加上扩展的信息(这里顺便把opcache扩展也加上了)
extension = mcrypt.so

最后重启php的fastcgi
# pkill fpm
# /usr/local/php/sbin/php-fpm -D -y /usr/local/php/etc/php-fpm.conf

# /usr/local/php/bin/php -m |grep mcrypt    --可以验证php支持了mcrypt扩展
mcrypt

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

补充二:
一个web应用做好后,需要做一下测试,但一般要注意以下几点:
1,压力测试工作应该放到产品上线之前,而不是上线以后
2,测试时尽量跨公网进行,而不是内网
3,测试时并发应当由小逐渐加大,比如并发100时观察一下网站负载是多少、打开是否流程,并发200时又是多少、网站打开缓慢时并发是多少、网站打不开时并发又是多少
4,应尽量进行单元测试,如B2C网站可以着重测试购物车、推广页面等,因为这些页面占整个网站访问量比重较大

我们这里是内网做一些基本测试比较来说明lnmp的原理
测试工具
1,ab命令  apache自带
2,webbench  
# tar xf 笔记目录/lnmp_soft/webbench-1.5.tar.gz -C /usr/src/lnmp/
# cd /usr/src/lnmp/webbench-1.5/
# make ;make install

测试一:测试opcache(php代码缓存加速软件,以前有叫apc,xcache,eaccelerator,zend opimizer等等很多)
有支持opcache的lnmp做如下测试
# ab -n 1000 -c 1000 http://172.16.2.35:8000/index.php

Concurrency Level:      1000
Time taken for tests:   0.122 seconds
Complete requests:      1000
Failed requests:        853
   (Connect: 0, Receive: 0, Length: 853, Exceptions: 0)
Write errors:           0
Non-2xx responses:      1000
Total transferred:      646678 bytes
HTML transferred:       458061 bytes
Requests per second:    8226.05 [#/sec] (mean)
Time per request:       121.565 [ms] (mean)
Time per request:       0.122 [ms] (mean, across all concurrent requests)
Transfer rate:          5194.93 [Kbytes/sec] received

# webbench -c 1000 http://172.16.2.35:8000/index.php
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://172.16.2.35:8000/index.php
1000 clients, running 30 sec.

Speed=492092 pages/min, 2901688 bytes/sec.
Requests: 246001 susceed, 45 failed.

# vim /usr/local/php/etc/php.ini  --把opcache相关配置注释掉然后重启php
# pkill fpm
# /usr/local/php/sbin/php-fpm -D -y /usr/local/php/etc/php-fpm.conf

没有支持opcache的lnmp做如下测试

# ab -n 1000 -c 1000 http://172.16.2.35:8000/index.php
Concurrency Level:      1000
Time taken for tests:   0.197 seconds
Complete requests:      1000
Failed requests:        158
   (Connect: 0, Receive: 0, Length: 158, Exceptions: 0)
Write errors:           0
Non-2xx responses:      1000
Total transferred:      640892 bytes
HTML transferred:       452154 bytes
Requests per second:    5070.76 [#/sec] (mean)
Time per request:       197.209 [ms] (mean)
Time per request:       0.197 [ms] (mean, across all concurrent requests)
Transfer rate:          3173.64 [Kbytes/sec] received

# webbench -c 1000 http://172.16.2.35:8000/index.php
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://172.16.2.35:8000/index.php
1000 clients, running 30 sec.

Speed=309968 pages/min, 2615130 bytes/sec.
Requests: 154966 susceed, 18 failed.

--测试结论:有opcache的性能好(因为我这里是nginx,加上资源比较充足,所以测试结果差异不大)

课后测试实践:
1,在相同的机器上安装lamp和安装lnmp,都安装同一个论坛,然后使用测试工具分别对其测试,然后比较结果

2,lnmp里discuz论坛打开memcache和关闭memcache的测试比较

补充三:
把单机lnmp分离成多机

你可以把nginx,mysql,php分成三台服务器都可以(或者把nginx和php做成一台)
跟单机lnmp的区别在于:
1,php的编译如果用下面的参数,那么编译没什么区别,远程一样可以让php支持mysql
--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd

2,在安装论坛时,mysql授权时要写php的IP
# grant all on discuz.* to ‘discuzuser‘@‘PHP服务器IP‘ identified by ‘123‘;
# flush privileges;

3,在安装论坛的web页面,写mysql在哪里,要写mysql的IP加端口,而不是localhost

时间: 2024-11-03 21:57:55

LNMP架构服务的相关文章

(LNMP架构) 服务搭建实例

LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构.  Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统.代表版本有:debian.centos.ubuntu.fedora.gentoo等.[1]  Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器.[2]  Mysql是一个小型关系型数据库管理系统.[3]  Php是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本

LNMP架构应用实战——Nginx服务配置文件介绍

LNMP架构应用实战--Nginx服务配置文件介绍 nginx的配置文件比较简单,但功能相当强大,可以自由灵活的进行相关配置,因此,还是了解下其配置文件的一此信息 1.Nginx服务目录结构介绍 安装完成后,在安装路径下就会有Nginx目录信息 [[email protected] application]# tree nginx nginx +-- client_body_temp +-- conf          #nginx服务配置文件目录 |   +-- fastcgi.conf  

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

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

linux运维、架构之路-Lnmp架构部署

一.Lnmp架构原理 二. Lnmp架构软件安装 1.Nginx安装脚本 #!/bin/bash useradd -s /sbin/nologin -M www mkdir -p /server/tools/ cd /server/tools/ wget http://nginx.org/download/nginx-1.10.3.tar.gz tar xf nginx-1.10.3.tar.gz yum install pcre-devel openssl-devel -y cd /home/

运维基本技能之--搭建LNMP架构

Nginx的介绍  Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为"engine X", 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP/FTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,它已经在该站点运行超过五年半了.Igor Sysoev在建立的项目时,使用基于BSD许可.自Nginx 发布以来,Nginx 已经因为它的稳定性.丰富的功能集.示例配置

LNMP架构应用实战——Nginx配置虚拟主机

LNMP架构应用实战--Nginx配置虚拟主机        前面介绍了nginx服务的安装与配置文件,今天介绍下它的另一种实用配置--"虚拟主机",每个虚拟主机可以是一个独立的网站,可以具有独立的域名,同一台服务器上的不同的虚拟主机之间是独立的,用户访问不同虚拟主机如同访问不同的服务器一样,因此它不需要为一个单独的WEB站点提供单独一个nginx服务器和一个单独的nginx进程 1.nginx虚拟主机简单介绍 同apache服务一样,它也有三种不同的虚拟主机,基于域名的虚拟主机.基于

Lnmp架构之PHP

Lnmp架构搭建+创建Discuz论坛 PHP,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Preprocessor)的缩写.PHP 是一种 HTML 内嵌式的语言,PHP与微软的ASP颇有几分相似,都是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,现在被很多的网站编程人员广泛的运用. PHP 独特的语法混合了C.Java.Perl 以及 PHP 自创新的语法.它可以比 CGI 或者 Perl 更快速的执行动态网页. LNMP的简介: L

【中级篇】Linux下部署LNMP架构及应用

部署LNMP架构及应用 1.          实验需求: 1)     搭建Nginx 2) 构建PHP运行环境 3) 搭建MySQL 数据库 2.          实验环境: Linux服务器系统版本:Red Hat Enterprise Linux 6.5  IP:192.168.10.30 WIN7系统客户机: IP: 192.168.10.1 3.      实验步骤: 基本安装操作: 1.搭建Nginx 配置: 这里要把光盘挂载到yum源里 再次执行配置的参数: 这时可能还会有报错

Lnmp架构部署动态网络环境

下面将接着上篇,继续介绍Lnmp架构部署动态网络环境 Lnmp 架构大致通过以下可以部署动态网站环境:Lnmp=linux/windows/unix +apache/nginx+mysql/pgsql/oracle+php/jsp/xml本章节将从 Linux 系统的软件安装方式讲起,带领读者分辨 RPM 软件包与源码安装的区别.并能够理解它们的优缺点.Nginx 是一款相当优秀的用于部署动态网站的服务程序,Nginx 具有不错的稳定性.丰富的功能以及占用较少的系统资源等独特特性.通过部署 Li