LNMP环境配置
LNMP+WordPress
3.12.1 LNMP 组成介绍 LNMP 代表的是 Linux 系统下 Nginx+MySQL+PHP 组成的动态网站系统解决方案。如
图 所示,Linux 是目前最流行的免费操作系统;Nginx 性能稳定、功能丰富、处理静 态文件速度快且消耗系统的资源极少;MySQL 是一个性能卓越、服务稳定、成本低、支持 多种操作系统,对流行的 PHP 语言无缝支持。这 4 种免费开源软件组合到一起,具有免费、 高效、扩展性强而且资源消耗低等优良特性。在此介绍Nginx、MySQL、PHP 各自的特点。

3.12.2 LNMP 工作原理
LNMP的工作原理如图
① 浏览器发送 http request 请求到服务器(Nginx),服务器响应并处理Web 请求,将
一些静态资源(CSS,图片,视频等)保存服务器上。
② 将PHP 脚本通过接口传输协议(网关协议)PHP-FCGI(fast-cgi)传输给PHP-FPM
(进程管理程序),PHP-FPM不做处理。然后 PHP-FPM调用 PHP 解析器进程,PHP 解析 器解析 PHP 脚本信息。PHP 解析器进程可以启动多个,进行并发执行。
③ 将解析后的脚本返回到 PHP-FPM,PHP-FPM再通过 fast-cgi 的形式将脚本信息传送
给Nginx。
④ 服务器再通过Http response 的形式传送给浏览器,浏览器再进行解析与渲染,最后
进行呈现。

安装 LNMP环境
登录 192.168.194.128 虚拟机,首先修改主机名,命令如下:

安装msyql
# cd /usr/local/src/
# tar zxvf mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz
# mv mysql-5.6.43-linux-glibc2.12-x86_64 /usr/local/mysql
# useradd -s /sbin/nologin mysql
# cd /usr/local/mysql/
# mkdir -p /data/mysql
# chown -R mysql:mysql /data/mysql/
#./scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ // # yum install perl-Module-Install
# cp support-files/my-default.cnf /etc/my.cnf
# cp support-files/mysql.server /etc/init.d/mysqld
# vi /etc/init.d/mysqld //datadir=/data/mysql
# chkconfig --add msyqld
# chkconfig mysqld on
# service mysqld start
# ps aux | grep mysqld //多行
安装php
# cd /usr/local/src/
# tar zxvf php-5.6.30.tar.gz
# useradd -s /sbin/nologin php-fpm
# cd php-5.6.30
# yum install libxml2-devel bzip2 bzip2-devel libpnglibpng-devel openssl openssl-devel freetype freetype-devel opel-release -y
# yum install -y epel-release
# yum install -y libmcrypt-devel
# yum install -y libcurl-devel
# yum -y install gcc
#./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --disable-ipv6 --with-pear --with-curl --with-openssl

# make

# make install
# cp php.ini-production /usr/local/php-fpm/etc/php.ini
# vi /usr/local/php-fpm/etc/php-fpm.conf //添加如下内容
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
listen.mode = 666 //如果缺少这一行 php-fcgi.sock 就会缺少写权限。
可以通过vi /etc/init.d/php-fpm 在start) 的fi 下一行加上 chmod 777 /tmp/php-cgi.sock来更改启动时的权限。
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

# /usr/local/php-fpm/sbin/php-fpm -t

