一.LNMP基本架构
1.L(linux)N(nginx)M(mysql)P(php)
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Mysql是一个小型关系型数据库管理系统。
PHP是一种在服务器端执行的嵌入HTML文档的脚本语言。
2.编译顺序
Mysql ->php ->nginx
由于编译的时候比较浪费磁盘内存,所以把虚拟机的内存尽量放大,使得编译的时候提升速度,我这里的虚拟机大小为2G
二.lnmp架构的优点
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率。
作为负载均衡服务器:Nginx 既可以在内部直接支持Rails和PHP,也可以支持作为 HTTP代理服务器对外进行服务。Nginx 用C编写,不论是系统资源开销还是CPU使用效率都比Perlbal要好的多。
作为邮件代理服务器:Nginx同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last/fm 描述了成功并且美妙的使用经验。
Nginx 安装非常的简单,配置文件非常简洁(还能够支持perl语法)。Nginx支持平滑加载新的配置,还能够在不间断服务的情况下进行软件版本的升级。
三.实现mysql,php,nginx的源码编译
1.mysql源码编译( 注意版本问题)
[root@server1 ~]# ls # 先获取软件包
cmake-2.8.12.2-4.el6.x86_64.rpm # cmake是编译器
mysql-boost-5.7.17.tar.gz
[root@server1 ~]# tar zxf mysql-boost-5.7.17.tar.gz
[root@server1 ~]# ls
cmake-2.8.12.2-4.el6.x86_64.rpm
mysql-5.7.17 mysql-boost-5.7.17.tar.gz
[root@server1 ~]# yum install -y cmake-2.8.12.2-4.el6.x86_64.rpm
[root@server1 ~]# yum install -y gcc gcc-c++ ncurses-devel bison
[root@server1 ~]# mkdir /usr/local/lnmp
[root@server1 ~]# cd mysql-5.7.17/
[root@server1 mysql-5.7.17]# 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/
[root@server1 mysql-5.7.17]# rm -fr CMakeCache.txt # 在编译过程中如果解决依赖性,再重新编译时,需要清除缓存
[root@server1 mysql-5.7.17]# make && make install
[root@server1 mysql-5.7.17]# cd /usr/local/lnmp/mysql/
[root@server1 mysql]# ls
bin COPYING docs include lib man mysql-test README share support-files
[root@server1 mysql]# cd support-files/
[root@server1 support-files]# cp my-default.cnf /etc/my.cnf
cp: overwrite `/etc/my.cnf'? Y
[root@server1 support-files]# vim /etc/my.cnf
basedir =/usr/local/lnmp/mysql
datadir =/usr/local/lnmp/mysql/data
port =3306
# server_id = .....
socket =/usr/local/lnmp/mysql/data/mysql.sock
[root@server1 support-files]# cp mysql.server /etc/init.d/mysqld
[root@server1 mysql]# cd /etc/init.d/
[root@server1 init.d]# chmod +x mysqld
[root@server1 init.d]# cd /usr/local/lnmp/mysql
#在真机中可以看到mysql的默认uid和gid都是27
[root@server1 mysql]# groupadd -g 27 mysql
[root@server1 mysql]# useradd -u 27 -g 27 -M -d /usr/local/lnmp/mysql/data -s /sbin/nologin mysql # 添加mysql用户,-u,指定用户uid,-g,指定用户组,-d,指定用户家目录,-M,禁止自主创建用户家目录
[root@server1 mysql]# pwd
/usr/local/lnmp/mysql
[root@server1 mysql]# chown -R mysql.mysql /usr/local/lnmp/mysql # 修改用户名和组名
[root@server1 mysql]# vim ~/.bash_profile # 设置环境变量,方便登陆
10 PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin
[root@server1 mysql]# source /root/.bash_profile # 检测语法
[root@server1 mysql]# mysql # 输入mysql,然后按tab键,可以加载出来,说明,文件已经生效
[root@server1 mysql]# mysqld --initialize --user=mysql # 初始化,生成临时登陆密码
[root@server1 mysql]# chown root.mysql /usr/local/lnmp/mysql -R
[root@server1 mysql]# chown mysql /usr/local/lnmp/mysql/data -R
[root@server1 mysql]# ll
[root@server1 mysql]# /etc/init.d/mysqld start
[root@server1 mysql]# mysql_secure_installation #初始化环境,设置密码
[root@server1 mysql]# mysql -uroot -p # 登陆成功说明mysql搭建成功
Enter password:
2.源码编译php
# 此安装包自行获取
[root@server1 ~]# ls
libmcrypt-2.5.8-9.el6.x86_64.rpm
libmcrypt-devel-2.5.8-9.el6.x86_64.rpm
php-5.6.35.tar.bz2
[root@server1 ~]# tar jxf php-5.6.35.tar.bz2
[root@server1 ~]# yum install re2c-0.13.5-1.el6.x86_64.rpm libmcrypt-2.5.8-9.el6.x86_64.rpm libmcrypt-devel-2.5.8-9.el6.x86_64.rpm gd-devel-2.0.35-11.el6.x86_64.rpm -y
# 下载php的依赖性安装包
[root@server1 ~]# yum install gmp-devel zlib-devel libxml2-devel curl-devel net-snmp-devel -y
[root@server1 ~]# cd php-5.6.35
# 开始进行源码编译,选择自己需要的模块进行编译
[root@server1 php-5.6.35]# ./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 \
--without-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
# 这些都是编译过程中需要的安装包
[root@server1 php-5.6.35]# yum install -y libxml2-devel-2.7.6-14.el6.x86_64
[root@server1 php-5.6.35]# yum install -y openssl-devel
[root@server1 php-5.6.35]# yum install -y libcurl-devel
[root@server1 php-5.6.35]# yum install -y libjpeg-turbo-devel-1.2.1-1.el6.x86_64
[root@server1 php-5.6.35]# yum install -y 2:libpng-devel-1.2.49-1.el6_2.x86_64
[root@server1 php-5.6.35]# yum install -y freetype-devel-2.3.11-14.el6_3.1.x86_64
[root@server1 php-5.6.35]# yum install -y gmp-devel-4.3.1-7.el6_2.2.x86_64
[root@server1 php-5.6.35]# yum install -y 1:net-snmp-devel-5.5-49.el6.x86_64
[root@server1 ~]#./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
--without-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 # 再次重新编译
[root@server1 php-5.6.35]# make && make install
[root@server1 php-5.6.35]# cd
[root@server1 ~]# cat /etc/passwd | grep nginx # 我们编译的时候,是以nginx用户和nginx组编译php的
[root@server1 ~]# id nginx #没有nginx用户,只有用户创建了才能起来服务
id: nginx: No such user
[root@server1 ~]# useradd nginx # 建立nginx用户
[root@server1 ~]# id nginx
uid=500(nginx) gid=500(nginx) groups=500(nginx)
[root@server1 ~]# cd /usr/local/lnmp/php/etc/
[root@server1 etc]# ls
php-fpm.conf.default php.ini
[root@server1 etc]# cp php-fpm.conf.default php-fpm.conf
[root@server1 etc]# vim php-fpm.conf # 这是php的主配置文件 ,注意,文件里不能写以#开头的注释
pid = run/php-fpm.pid # 打开pid,服务才能运行
[root@server1 etc]# cd /root/php-5.6.35
[root@server1 php-5.6.35]# cp php.ini-production /usr/local/lnmp/php/etc/php.ini
[root@server1 php-5.6.35]# cd sapi/fpm/
[root@server1 fpm]# cp init.d.php-fpm /etc/init.d/php-fpm
[root@server1 fpm]# ll /etc/init.d/php-fpm # 这是启动脚本
-rw-r--r-- 1 root root 2359 Feb 18 09:32 /etc/init.d/php-fpm
[root@server1 fpm]# chmod +x /etc/init.d/php-fpm # 给启动脚本添加可执行权限
[root@server1 fpm]# cd /usr/local/lnmp/php/etc/
[root@server1 etc]# lsp
hp-fpm.conf php-fpm.conf.default php.ini
[root@server1 etc]# vim php-fpm.conf
[root@server1 etc]# vim php.ini
936 date.timezone =Asia/Shanghai # 修改时区
[root@server1 etc]# /etc/init.d/php-fpm start # 开启服务
[root@server1 etc]# netstat -antlp
# 如果出现以下报错
[root@server1 fpm]# /etc/init.d/php-fpm start
Starting php-fpm [06-Aug-2018 02:08:50] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98)
[06-Aug-2018 02:08:50] ERROR: FPM initialization failed
Failed
解决方案:
<1>查看/usr/local/lnmp/php/etc/php-fpm.conf此配置文件是否有错误,注意,文件里不能写以#开头的注释
<2>[root@server5 etc]# netstat -lntup | grep php #查看php进程,有进程,就杀死进程
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 2490/php-fpm
<3>killall php-fpm #杀死进程
3.源码编译nginx
[root@server1 ~]# tar zxf nginx-1.14.0.tar.gz [
root@server1 ~]# cd nginx-1.14.0
[root@server1 nginx-1.14.0]# cd src/core/
[root@server1 core]# vim nginx.h1
4 #define NGINX_VER "nginx/"
[root@server1 core]# cd -
/root/nginx-1.14.0
[root@server1 nginx-1.14.0]# vim auto/cc/gcc # 关闭debug日志
171 # debug
172 #CFLAGS="$CFLAGS -g"
[root@server1 nginx-1.14.0]# ./configure --prefix=/usr/local/lnmp/nginx \
> --without-http_ssi_module \
> --with-http_stub_status_module \
> --user=nginx --group=nginx \
> --with-threads \
> --with-file-aio #根据报错下载相应的软件,解决依赖性
[root@server1 nginx-1.14.0]# yum install -y pcre-devel
[root@server1 nginx-1.14.0]# ./configure --prefix=/usr/local/lnmp/nginx --without-http_ssi_module --with-http_stub_status_module --user=nginx --group=nginx --with-threads --with-file-aio # 继续编译
[root@server1 nginx-1.14.0]# make && make install
[root@server1 nginx-1.14.0]# cd /usr/local/lnmp/nginx/
[root@server1 nginx]# ls
conf html logs sbin
[root@server1 nginx]# vim conf/nginx.conf
location / {
root html;
index index.php index.html index.htm; # 把index.php 设置为默认发布目录,如果不改可能会出现403的访问禁止报错
}
# 把php与nginx建立联系
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
[root@server1 nginx]# cd sbin/
[root@server1 sbin]# ls
nginx
[root@server1 sbin]# pwd
/usr/local/lnmp/nginx/sbin
[root@server1 sbin]# ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/sbin/
[root@server1 sbin]# nginx -t
[root@server1 sbin]# nginx # 开启nginx
[root@server1 sbin]# netstat -antlp | grep nginx
# 访问测试
[root@server1 sbin]# cd /usr/local/lnmp/nginx/html/
[root@server1 html]# vim index.php # 编写php界面
<?php
phpinfo()
?>
# 再次访问
四.论坛搭建(整合mysql,php,nginx)
[root@server1 ~]# ls
Discuz_X3.2_SC_UTF8.zip
[root@server1 ~]# yum install -y unzip # 没有这个命令,就要先下载
[root@server1 ~]# unzip Discuz_X3.2_SC_UTF8.zip -d /usr/local/lnmp/nginx/html/
[root@server1 ~]# cd /usr/local/lnmp/nginx/html/
[root@server1 html]# ls
50x.html index.html index.php readme upload utility
[root@server1 html]# mv upload/ bbs
# 浏览器访问
[root@server1 bbs]# chmod 777 config/ -R
[root@server1 bbs]# chmod 777 data/ -R
[root@server1 bbs]# chmod 777 uc_* -R
# 刷新网页
[root@server1 bbs]# cd /usr/local/lnmp/php/etc/
[root@server1 etc]# vim php.ini
1013 pdo_mysql.default_socket=/usr/local/lnmp/mysql/data/mysql.sock
1162 mysql.default_socket =/usr/local/lnmp/mysql/data/mysql.sock
1221 mysqli.default_socket = /usr/local/lnmp/mysql/data/mysql.sock
[root@server1 etc]# /etc/init.d/php-fpm reload
[root@server1 etc]# cd /usr/local/lnmp/mysql/
[root@server1 mysql]# chmod 755 data/
[root@server1 mysql]# /etc/init.d/mysqld restart
# 刷新网页
[root@server1 ~]# cd /usr/local/lnmp/nginx/html/bbs/install/
[root@server1 install]# ls
data images include index.php
[root@server1 install]# rm -fr index.php
[root@server1 install]# nginx -s reload
# 刷新网页
# 查看添加的用户
[root@server1 install]# mysql -uroot -p
Enter password:
mysql> show databases;
mysql> use discuz; # 进入数据库
mysql> select * from pre_ucenter_pm_members # 查看用户
注:以上操作必须在php服务开启的条件下才能操作
五.添加memcache缓存模块(给php增添缓存):
memcached 是什么?
memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric
为首开发的一款软件。现在已成为 mixi、hatena、Facebook、Vox、LiveJournal 等众多服务
中提高 Web 应用扩展性的重要因素。许多 Web 应用都将数据保存到 RDBMS 中,应用服务器从中
读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现 RDBMS 的负担加重、
数据库响应恶化、网站显示延迟等重大影响。这时就该 memcached 大显身手了。memcached 是
高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次
数,以提高动态 Web 应用的速度、提高可扩展性。
Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的
hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单
的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
[root@server1 ~]# ls # 先获取安装包
memcache-2.2.5.tgz
[root@server1 ~]# tar zxf memcache-2.2.5.tgz
[root@server1 ~]# vim /root/.bash_profile # 添加环境变量
10 PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/php/bin
[root@server1 ~]# source /root/.bash_profile # 刷新
[root@server1 ~]# cd memcache-2.2.5
[root@server1 memcache-2.2.5]# phpize # 初始化
[root@server1 memcache-2.2.5]# ls
[root@server1 memcache-2.2.5]# ./configure
[root@server1 memcache-2.2.5]# make && make install
[root@server1 memcache-2.2.5]# cd /usr/local/lnmp/php/etc/
[root@server1 etc]# ls
php-fpm.conf php-fpm.conf.default php.ini
[root@server1 etc]# vim php.ini # 给php添加扩展模块memcache
873 extension=memcache.so
[root@server1 etc]# /etc/init.d/php-fpm reload
[root@server1 etc]# php -m # 查看所有模块
[root@server1 etc]# yum install -y memcached
[root@server1 etc]# vim /etc/sysconfig/memcached
[root@server1 etc]# /etc/init.d/memcached start
[root@server1 etc]# netstat -antlp
[root@server1 etc]# yum install -y telnet # 如果没有这个命令,就下载
[root@server1 etc]# telinit localhost 11211 # 测试memcache
[root@server1 etc]# cd
[root@server1 ~]# cd memcache-2.2.5
[root@server1 memcache-2.2.5]# cp memcache.php example.php /usr/local/lnmp/nginx/html/
[root@server1 memcache-2.2.5]# cd /usr/local/lnmp/nginx/html/
[root@server1 html]# vim memcache.php
23 define('ADMIN_PASSWORD','westos'); // Admin Password # 修改密码
28 $MEMCACHE_SERVERS[] = '172.25.78.1:11211'; // add more as an array
29 #$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array # 注释掉这一行
# 浏览器查看
# 外压测试缓存效率
[root@foundation78 Desktop]# ab -c 10 -n 5000 http://172.25.78.1/index.php # 10各个并发,5000各请求,从服务器里请求
[root@foundation78 Desktop]# ab -c 10 -n 5000 http://172.25.78.1/example.php # 直接从memcache里请求
由此可见,用memcache进行缓存,效率比从服务器上要高而且没有失败请求
六.给nginx添加memcache缓存
[root@server1 ~]# ls # 获取软件包
openresty-1.13.6.1.tar.gz
[root@server1 ~]# nginx -s stop # 因为openresty里自带nginx
[root@server1 ~]# tar zxf openresty-1.13.6.1.tar.gz
[root@server1 ~]# cd openresty-1.13.6.1
[root@server1 openresty-1.13.6.1]# ./configure
[root@server1 openresty-1.13.6.1]# gmake && gmake install
[root@server1 openresty-1.13.6.1]# cd /usr/local/openresty/
[root@server1 openresty]# cd nginx/
# 这两个文件用来做外压测试
[root@server1 nginx]# cp /usr/local/lnmp/nginx/html/index.php /usr/local/openresty/nginx/html
[root@server1 nginx]# cp /usr/local/lnmp/nginx/html/example.php /usr/local/openresty/nginx/html
[root@server1 nginx]# cd conf/
[root@server1 conf]# vim nginx.conf
17 http {
18 upstream memcache{
19 server localhost:11211;
20 keepalive 512; # 最大保持512个不立即关闭的连接用于提升性能
21 }
54 location /memc {
55 internal; # 只接受内部访问,不接收外部http请求
56 memc_connect_timeout 100ms;
57 memc_send_timeout 100ms;
58 memc_read_timeout 100ms;
59 set $memc_key $query_string; # 使用Nginx内置的$query_string来作为key
60 set $memc_exptime 300; # 缓存失效时间
61 memc_pass memcache;
62 }
81 location ~ \.php$ {
82 set $key $uri$args;
83 srcache_fetch GET /memc $key;
84 srcache_store PUT /memc $key;
85 root html;
86 fastcgi_pass 127.0.0.1:9000;
87 fastcgi_index index.php;
88 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
89 include fastcgi.conf;
90 }
[root@server1 conf]# cd ../sbin/
[root@server1 sbin]# ./nginx -t # 检测语法
[root@server1 sbin]# ./nginx # 启动nginx
[root@server1 sbin]# netstat -antlp
# 浏览器访问测试(能访问到页面,说明脚本配置没有问题)
# 外压测试
[root@foundation78 Desktop]# ab -c 10 -n 5000 http://172.25.78.1/index.php
[root@foundation78 Desktop]# ab -c 10 -n 5000 http://172.25.78.1/example.php