LNMP结构里php会启动一个服务:php-fpm,而LANP中php只是作为Apache的一个模块存在。Nginx会把用户的动态请求交给php服务去处理,这个php服务就会去和数据库进行交互。用户的静态请求Nginx会直接处理,Nginx处理静态请求的速度要比apache快很多性能上要好,所以apache和Nginx在动态请求处理上区别不大,但如果是静态请求处理的话就会明显发现Nginx要快于apache,而且Nginx能承受的并发量要比apache大,可以承受好几万的并发量,所以大一些的网站都会使用Nginx作为web服务器。
1.实验环境
redhat6.5
iptables和selinux关闭
准备条件:虚拟机vm
2.简介:
LNMP就是Linux+Nginx+MySQL+PHP
Nginx会把用户的动态请求交给php服务去处理,这个php服务就会去和数据库进行交互。用户的静态请求Nginx会直接处理。
3.nginx准备
tar zxf nginx-1.10.1.tar.gz
tar zxf
nginx-sticky-module-ng.tar.gz
cd nginx-1.10.1
注意:以下修改需要在编译安装Nginx之前进行,修改之后再编译。
vim src/core/nginx.h
#define NGINX_VERSION ##nginx的版本号
#define NGINX_VER "nginx" ##删除后面的内容,后面是nginx的名称。
vim auto/cc/gcc
# debug
# CFLAGS="$CFLAGS -g" ##注释debug内容
yum install pcre-devel -y
./configure
--prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module
--user=nginx --group=nginx --with-threads
--with-file-aio ##根据报错解决依赖性
make
make install
cd /usr/local/lnmp/nginx/conf/
vim nginx.conf
location / {
root html;
index index.php index.html index.htm;
##加入index.php会默认首先访问index.php
}
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
##这行注释掉,因为文件fastcgi.conf里面有
include fastcgi.conf;
}
cd /usr/local/lnmp/nginx/sbin/
pwd
/usr/local/lnmp/nginx/sbin
cd
vim .bash_profile
PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/nginx/sbin
source .bash_profile
cd /usr/local/lnmp/nginx/html/
vim index.php
<?php
phpinfo()
?>
nginx -t
nginx
4.mysql准备
tar zxf mysql-boost-5.7.23.tar.gz
yum install -y
cmake-2.8.12.2-4.el6.x86_64.rpm
cd mysql-5.7.23/
yum install gcc gcc-c++ -y
yum install ncurses-devel -y
yum install -y bison
cmake
-DCMAKE_INSTALL_PREFIX=/usr/local/lnmp/mysql
-DMYSQL_DATADIR=/usr/local/lnmp/mysql/data
-DMYSQL_UNIX_ADDR=/usr/local/lnmp/mysql/data/mysql.sock
-DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1
-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all
-DWITH_BOOST=boost/boost_1_59_0/
================================================================================================================================================
##cmake 时有报错,根据报错内容解决依赖性
rm -fr CMakeCache.txt
注意:每解决完一次错误,就应删除缓存 rm -fr CMakeCache.txt
================================================================================================================================================
make
make install
cd /usr/local/lnmp/mysql
rpm -qa | grep mysql
mysql-libs-5.7.23-1.el6.x86_64
cd support-files/
cp my-default.cnf /etc/my.cnf
cp: overwrite `/etc/my.cnf'? y
vim /etc/my.cnf
18 basedir = /usr/local/lnmp/mysql
19 datadir = /usr/local/lnmp/mysql/data
20 port = 3306
21 # server_id = .....
22 socket = /usr/local/lnmp/mysql/data/mysql.sock
file mysql.server ##这是个脚本文件
mysql.server: POSIX shell script text
executable
cp mysql.server /etc/init.d/mysql ##把它复制到linux默认脚本执行路径
cd ..
groupadd -g 27 mysql
useradd -u 27 -g 27 -M -d
/usr/local/lnmp/mysql/data -s /sbin/nologin mysql
cd
vim .bash_profile //mysql添加到环境变量
10
PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin
source .bash_profile //生效,刷新环境变量
cd /usr/local/lnmp/mysql
chown mysql.mysql -R .
mysqld --initialize --user=mysql //以mysql用户身份初始化,会生成一个初始密码
chown root.root -R . //为了安全将mysql目录的所有者改为root
chown mysql data/ -R
/etc/init.d/mysqld start
Starting MySQL.. SUCCESS!
mysql_secure_installation
mysql -p
================================================================================================================================================
过程中出现的问题:
1.mysql服务起不来
[root@vm1 mysql]# /etc/init.d/mysqld start
Starting MySQL.. ERROR! The server quit without updating PID file
(/usr/local/lnmp/mysql/data/vm1.pid).
解决方法:
将mysql下的data文件全部删除,然后重新初始化 mysqld --initialize --user=mysql
如果初始化之后,进程还是起不来的话,就killall -9 mysqld 杀掉所有数据库的进程,重启一下服务
如果还是起不来的话,那就可能是因为权限的问题了,修改权限
================================================================================================================================================
5.php的源码安装及配置
tar jxf php-5.6.35.tar.bz2
##需要下载的安装包:
yum install -y libxml2-devel
openssl-devel curl-devel gd-devel-2.0.35-11.el6.x86_64.rpm gmp-devel
libmcrypt-2.5.8-9.el6.x86_64.rpm libmcrypt-devel-2.5.8-9.el6.x86_64.rpm
net-snmp-devel ##后面会出现的问题
================================================================================================================================================
安装过程中会出现一系列error:
原因是:因为源文件编译的时候,添加了一些模块,但是模块的没有相应的软件支持,所以源文件编译会报错,所以需要下载相应的软件
一些软件下载可以直接后面跟
-devel 下载,比如:libxml2-devel openssl-devel
curl-devel
还有一些关于 .h 的文件,如果不知道是什么提供了这些文件的话,可以通过 yum search 文件名.h 查找,如果查找不到的话,还可以用 yum provides */文件名 进行查找
================================================================================================================================================
rpm -ivh
re2c-0.13.5-1.el6.x86_64.rpm
cd php-5.6.35
yum install libxml2 libxml2-devel
-y
yum install curl curl-devel -y
yum install libjpeg-devel -y
yum install libpng-devel libpng
-y
yum install freetype-devel -y
yum install gmp-devel -y
yum -y install net-snmp-devel
./configure
--prefix=/usr/local/lnmp/php --with-config-file-path=/usr/local/lnmp/php/etc
--with-mysql=mysqlnd --enable-mysqlnd --with-mysqli=mysqlnd
--with-pdo-mysql=mysqlnd --with-openssl --with-snmp --with-gd --with-zlib
--with-curl --with-libxml-dir --with-png-dir --with-jpeg-dir
--with-freetype-dir --with-pear --with-gettext --with-gmp
--enable-inline-optimization --enable-soap --enable-ftp --enable-sockets
--enable-mbstring --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx
--with-mcrypt --with-mhash
6.php配置
cd /usr/local/lnmp/php/
ls
cd etc/
ls
cp php-fpm.conf.default
php-fpm.conf ##主配置文件
cd php-5.6.35
cp php.ini-production
/usr/local/lnmp/php/etc/php.ini
##php-fpm最先开启的文件
cd
cd /usr/local/lnmp/php/etc/
ls
vim php.ini
936 date.timezone =Asia/Shanhai
vim php-fpm.conf
25 pid = run/php-fpm.pid
26
27 ; Error log file
useradd -M -d /usr/local/lnmp/nginx -s
/sbin/nologin nginx
cd
cd php-5.6.35
cd sapi/fpm/
file init.d.php-fpm ##是个脚本文件 file 用来查看文件类型
cp init.d.php-fpm
/etc/init.d/php-fpm ##将脚本文件传到默认脚本路径
chmod +x /etc/init.d/php-fpm ##给可执行权限
/etc/init.d/php-fpm start ##开启进程管理器
================================================================================================================================================
(1)php-fpm 全名是PHP FastCGI进程管理器
php-fpm启动后会先读php.ini,然后再读相应的conf配置文件,conf配置可以覆盖php.ini的配置。
启动php-fpm之后,会创建一个master进程,监听9000端口(可配置),master进程又会根据fpm.conf/www.conf去创建若干子进程,子进程用于处理实际的业务。
(2)php-fpm全局配置说明
配置里面的所有相对路径,都是相对于php的安装路径。
除了有php-fpm.conf配置文件外,通常还有其他的*.conf配置文件(也可以不要,直接在php-fpm.conf配置)用于配置进程池,不同的进程池可以用不同的用户执行,监听不同的端口,处理不同的任务;多个进程池共用一个全局配置。
================================================================================================================================================
7.安装论坛
yum install -y unzip
125
unzip Discuz_X3.2_SC_UTF8.zip -d /usr/local/lnmp/nginx/html/
cd /usr/local/lnmp/nginx/html/
ls
cd upload/
mv upload/ bbs
bbs下文件目录权限不足,修改权限
chmod 777 config/ data/ uc_server/
uc_client/ -R
修改完之后:
如果没有开启数据库也是会报错的
开启数据库:
/etc/init.d/mysqld start
mysql -p
cd /usr/local/lnmp/php/etc/
ls
vim php.ini ##目录不存在,添加目录
/etc/init.d/php-fpm reload
cd /usr/local/
ll
cd lnmp/
ll
cd mysql/
ll
chmod 755 data/
ll
##如果不是下面的权限的=话,会出现数据库的permission
deny
srwxrwxrwx 1 mysql mysql 0 Aug
5 03:20 mysql.sock
8.php添加memcache缓存模块
================================================================================================================================================
添加缓存的原因:为了加快返回数据的速率
当客户端的访问发送给nginx的时候,nginx只处理静态的请求,将动态的请求,发送给后端的php来完成,这个时候访问的速率就不由nginx来决定了,而是由php处理访问请求的数据的速率来决定的,因此加入缓存,可以加快php的速率
================================================================================================================================================
tar zxf memcache-2.2.5.tgz
yum install memcached -y
vim /etc/sysconfig/memcached
CACHESIZE="64" ##可以修改memcache的缓存的内存空间大小
/etc/init.d/memcached start
netstat -antlp ##查看端口,监听本机的11211端口
tcp 0
0 :::11211 :::* LISTEN 901/memcached
cd memcache-2.2.5
cd /usr/local/lnmp/
ls
cd php/
cd bin/
pwd
/usr/local/lnmp/php/bin
vim .bash_profile
PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/nginx/sbin:/usr/local/lnmp/php/bin
source .bash_profile
php -m | grep memcache ##查看php下添加了那些关于memcahce的模块 刚开始的时候是没有添加的
php -m | grep mysql ##是含有mysql的模块的
mysql
mysqli
pdo_mysql
cd memcache-2.2.5
phpize
##注意:phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块,比如你想在原来编译好的php中加入memcached或者ImageMagick等扩展模块,可以使用phpize
./configure
make && make install
cd
/usr/local/lnmp/php/lib/php/extensions/no-debug-non-zts-20131226/
ls
memcache.so opcache.a
opcache.so ####生成的php和memcache关联的模块
cd /usr/local/lnmp/php/etc
vim php.ini ##在php里面加入memcache模块
extension=memcache.so
/etc/init.d/php-fpm reload
php -m | grep memcache
memcache ##给php添加memcache模块成功
cp example.php memcache.php
/usr/local/lnmp/nginx/html/ ##将测试页面添加到nginx的默认发布目录当中去 一个是测试页面,一个是缓存的页面 两个压测页面
cd /usr/local/lnmp/nginx/html/
vim memcache.php ##修改页面配置如下图
静态测试:
用户名和密码可以在之前修改的php配置文件里设定
9.nginx添加缓存
OpenResty是一个基于Nginx和Lua的高性能web平台
================================================================================================================================================
添加缓存的原因:为了加快返回数据的速率
当客户端的访问发送给nginx的时候,nginx只处理静态的请求,将动态的请求,发送给后端的php来完成,这个时候访问的速率就不由nginx来决定了,而是由php处理访问请求的数据的速率来决定的,因此加入缓存,可以加快php的速率。给nginx添加上缓存以后,返回的数据,会先保留一份在nginx的缓存上面,然后等到下一此=次客户端的访问请求传到nginx的时候,nginx会先在自己的缓存中查找,查找不到的话,再将访问请求发送给php处理
================================================================================================================================================
nginx -s stop
tar zxf
openresty-1.13.6.1.tar.gz
./configure --prefix=/opt/nginx
--with-http_ssl_module --with-http_stub_status_module --with-threads
--with-file-aio
gmake && gmake install
cd /opt/nginx/nginx/conf/
ls
vim nginx.conf ##配置文件和nginx的配置文件相同
cp
/usr/local/lnmp/nginx/conf/nginx.conf .
cp: overwrite `./nginx.conf'? y
/opt/nginx/nginx/sbin/nginx -t
/opt/nginx/nginx/sbin/nginx
cd ..
cd html/
ls
cp
/usr/local/lnmp/nginx/html/example.php .
cp
/usr/local/lnmp/nginx/html/index.php .
cd ..
cd conf/
vim nginx.conf
在http里面:
upstream
memcache {
server localhost:11211;
keepalive 512;
}
location
/memc {
internal;
memc_connect_timeout 100ms;
memc_send_timeout 100ms; ##延时
memc_read_timeout 100ms;
set $memc_key $query_string;
set $memc_exptime 300; ##300秒以后过期
memc_pass memcache;
##连接的是上面的upstream后的server
}
在location添加:
set
$key $uri$args; ##定义key
srcache_fetch GET /memc $key; ##get到返回
##没有get到接下来的动作
srcache_store
PUT /memc $key; ##返回200,缓存保留并返回
测试:
在真实主机上测试:
ab -c 10 -n 1000
http://172.25.11.1/example.php
ab -c 10 -n 1000
http://172.25.11.1/index.php