启动php-fpm,命令如下:
# cp /usr/local/src/php-5.6.30/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
# chmod 755 /etc/init.d/php-fpm
# useradd -s /sbin/nologin php-fpm
# service php-fpm start
设置php-fpm开机启动的命令如下:
# chkconfig php-fpm on
检测php-fpm是否启动命令如下
# ps aux |grep php-fpm //大约二十多个进程
安装Nginx
# cd /usr/local/src/
# tar zxvf nginx-1.10.3.tar.gz
# cd nginx-1.10.3
# ./configure --prefix=/usr/local/nginx
# make && make install
# vi /etc/init.d/nginx
#!/bin/bash
# chkconfig: - 30 21
# description: http service.
# Source Function Library
. /etc/init.d/functions
# Nginx Settings
NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
RETVAL=0
prog="Nginx"
start()
{
echo -n $"Starting $prog: "
mkdir -p /dev/shm/nginx_temp
daemon $NGINX_SBIN -c $NGINX_CONF
RETVAL=$?
echo
return $RETVAL
}
stop()
{
echo -n $"Stopping $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -TERM
rm -rf /dev/shm/nginx_temp
RETVAL=$?
echo
return $RETVAL
}
reload()
{
echo -n $"Reloading $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -HUP
RETVAL=$?
echo
return $RETVAL
}
restart()
{
stop
start
}
configtest()
{
$NGINX_SBIN -c $NGINX_CONF -t
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
restart
;;
configtest)
configtest
;;
*)
echo $"Usage: $0 {start|stop|reload|restart|configtest}"
RETVAL=1
esac
exit $RETVAL
# chmod 755 /etc/init.d/nginx
# chkconfig --add nginx
# chkconfig nginx on
# > /usr/local/nginx/conf/nginx.conf
# vi /usr/local/nginx/conf/nginx.conf
user nobody nobody;
worker_processes 2;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 6000;
}
http
{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 3526;
server_names_hash_max_size 4096;
log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
'$host "$request_uri" $status'
'"$http_referer" "$http_user_agent"';
sendfile on;
tcp_nopush on;
keepalive_timeout 30;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 8 4k;
request_pool_size 4k;
output_buffers 4 32k;
postpone_output 1460;
client_max_body_size 10m;
client_body_buffer_size 256k;
client_body_temp_path /usr/local/nginx/client_body_temp;
proxy_temp_path /usr/local/nginx/proxy_temp;
fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
fastcgi_intercept_errors on;
tcp_nodelay on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 5;
gzip_http_version 1.1;
gzip_types text/plain application/x-javascript text/css text/htm application/xml;
server
{
listen 80;
server_name localhost;
index index.html index.htm index.php;
root /usr/local/nginx/html;
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
}
}
}
# /usr/local/nginx/sbin/nginx -t

# service nginx start
如果不能启动,请查看/usr/local/nginx/logs/error.log文件
检查Nginx是否启动,命令如下:
ps aux | grep nginx

# vi /usr/local/nginx/html/2.php


