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

https://hanxiao.com/1.php

这是因为该证书为我们自己制作的,并没有得到浏览器的认可,如果想继续访问,可以点"高级",然后点"添加例外",在弹出的对话框点击" 确认安全例外",然后就可以访问网站内容了。此时,你还可以看到浏览器的地址栏左侧有-个灰色的小锁,并且带有黄色三角形,这意味着该链接不安全。你也可以去访问一下国内最受欢迎的网站(比如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的子进程中最多可以处理这么多请求,当达到这个数值时,它会自动退出。

posted @ 2020-12-08 10:49  必安  阅读(298)  评论(0)    收藏  举报