linux+httpd+php-fpm+MySQL
成都创新互联长期为数千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为隆阳企业提供专业的成都网站建设、网站建设,隆阳网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。
rpm包的安装方式
环境:
系统: CentOS Linux release 7.1.1503 (Core)
yum源:epel,cdrom
主机:
httpd | 172.16.40.40 |
php-fpm | 172.16.40.41 |
mysql | 172.16.40.42 |
目的:
1、三台主机实现httpd、php和mysql服务。
2、httpd提供两个虚拟主机,一个虚拟主机提供phpMyAdmin,另一个虚拟主机提供wordpress。
3、为php安装xcache。
4、添加status页面(包含php的),并使用用户认证。
目录:
一、httpd
二、php
三、mysql
四、安装phpMyadmin和wordpress
五、添加status页面。
所有主机selinux,iptables关闭状态。
一、httpd.
[root@localhost ~]# yum install httpd -y [root@localhost ~]# mkdir -pv /web/vhosts/{blog,phpmyadm} [root@localhost ~]# mkdir -pv /var/log/httpd/{blog,phpmyadm} [root@localhost ~]# cd /etc/httpd [root@localhost httpd]# vim conf/httpd.conf #DocumentRoot "/var/www/html" #关闭中心主机 DirectoryIndex index.php index.html #修改默认文档查找次序
添加虚拟主机:
[root@localhost httpd]# vim conf.d/vhosts.confServerName www.star.com DocumentRoot /web/vhosts/blog CustomLog "/var/log/httpd/blog/access_log" combined ErrorLog "/var/log/httpd/blog/error_log" Options None Require all granted ServerName myadm.star.com DocumentRoot /web/vhosts/phpmyadm CustomLog "/var/log/httpd/phpmyadm/access_log" combined ErrorLog "/var/log/httpd/phpmyadm/error_log" Options None Require all granted
来两个网页文件测试下:
[root@localhost httpd]# vim /web/vhosts/phpmyadm/index.htmlmyadm.star.com
[root@localhost httpd]# vim /web/vhosts/blog/index.htmlwww.star.com
[root@localhost httpd]# systemctl restart httpd
测试没问题。
指定.php页面的处理方式。
[root@localhost httpd]# vim conf/httpd.conf AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps
修改vhosts.conf文件
ProxyRequests Off #关闭正向代理ServerName www.star.com DocumentRoot /web/vhosts/blog CustomLog "/var/log/httpd/blog/access_log" combined ErrorLog "/var/log/httpd/blog/error_log" ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.40.41:9000/web/php/blog/$1 #匹配页面代理至后端。 Options None Require all granted ServerName myadm.star.com DocumentRoot /web/vhosts/phpmyadm CustomLog "/var/log/httpd/phpmyadm/access_log" combined ErrorLog "/var/log/httpd/phpmyadm/error_log" ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.40.41:9000/web/php/phpmyadm/$1 Options None Require all granted
[root@localhost httpd]# systemctl reload httpd
注意上面传给php的路径不用与本地httpd的路径相同。只要在那个路径可以找到应该找到的php文件即可。
只要是php文件,都会转给php-fpm服务器。而其它静态资源都会由httpd来响应。所以这是两台相互独立的服务器(资源也是独立的)。 不过因为我们这里的应用也没必要再把资源切分开,所以就直接复制到php主机一份了。
只不过在httpd主机上只会拿这个应用中的静态资源。 在php上只会拿php资源。
二、php
[root@localhost ~]# yum install php-fpm php-mysql
[root@localhost ~]# rpm -ql php-fpm /etc/logrotate.d/php-fpm #日志滚动配置 /etc/php-fpm.conf #php-fpm主配置文件 /etc/php-fpm.d # /etc/php-fpm.d/www.conf #附加配置文件 /etc/sysconfig/php-fpm /run/php-fpm /usr/lib/systemd/system/php-fpm.service #unit文件(启动服务文件) /usr/lib/tmpfiles.d/php-fpm.conf /usr/sbin/php-fpm .....
/etc/php.ini是由php-common包带的。
php.ini是php解释器环境的配置,一般不用管。
php-fpm配置文件才是来管理php-fpm进程的。
修改/etc/php-fpm.d/www.conf
;listen = 127.0.0.1:9000 listen = 172.16.40.41:9000 #监听端口, 必须修改 ;listen.allowed_clients = 127.0.0.1 listen.allowed_clients = 172.16.40.40 #允许172.16.40.40主机fcgi连接。必须修改 user = apache #进程运行用户,默认。 group = apache pm = dynamic #动态生成子进程方式 pm.max_children = 50 #最大子进程 pm.start_servers = 5 #服务刚启动时生成几个子进程 pm.min_spare_servers = 5 #最少空闲子进程,进程空闲时会慢慢回收,这是最低要保留子进程数。 pm.max_spare_servers = 35 #最大空闲子进程。上限。 ;pm.max_requests = 500 #每个子进程最多响应多少个请求。超过请求,此子进程回收。 ;pm.status_path = /status #只要访问指定的路径,就返回状态信息。状态模块 ;ping.path = /ping #提供ping模块,用来远程检测php是否在线。访问指定的路径,返回ping.response指定的值。 ;ping.response = pong #与png.path成对出现。 php_admin_flag = on #php日志中与管理相关的标志是否打开。 php_value[session.save_handler] = files #session存储方式 php_value[session.save_path] = /var/lib/php/session #session存储路径
上面只有两个地址修改了,其它的都是默认值,看情况修改吧。
创建测试文件:
[root@localhost ~]# mkdir /web/php/{blog,phpmyadm} -pv [root@localhost ~]# vim /web/php/blog/index.phpwww.star.com
[root@localhost ~]# vim /web/php/phpmyadm/index.phpmyadm.star.com
启动php-fpm.
[root@localhost ~]# systemctl start php-fpm
访问http://myadm.star.com/index.php
另一个也正常。
xcache:
安装环境:
[root@localhost php]# yum install php-devel
xcache目录:
[root@localhost xcache-3.2.0]# phpize Configuring for: PHP Api Version: 20100412 Zend Module Api No: 20100525 Zend Extension Api No: 220100525 [root@localhost xcache-3.2.0]# ./configure --enable-xcache --with-php-config=/usr/bin/php-config [root@localhost xcache-3.2.0]# make [root@localhost xcache-3.2.0]# make install Installing shared extensions: /usr/lib64/php/modules/ [root@localhost xcache-3.2.0]# cp xcache.ini /etc/php.d/ [root@localhost xcache-3.2.0]# systemctl restart php-fpm
现来查看网页,我这里已现加载xcache了。也可以用php-fpm -m命令来查看php-fpm加载的所有模块。
[root@localhost xcache-3.2.0]# php-fpm -m ..... XCache XCache Cacher xml zip zlib [Zend Modules] XCache XCache Cacher
三、MySQL
安装:
[root@localhost ~]# yum install mariadb-server
授权wordpress(phpMyadmin不用授权):
MariaDB [(none)]> CREATE DATABASE wordpress; Query OK, 1 row affected (0.01 sec) MariaDB [(none)]> GRANT ALL ON wordpress.* TO 'wpuser'@'172.16.40.41' IDENTIFIED BY 'abcdefg'; Query OK, 0 rows affected (0.00 sec)
四、安装phpMyAdmin和wordpress.
httpd:
[root@localhost ~]# cp -rf phpMyAdmin-4.4.15.2-all-languages/* /web/vhosts/phpmyadm/ [root@localhost ~]# cp wordpress/* /web/vhosts/blog/ -rf
php-fpm:
[root@localhost ~]# rm -rf /web/php/phpmyadm/* [root@localhost ~]# rm -rf /web/php/blog/* [root@localhost ~]# cp -rf phpMyAdmin-4.4.15.2-all-languages/* /web/php/phpmyadm/ [root@localhost ~]# cp -rf wordpress/* /web/php/blog/
[root@localhost blog]# pwd /web/php/blog [root@localhost blog]# cp wp-config-sample.php wp-config.php [root@localhost blog]# vim wp-config.php
phpMyadmin:
[root@localhost blog]# cd ../phpmyadm/ [root@localhost phpmyadm]# cp config.sample.inc.php config.inc.php [root@localhost phpmyadm]# openssl rand -base64 15 #生成随机码 EumYt+cNhpOquCvJ1mRN [root@localhost phpmyadm]# vim config.inc.php
填上随机码,和目标数据库。
访问:www.star.com/
访问:http://myadm.star.com/
php主机安装php-string:
[root@localhost phpmyadm]# yum install php-mbstring
重新加载php配置文件:
[root@localhost phpmyadm]# systemctl reload php-fpm
不能保存session会话。查看一下运行php-fpm的用户。
[root@localhost phpmyadm]# ps aux | grep php-fpm
查看配置文件中所指定的session保存位置,用户是否有写入权限。
php_value[session.save_handler] = files php_value[session.save_path] = /var/lib/php/session
查看一下所指向的文件:
[root@localhost ~]# ll /var/lib/php total 0
没有session目录,创建目录,并给于运行php-fpm用户写入权限。
[root@localhost ~]# mkdir /var/lib/php/session [root@localhost ~]# chown -R apache /var/lib/php/session/
对了,我们这里还没有创建用于远程登录的root用户。先试一下用wpuser用户吧。
创建用户要创建基于php主机IP登录的。因为是php程序发起的连接,而不是我们。
五、添加status页面。
1、确认模块是否加载。
[root@localhost httpd]# pwd /etc/httpd [root@localhost httpd]# vim conf.modules.d/00-base.conf LoadModule status_module modules/mod_status.so [root@localhost conf.d]# httpd -M #查看当前加载的动态模块。
status模块,会显示httpd整体的状态,无论是把指令写在虚拟主机里面还是外面,只要触发就会显示整体服务的状态。
所以可以建立个新的配置文件,也可以写到虚拟主机的里面,只是写虚拟主机里面的话只有访问对应的主机名才能返回状态页。
[root@localhost httpd]# vim conf.d/status.confSetHandler server-status Require all granted
[root@localhost httpd]# systemctl reload httpd
我这里用IP地址访问的,用主机名也是一样,它现在是公共配置。
但是现在的配置所有人都可以查看,而且用IP控制也不保险。那么就可以用用户名控制了。
首先创建用户和密码文件。
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;
-m:md5格式加密
-s: sha格式加密
-D:删除指定用户
我这里就在/etc/httpd/conf下面创建了。
[root@localhost conf]# htpasswd -c -m .htpasswd star New password: Re-type new password: Adding password for user star [root@localhost conf]# htpasswd -m .htpasswd tom New password: Re-type new password: Adding password for user tom
只有第一次创建文件要用到-c。
[root@localhost conf]# cat .htpasswd star:$apr1$vq6uL8/A$c7agaUbQOoBd9Lkj8xrCW. tom:$apr1$Iawy2r6d$wonFrBM4yIEgBPUwY0ktU/ jerry:$apr1$vdpkCLQV$HSJShQU0yvjna75T8hXqK/ [root@localhost conf]#
如果用户有很多还可以有组文件。手动创建就可以。文件中一行一组。
格式:
group: user1 user2
group2: user1 user 2
[root@localhost conf]# vim .htgroup mygrp: star tom grp: jerry zhangsan
修改配置文件:conf.d/status.conf
SetHandler server-status AuthType Basic AuthName "Enter your Access" AuthUserFile "conf/.htpasswd" AuthGroupFile "conf/.htgroup" Require Group mygrp
重载服务。 再来看看。这次访问www.star.com
jerry用户在grp组里,不能登录。 只有star和tom可以登录。
如果想再加上IP控制的话,就要用上访问控制的容器了。
只要指令有两条,都要放到容器里(包括两个IP的或一IP一用户的)
这样就只有IP是允许的情况下才可以到用户名的部分,
如果ip是拒绝的,根本就不会到用户名的部分。
这里不管是用户还是IP都是认证。是统一的。所以就算是在上级目录里是IP是拒绝的。
在当前的级别只要用户名可以通过也是可以访问的。
只有真和假的两种情况,不管是哪种认证。
而RequireAll这种容器就是为了把里面的多种或多个认证综合成一个真或假。
注意:一定要加容器,这样它们都会判断,而不会发生IP通过,就不判断用户的情况了。
还是刚才的配置文件。
#不加~只能是根目录/status。加上~会来匹配,路径不是根目录也没关系。 SetHandler server-status AuthType Basic #验证类型,也可以用digest,不过浏览器并不通用。 AuthName "Enter your Access" #提示给客户端的信息。 AuthUserFile "conf/.htpasswd" #存储用户名的文件 AuthGroupFile "conf/.htgroup" #存储组的文件 Require group mygrp #允许的组 Require ip 172.16.40.2 #ip控制,只允许172.16.40.2
如果不用组的话,可以不写AuthGroupFile,把Requre group 改为Require user即可。Require valid-user表示文件中的所有用户。
我这开网页的主机IP是172.16.40.1。现在打不开了。
改回只让我这台主机访问:
Require ip 172.16.40.1
现在又出来让输入用户码的窗口了。但是这样我们的密码只是简单的md5加密传输的。
或是用抓包工具都可以抓到,就算破解不了,但cookie却是不加密的。
其实这里想告诉大家,在一些没有https的网站的表单中填入的密码和传输的信息其实都是明文传输的,连md5加密都没有。要注意密码安全。如我们上面登录phpMyadmin的时候。
我这里用tcpdump抓一下包看看。
star@sst-pp:~/desktop$ sudo tcpdump -X -nn dst host 172.16.40.40 and port 80 -w /tmp/myadm
用vim打开/tmp/myadm搜索user打一下。
还记得上面我们所输入的数据库的数据吗。如果是root用户,你懂的。所以用https是必须的。
上一篇已经写了,而且基本也都一样。而不在同一台主机的CA也只是远程复制一下文件而已。
php的status。
我们现在的httpd只有.php的页面会向后转发,其它页面是不会转发的,所以要把php上面的pm.status_path = /status 改一下。如果改成.php就直接可用了。而且因为我们上面httpd状态页是用~匹配status的,所以也会区配到那个Location里面,也要通过认证。
而sethandler那里,我觉得可能过程是:
1、sethandler指令,开始准备数据,生成html文件。
2、数据接着执行,到达虚拟主机那里,因为是.php的文件,所以转发到php主机上面。
3、php主机生成数据,html文件。 传给httpd。
4、httpd上面原来由sethandler生成的数据就被新的数据所覆盖了。
注意:没有写在虚拟主机里面的是公共部分,在数据到达虚拟主机之前都是会过一遍的。
遇到指令就操作一次。 就好像在有各种机关的房间里面经过一样,最终还要再进入不同的门。
而如果不想用.php这种方式,就要再添加个转发了。如我这里想用status-php,现在的status.conf文件。
SetHandler server-status ProxyPassMatch ^/status-php$ fcgi://172.16.40.11:9000 #添加一个转发。转发只能写在主服务器或虚拟主机里。AuthType Basic AuthName "Enter your Access" AuthUserFile "conf/.htpasswd" AuthGroupFile "conf/.htgroup" Require group mygrp Require ip 172.16.40.1 #加上用户认证。 AuthType Basic AuthName "Enter your Access" AuthUserFile "conf/.htpasswd" AuthGroupFile "conf/.htgroup" Require group grp Require ip 172.16.40.1
php里面改一下:
pm.status_path = /status-php
这里再贴一下CA的过程。
私有CA:
ca的配置文件:/etc/pki/tls/openssl.cnf 在lamp1中已经介绍了,这里就不多说了。
当前目录:/etc/pki/CA
[root@localhost CA]# (umask 077;openssl genrsa -out private/cakey.pem 4096) #生成CA的私钥: [root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem #生成自签证书,也做根证书,证书链 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:BEIJING Locality Name (eg, city) [Default City]:BEIJING Organization Name (eg, company) [Default Company Ltd]:LinuxOPS Organizational Unit Name (eg, section) []:Ops Common Name (eg, your name or your server's hostname) []:ca.star.com Email Address []: [root@localhost CA]# [root@localhost CA]# touch serial [root@localhost CA]# echo 00 > serial [root@localhost CA]# touch index.txt
HTTPD:
[root@localhost httpd]# pwd /etc/httpd [root@localhost httpd]# mkdir ssl [root@localhost httpd]# (umask 077;openssl genrsa -out ssl/myadm.key 2048) #生成私钥 Generating RSA private key, 2048 bit long modulus ..........................................................................................+++ ............................+++ e is 65537 (0x10001) [root@localhost httpd]# openssl req -new -key ssl/myadm.key -out /tmp/myadm.csr #生成证书申请 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:BEIJING Locality Name (eg, city) [Default City]:BEIJING Organization Name (eg, company) [Default Company Ltd]:LinuxOPS Organizational Unit Name (eg, section) []:Ops Common Name (eg, your name or your server's hostname) []:myadm.star.com Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
把证书申请发给CA。
[root@localhost httpd]# scp /tmp/myadm.csr 172.16.40.20:/tmp/ root@172.16.40.20's password: myadm.csr 100% 1009 1.0KB/s 00:00 [root@localhost httpd]#
如果没有scp命令,要安装openssh-clients包。两边都要有这个命令。
CA:
ca签署:
[root@localhost CA]# openssl ca -in /tmp/myadm.csr -out certs/myadm.crt Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 0 (0x0) Validity Not Before: Jan 26 09:38:33 2016 GMT Not After : Jan 25 09:38:33 2017 GMT Subject: countryName = CN stateOrProvinceName = BEIJING organizationName = LinuxOPS organizationalUnitName = Ops commonName = myadm.star.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 9D:FD:70:BD:97:BB:BB:E4:61:55:7B:6C:BA:B2:FD:B6:93:DC:8E:EC X509v3 Authority Key Identifier: keyid:AA:DA:31:1A:3F:5B:F3:D5:D2:0C:93:4E:37:78:9B:38:E6:C8:FB:26 Certificate is to be certified until Jan 25 09:38:33 2017 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated [root@localhost CA]#
把证书传回给HTTPD:
[root@localhost CA]# scp certs/myadm.crt 172.16.40.40:/etc/httpd/ssl/ The authenticity of host '172.16.40.40 (172.16.40.40)' can't be established. RSA key fingerprint is ec:8e:a7:90:97:03:2c:e4:78:d8:04:98:7d:9a:59:1c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '172.16.40.40' (RSA) to the list of known hosts. root@172.16.40.40's password: myadm.crt 100% 5714 5.6KB/s 00:00 [root@localhost CA]#