php解析成功。
配置虚拟主机
# vi /usr/local/nginx/conf/nginx.conf //在结束符号}上面加入一行配置
include vhost/*.conf;

# mkdir /usr/local/nginx/conf/vhost
# cd /usr/local/nginx/conf/vhost
# vi default.conf
server
{
listen 80 default_server;
server_name aaa.com;
index index.html index.htm index.php;
root /data/nginx/default;
}

# /usr/local/nginx/sbin/nginx -t

# /usr/local/nginx/sbin/nginx -s reload
# curl -x127.0.0.1:80 aaa.com

# curl -x127.0.0.1:80 1212.com

用户认证
# cd /usr/local/nginx/conf/vhost/
# vi ddsz.com.conf
server
{
listen 80;
server_name ddsz.com;
index index.html index.htm index.php;
root /data/nginx/ddsz.com;
location /
{
auth_basic "Auth";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
}
# yum install -y httpd
# htpasswd -c /usr/local/nginx/conf/htpasswd hx
/usr/local/nginx/sbin/nginx -t

# /usr/local/nginx/sbin/nginx -s reload

# mkdir /data/nginx/ddsz.com
# echo "ddsz.com"> /data/nginx/ddsz.com/indexl.html
[# curl -I -x127.0.0.1:80 ddsz.com

说明:状态码401说明,该网站需要验证。

(注意修改hosts文件 ddsz.com 192.168.XXX.XXX和关闭防火墙)
输入hx和密码(123456)就可以访问了。如果是针对某个目录做用户认证,需要修改location后面的路径:

域名重定向
[root@samba vhost]# vi test.com.conf
server
{
listen 80;
server_name test.com test1.com test2.com;
index index.html index.htm index.php;
root /data/nginx/test.com;
if ($host != 'test.com' ) {
rewrite ^/(.*)$ http://test.com/$1 permanent;
}
}
在Nginx配置中通过,server_name后面可以跟多个域名,permanent为永久重定向,相当于是http的R=301。另外还有一个常用的redirect,相当于httpd的R=302。测试过程如下:
# /usr/local/nginx/sbin/nginx -t

# /usr/local/nginx/sbin/nginx -s reload
# curl -x127.0.0.1:80 test1.com/123.txt -I

Nginx的访问日志
先来看看Nginx的日志格式:

和httpd类似,也是在主配置文件中定义的日志格式。Combined_realip为日志格式的名字,后面可以调用它; $remote_addr为访问网站的用户的出口IP; $http_ x_ forwarded_for为代理服务器的IP, 如果使用了代理,则会记录代理的IP; $time_local为当前的时间; $host为访问的主机名; $request_uri为访问的URL地址; $status为状态码; $http_referer 为referer地址; $http_user_agent为user_agent。
然后再到虚拟主机配置文件中指定访问日志的路径:
# vi test.com.conf
server
{
listen 80;
server_name test.com test1.com test2.com;
index index.html index.htm index.php;
root /data/nginx/test.com;
if ($host != 'test.com' ) {
rewrite ^/(.*)$ http://test.com/$1 permanent;
}
access_log /tmp/1.log combined_realip;
}
# /usr/local/nginx/sbin/nginx -t

# /usr/local/nginx/sbin/nginx -s reload
# curl -x127.0.0.1:80 test.com/111

# cat /tmp/1.log

Nginx的日志很简单,不像httpd还有自带的切割工具,想要切割Nginx日志需要借助系统的切割工具或者自定义脚本。在这里,提供一个Nginx的日志切割脚本
# vi /usr/local/sbin/nginx_log_rotate.sh
#! /bin/bash
## 假设nginx的日志存放路径为/tmp
d=`date -d "-1 day" +%Y%m%d`
logdir="/tmp"
nginx_pid="/usr/local/nginx/logs/nginx.pid"
cd $logdir
for log in `ls *.log`
do
mv $log $log-$d
done
/bin/kill -HUP `cat $nginx_pid`
保存退出后,我们可以使用sh -x 命令来查看这个脚本的执行过程:
sh -x /usr/local/sbin/nginx_log_rotate.sh

日志文件积累到一定数量了,我们可以使用以下命令来删旧的日志文件:
# find /tmp/ -name *.log.* -type f -mtime +30 |xargs rm //删除超过一个月的日志(这个也可以写在脚本里面)
写完脚本后,还需增加任务计划:
# crontab -e
0 0 * * * /bin/bash /usr/local/sbin/nginx_log_rotate.sh

配置静态文件不记录日志并添加过期时间
需求和httpd中的一样,但配置就简单多了,虚拟主机配置文件改写如下:
# vi /usr/local/nginx/conf/vhost/test.com.conf
server
{
listen 80;
server_name test.com test1.com test2.com;
index index.html index.htm index.php;
root /data/nginx/test.com;
if ($host != 'test.com' ) {
rewrite ^/(.*)$ http://test.com/$1 permanent;
}
location ~.*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 7d;
access_log off;
}
location ~.*\.(js|css|)$
{
expires 7d;
access_log off;
}
access_log /tmp/1.log combined_realip;
}

使用location~可以指定对应的静态文件,expires配置过期时间,而access_log配置为off就可以不记录访问日志了。下面来模拟一下:

# echo "111" > /data/nginx/test.com/1.js //创建js文件
# echo "222" > /data/nginx/test.com/2.jpg //创建jpg文件
# touch /data/nginx/test.com/1.jss //创建一个对比的文件
# curl -I -x127.0.0.1:80 test.com/1.js

# curl -I -x127.0.0.1:80 test.com/2.jpg

# curl -I -x127.0.0.1:80 test.com/1.jss

可以很清楚地看到Cache-control对应的时间大小,另外也可以看一下访问日志:
# cat /tmp/1.log //查看日志

访问了js以及jpg,但都没有记录到访问日志中,效果实现了。
Nginx防盗链
思路和httpd的一样,配置也不难,由于和过期时间、不记录日志又部分重合,可以把两部分组合在一起:
# vi test.com.conf
server
{
listen 80;
server_name test.com test1.com test2.com;
index index.html index.htm index.php;
root /data/nginx/test.com;
if ($host != 'test.com' ) {
rewrite ^/(.*)$ http://test.com/$1 permanent;
}
location ~.*\.(gif|jpg|jpeg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$
{
expires 7d;
valid_referers none blocked server_names *.test.com;
if ($invalid_referer){
return 403;
}
access_log off;
}
access_log /tmp/1.log combined_realip;
}

# /usr/local/nginx/sbin/nginx -t

# /usr/local/nginx/sbin/nginx -s reload
# curl -x127.0.0.1:80 -I -e"http://aaa.com/1.txt" test.com/2.jpg

# curl -x127.0.0.1:80 -I -e"http://test.com/1.txt" test.com/2.jpg

看到的不仅有过期日期,还有防盗链的功能。
访问控制
和httpd一样,Nginx与需要限制某些IP不能访问或者只允许某些IP访问。配置方法和httpd很想,但更加简洁了,而且不像httpd那样全部遍历一遍。比如,我们有个需求"使访问admin目录的请求只允许192.168.194.1和127.0.0.1访问,配置如下:
# vi pldd.com.conf
server
{
listen 80;
server_name pldd.com;
index index.html index.htm index.php;
root /data/nginx/pldd.com;
location /admin
{
allow 192.168.194.1;
allow 127.0.0.1;
deny all;
}
}

# mkdir -p /data/nginx/pldd.com/admin
# echo "123" > /data/nginx/pldd.com/admin/1.html
# curl -x127.0.0.1:80 pldd.com/admin/1.html

# curl -x192.168.194.128:80 pldd.com/admin/1.html

配置文件中的IP可以为IP段,比如可以写成allow 192.168.194.0/24。如果只拒绝几个IP,就可以写成这样:

如果是黑名单的形式,就不需要写allow all了,因为默认的就是允许所有。除了这种简单地限制目录外,也可以根据正则匹配来限制,如下:

小括号里面的竖线为分隔符,他们之间是"或者"的意思,这样就可以把访问的URL中带有abc或者image字符串,并且是PHP的请求拒绝访问。在上一章曾说过,要把可以上传文件的目录禁止解析PHP,目的是保证安全。在Nginx配置中,只需要这样几行就可以做到。
在Nginx配置里,也可以针对user_agent做一些限制,阿晓平时用得非常多。配置如下:

其中~为匹配符号,只要user_agent中含有Spider/3.0或者YoudaoBot或者Tomato字符串的,都会被拒绝,return为直接返回403的状态码,当然也可以把他替换为deny all。
Nginx解析PHP
在LAMP中,PHP是作为httpd的一个模块出现的,只要PHP模块被加载,那么就能解析PHP脚本了。而在LNMP中,PHP是以一个服务(php-fpm)的形式存在的,首先要启动php-fpm服务,然后再Nginx再和php-fpm通信。也就是说,处理php脚本解析的工作是由php-fpm来完成的,Nginx仅仅是一个"搬运工",它把用户的请求传递给php-fpm,php-fpm处理完后把结果传递给Nginx,Nginx再把结果返回给用户。那么Nginx是如何和PHP联系起来的呢?其实,上面的nginx.conf中已经有展示。下面是test.com.conf的内容,其中包含了php相关的配置:
server
{
listen 80;
server_name test.com test1.com test2.com;
index index.html index.htm index.php;
root /data/nginx/test.com;
if ($host != 'test.com' ) {
rewrite ^/(.*)$ http://test.com/$1 permanent;
}
location ~\.php$
{
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/nginx/test.com$fastcgi_script_name;
}
access_log /tmp/1.log combined_realip;
}
其中fastcgi_pass用来指定php-fpm的地址,如果php-fpm监听的是一个tcp:port的地址(比如127.0.0.9000),那么也需要在这里改成fastcgi_pass 127.0.0.1:9000。这个地址一定要和php-fpm服务监听的地址匹配,否则会报502错误。
还有一个地方也需要注意,factcgi_param SCRIPT_FILENAME后面跟的路径为该站点的根目录,和前面定义的root那个路径保持一致。如果这里配置不对,访问PHP页面会出现404。
Nginx代理

如果Nginx后面有很多太Web服务器,如果同时处理,那Nginx在这里就起到一个负载均衡的作用,这个功能在产生环境中用的也特别多。先来看一下Nginx的代理如何配置:
]# cd /usr/local/nginx/conf/vhost/
# vi proxy.conf
server
{
listen 80;
server_name www.baidu.com;
location /
{
proxy_pass http://110.242.68.4/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

前两行不用解释,和普通的虚拟主机一样,不同的是后面proxy相关的语句。Proxy_pass指定要代理的域名所在的服务器IP,这里的IP是百度一下所在服务器IP,可以ping www.baidu.com获取
到该IP。后面的三行为定义发往后端Web服务器的请求头,第二行必须有,否则代理不成功,它表示后端Web服务器的域名和当前配置文件中的server_name保持一致(即www.baidu.com),第三行和第四行可以省略,前面在讲述Nginx日志格式的时候介绍过这两个参数,表示的含义是一样的。配置文件保存后,重新加载Nginx服务并验证。
# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
# /usr/local/nginx/sbin/nginx -s reload
# curl -x127.0.0.1:80 www.baidu.com -I

# curl www.baidu.com -I

下面是负载均衡的示例,在编写Nginx虚拟主机配置文件之前,先来查看一下www.43999.com域名对应是IP,使用dig命令(yum install -y bind-utils)
# dig www.4399.com

这两个IP都可以访问www.4399.com,我们来验证一下。
# curl -x60.210.21.104:80 www.4399.com -I

# curl -x 112.240.60.42:80 www.4399.com -I

可以看到两个IP返回的结果一样,它使用的是Web Server软件为squid(一种代理软件)。有两个IP就可以走负载均衡了,配置过程如下:
#vi /usr/local/nginx/conf/vhost/load.conf
upstream 4399_com
{
ip_hash;
server 60.210.21.104;
server 112.240.60.42;
}
server
{
listen 80;
server_name www.4399.com;
location /
{
proxy_pass http://4399_com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
# /usr/local/nginx/sbin/nginx -s reload
# curl -x127.0.0.1:80 www.4399.com -I

Nginx配置SSL
2016年底苹果公司就开始要求各个企业的iOS APP必须使用HTTPS通信,原因很简单,就是保证安全。而目前Chrome、Firefox各大浏览器,也开始针对HTTPS做调整。你有没有发现,使用百度搜问题时,百度的网址前面是HTTPS,包括阿铭的猿课官网( www.apelearn.com)同样也支持了HTTPS访问。这说明HTTPS已经成为一趋势,阿铭相信过不了10年,整个互联网都会强制使用HTTPS通信,而废弃目前主流的HTTP。那到底什么是HTTPS呢?简单,它就是一种加密的HTTP协议,如果HTTP通信的数据包在传输过程中被截获,我们可以破译这些数据包里面的信息,这里面不乏一些用户名、密码、手机号等敏感的信息。而如果使用HTTPS通信,即使数据包被截获,我们也无法破译里面的内容。下图中是HTTPS的通信过程。

其通信过程大致如下。
(1)浏览器发送一个HTTPS请求给服务器。
(2)服务器要有一套数字证书,可以自己制作(后面的操作就是自己制作的证书),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。
组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申
请的证书则不会弹出提示页面,这套证书其实就是一公钥和私钥。
(3)服务器会把公钥传输给客户端。
(4)客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成
一串随机字符串,并用收到的公钥加密。
(5)客户端把加密后的随机字符串传输给服务器。
(6)服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机字符串后,再用这串随机字符串加密传输的数据(该加密为"对称加密";所谓对称加密,就是将数据和私钥,也就是这个随机字符串通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容)。
(7)服务器把加密后的数据传输给客户端。
(8)客户端收到数据后,再用自己的私钥(也就是那个随机字符串)解密。
通过上文简要分析,我们可以确定服务器上必须有-对公钥和私钥,也就是后文提到的SSL证书。如果是公司的网站对外提供服务,则需要购买被各大浏览器厂商认可的SSL证书。阿铭曾经在沃通购买过SSL证书,你可以做个参考。目前各大SSL证书服务商已经不再提供免费的SSL证书服务,所以做本实验的时候,阿铭只能在Linux机器上生成一对自定义的SSL证书,这个证书只能我们自己玩一玩,不能使用在生产环境中。具体配置过程如下:
# cd /usr/local/nginx/conf/
# openssl genrsa -des3 -out tmp.key 2048

//openssl命令如果没有,使用yum install -y openssl安装。这一步是生成key文件(通常陈给"私匙"),2048为加密字符串长度,会让我们输入一个密码,密码不能太短,否则不成功
# openssl rsa -in tmp.key -out hxlinux.key

//这一步是把刚刚生成的tmp.key再转换成hxlinux.key,目的是删除刚才设置的密码,如果key文件有密码,,则必须在Nginx加载它的时候输入它的密码,因此很不方便
# rm -f tmp.key
# openssl req -new -key hxlinux.key -out hxlinux.csr

//这一步是生成帧数请求文件,这个并不是上文提到的公匙,但这个文件是必须要有的,我们拿key文件和这个CSR文件一起生成最后的公匙文件。其中Common Name为后面配置Nginx配置文件的server_name
# openssl x509 -req -days 365 -in hxlinux.csr -signkey hxlinux.key -out hxlinux.crt

//说明:这样最终才生成hxlinux.key和hxlinux.crt两个文件。其实购买的SSL证书主要是得到这两个文件,有了这两个文件就可以配置Nginx了。配置过程如下:
]# vi /usr/local/nginx/conf/vhost/ssl.conf
server
{
listen 443;
server_name hanxiao.com
index index.html index.php;
root /data/nginx/hanxiao.com;
ssl on;
ssl_certificate hxlinux.crt;
ssl_certificate_key hxlinux.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location ~\.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/nginx/hanxiao.com$fastcgi_script_name;
}
access_log /tmp/1.log combined_realip;
}

保存配置文件后检查发现问题:
# /usr/local/nginx/sbin/nginx -t

这说明,当前Nginx并不支持SSL,这是因为在先前的Nginx编译时,并没有额外配置支持SSL的参数,要解决该问题只能重新编译一遍Nginx。操作过程如下:
# cd /usr/local/src/nginx-1.10.3
# ./configure --prefix=/usr/local/nginx/ --with-http_ssl_module
# make && make install
编译完成后再检验一次:
# /usr/local/nginx/sbin/nginx -t

发现没有问题了,然后创建对应的目录和测试文件:
# mkdir /data/nginx/hanxiao.com
# echo "<?php phpinfo();?>" > /data/nginx/hanxiao.com/1.php
# /etc/init.d/nginx restart

这是因为该证书为我们自己制作的,并没有得到浏览器的认可,如果想继续访问,可以点"高级",然后点"添加例外",在弹出的对话框点击" 确认安全例外",然后就可以访问网站内容了。此时,你还可以看到浏览器的地址栏左侧有-个灰色的小锁,并且带有黄色三角形,这意味着该链接不安全。你也可以去访问一下国内最受欢迎的网站(比如ttps://www.12306.cn),同样也会提示不安全,这是因为该站点的SSL证书是它自己颁发的,因而不能被浏览器承认。
php-fpm配置
和LAMP不同的是,在LNMP架构中,php-fpm作为一个独立服务存在。既然是独立服务,那么它必然有自己的配置文件。php的配置文件作为/usr/local/php-fpm/etc/php-fpm.conf,它同样也支持include语句,类似于nginx.conf里面的include。
php-fpm的pool
Nginx可以配置多个虚拟主机,php-fpm同样也支持配置多个pool,每一个pool可以监听一个端口,也可以监听一个socket,这个概念在前面的章节有所阐述。下面把php-fpm.conf做一个更改内容如下:
# cd /usr/local/php-fpm/etc/
# vi php-fpm.conf
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
include = etc/php-fpm.d/*.conf
[www]
listen = /tmp/php-fcgi.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

# mkdir /usr/local/php-fpm/etc/php-fpm.d
# cd /usr/local/php-fpm/etc/php-fpm.d
# vi www.conf
[www]
listen = /tmp/www.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

# vi hx.conf
[hx]
listen = /tmp/hx.sock
listen.mode=666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

# /usr/local/php-fpm/sbin/php-fpm -t

# /etc/init.d/php-fpm restart //重启php-fpm服务

再来查看/tmp/目录下的sock文件:

php-fpm的慢执行日志
通过php-fpm的慢执行日志,我们可以非常清晰地了解到PHP的脚本哪里执行时间长,他可以定位到具体的行。如何开启和查看php-fpm的慢执行日志,操作步骤如下:
# vi /usr/local/php-fpm/etc/php-fpm.d/www.conf //在最后面加入
request_slowlog_timeout = 1
slowlog = /usr/local/php-fpm/var/log/www-slow.log

第一行定义超时时间,既PHP的脚本执行时间只要超过1秒就会记录日志,第二行定义慢执行日志的路径和名字。以后,遇到PHP网站访问卡顿的问题是,要记得去查看这个慢执行日志,一定会有帮助。
php-fpm定义open_basedir
在十四章讲述过open_basedir的概念,它的目的是安全。httpd可以针对每个虚拟主机设置一个open_basedir,php-fpm同样也可以针对不同pool设置不同的open_basedir。
# vi /usr/local/php-fpm/etc/php-fpm.d/hx.conf //在后面加入
php_admin_value[open_basedir]=/data/www/:/tmp/

只要在对应的Nginx虚拟主机配置文件中调用对应的pool,就可以使用open_basedir来物理个理多个站点了,从而达到安全目的。
php-fpm进程管理
来看这一段配置
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
第一行,定义php-fpm的子进程启动模式,dynamic为动态模式; 一开始只启动少量的子进程,根据实际需求,动态地增加或者减少子进程,最多不会超过pm. max_children定 义的数值。另外-一种模式为static,这种模式下子进程数量由pm.max_children决定,一次性启动这么多,不会减少也不会增加。
pm.start_servers针对dynamic模式,它定义php-fpm服务在启动服务时产生的子进程数量。pm.min_ spare_ servers针对dynamic模式,它定义在空闲时段子进程数的最少数量,如果达到这个数值时,php- fpm服务会自动派生新的子进程。pm.max_spare_servers也是针对dynamic模式的, 它定义在空闲时段子进程数的最大值,如果高于这个数值就开始清理空闲的子进程。pm.max_requests针对dynamic模式,它定义一个子进程最多处理的请求数,也就是说在一个php- fpm的子进程中最多可以处理这么多请求,当达到这个数值时,它会自动退出。

浙公网安备 33010602011771号