1.LNMP架构介绍
LNMP=Linux+Nginx+Mysqld+PHP
Nginx在处理静态文件时比Apache要快很多
2.MySQL安装
和之前在LAMP架构时安装的步骤是一样的
3-4. PHP安装
和LAMP不同,需要开启php-fpm服务
1)cd /usr/local/src
2)下载解压php源码包
3)cd php-5.6.38
4) ./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-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --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 --with-pear --with-curl --with-openssl
5)make && make install
6)ls /usr/local/php-fpm
sbin中有php-fpm用来启动php服务
var下有log和run两个目录,log是存放日志;run是存放PID的
/usr/local/php-fpm/sbin/php-fpm -m/-i, 可以用来查看PHP的详细信息
7)编辑配置文件
-
cp php.ini-production /usr/local/php-fpm/etc/php.ini
-
vi /usr/local/php/etc/php-fpm.conf
写入如下内容-https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/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 = 127.0.0.1:9000,因为PHP和Nginx一般在一台机器上,用内网通信即可
listen.mode = 666 ,用来定义监听的/tmp/php-fcgi.sock权限为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
-
拷贝源码包中的启动文件
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
-
chmod 755 /etc/init.d/php-fpm
-
useradd -s /sbin/nologin php-fpm
8)启动服务
chkconfig --add php-fpm
chkconfig php-fpm on
service php-fpm start
5.Nginx介绍
lua一种开发语言
http://jinnianshilongnian.iteye.com/blog/2280928
6.Nginx 安装
1)到官网下载stable version的Nginx
2)cd /usr/local/src
3)解压文件
tar -zvxf nginx-1.14.2.tar.gz
4)cd nginx-1.14.2
./configure --prefix=/usr/local/nginx
5)make && make install
conf-配置文件目录
html-样例文件
sbin-核心文件
logs-日志
6)vim /etc/init.d/nginx, 启动的配置文件,chmond 755 /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
7)chmod 755 /etc/init.d/nginx
8)chkconfig --add nginx
chkconfig nginx on
9)编辑nginx的配置文件
-
找到/usr/local/nginx/conf/nginx.conf文件
-
cp /usr/local/ngnix/conf/nginx.conf nginx.conf.bak
-
mv nginx.conf nginx.conf.bak
-
vim 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;
}
}
}
10)/etc/init.d/nginx start来启动服务
在服务启动之后我们用命令curl localhost 来测试nginx, 如果没有问题可以看到下面的页面
之所以有这个页面是因为我们在配置nginx.conf的时候配置了虚拟主机,并且配置了 root /usr/local/nginx/html
peizhi
我们再来做PHP解析的测试
vim /usr/local/nginx/html/1.php
<?php
echo "this is a nginx test.";
?>
然后curl localhost/1.php, 如果出现下图内容则没有问题
7.Nginx默认虚拟主机
我们除了在nginx.conf里面可以配置虚拟主机,也可以在/conf/vhost文件中配置
1)首先我们把/usr/local/nginx/conf/nginx.conf关于虚拟主机的配置内容删掉,同时加上 include vhost/*.conf
2)cd /usr/local/nginx/conf
mkdir vhost
cd vhost
vim aaa.com.conf
输入以下内容
server
{
listen 80 default_server; // 有这个标记的就是默认虚拟主机
server_name aaa.com;
index index.html index.htm index.php;
root /data/wwwroot/default;
}
3)mkdir /data/wwwroot/default
4)cd /data/wwwroot/default
vim index.html, 写入This is the default site.
5)/usr/local/nginx/sbin/nginx -t, 检查语法
如果没有问题,reload配置文件/usr/local/nginx/sbin/nginx -s reload; 也可以用/etc/init.d/nginx restart来重启服务
reload比restart有优势在于,如果配置文件有问题那么reload的话配置文件是不会生效的,但是restart的话可能会导致服务停止
重启之后再用curl localhost,做测试就可以发现index.html的内容变为我们之前编辑的“This is the default site.”
无论什么域名只要解析过来指向服务器都可以访问到虚拟主机,如下
注:有两种方式可以定义虚拟主机
-
在/usr/local/nginx/conf/vhost中使默认主机的配置文件排在第一位,例如000.com.conf
-
在配置文件中加入default_server作为默认主机标志
8.Nginx用户认证
1)cd /usr/local/nginx/conf/vhost
vim test.com.conf
输入如下内容
server
{
listen 80;
server_name test.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com;
location /
{
auth_basic "Auth"; 定义用户认证的名字
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
}
2)生成密码文件 yum install -y httpd
htpasswd -c /usr/local/nginx/conf/htpasswd 用户名,-c为创建密码文件/usr/local/nginx/conf/htpasswd,如果密码文件已经创建之后想要再加入用户及密码则不用在加-c参数
3)/usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload
重新加载后仍然用curl -x127.0.0.1:80 test.com做测试,发现如下图提示401,以为这验证设置成功
如果我们想要指定目录来做用户认证,例如我们不想整站做用户认证,只想在test.com/admin/页面访问的时候做认证,那么我们就可以在/vhost/test.com.conf的配置下面做如下改动
server
{
listen 80;
server_name test.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com;
location /admin/ , 在这个地方可以做匹配,例如如果想要针对admin.php URL做用户认证时则可以 写成 location ~ admin.php
{
auth_basic "Auth"; 定义用户认证的名字
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
}
然后mkdir /data/wwwroot/test.com/admin
/usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload
如下图我们再访问test.com时就无需认证而在访问test.com/admin时就需要认证
[root@emma_linux vhost]# curl -x127.0.0.1:80 test.com
[root@emma_linux vhost]# curl -x127.0.0.1:80 test.com/admin/
<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.14.2</center>
</body>
</html>
9.Nginx域名重定向
1)编辑配置文件/test.com.conf
server
{
listen 80;
server_name test.com test2.com test3.com; 此处与Apache不同可以跟多个域名
index index.html index.htm index.php;
root /data/wwwroot/test.com;
location /admin/
{
auth_basic "Auth";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
}
2)因为我们再server_name处加了test.com test2.com 和test3.com,我们需要定义我们的主域名,例如我们想要把test.com定义为主域名,就在配置文件中写入
if ($host != 'test.com' ) {
rewrite ^/(.*)$ http://test.com/$1 permanent (permanent-301,redirect-302);
3)/usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload
然后我们再用curl做实验,发现test2.com已经被301跳转到了test.com
10.Nginx 访问日志
1)访问日志的格式
我们可以在/usr/local/nginx/conf/nginx.conf中搜索log_format查看到log的格式如下
log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
' $host "$request_uri" $status'
' "$http_referer" "$http_user_agent"';
-
remote_addr
远程的ip地址,也就是客户端的ip
这里的ip指的是公网地址,详见https://blog.csdn.net/xinghuanmeiying/article/details/78056335
注:可以用百度来查看公网ip
-
httpx_x_forwarded_for
代理服务器ip
-
time_local
服务器本地时间
-
host
域名
-
request_uri
访问的url地址,例如test2.com/admin/weiojrgoergut, test2.com为host,后面的/admin/weiojrgoergut为uri
状态码,例如301,404,403,401等等
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
502 - gateway not found
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
-
http_refer
-
http_usr_agent
2)除了在主配置文件nginx.conf中配置log的格式,还需要在虚拟主机的配置文件中配置log的路径
编辑vim /usr/local/nginx/conf/vhost/test.com.conf,添加如下
access_log /tmp/test.com.log combined_realip
配置完成后我们
/usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload
注:在进行reload的时候,出现error message “nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"”
解决这个问题使用 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf,使用nginx -c的参数指定nginx.conf文件的位置
然后在-s reload就正常了
再用curl命令做实验,再用cat查看日志文件是否正常写入
11.Nginx日期切割
Nginx没有自带的日志切割的工具,需要借助于系统日志切割的工具或者自己写脚本
vim /usr/local/sbin/nginx_log_rotate.sh,写入如下内容
注:我们以后可以把shell脚本放入/usr/local/sbin这个目录下
#! /bin/bash
d=`date -d "-1 day" +%Y%m%d` ,日期为当前日期前一天的日期,且格式为年月日
logdir="/tmp/" 日志的存放路径
nginx_pid="/usr/local/nginx/logs/nginx.pid" ,这是为了可以执行最后/bin/kill -HUP `cat$nignx_pid`,这条命令相当于重新加载-s reload的命令
cd $logdir 跳转到日志目录下
for log in `ls *.log`
do
mv $log $log-$d
done
这里是一个for循环,for log in `ls *.log`, log为for循环中的变量,指找到ls *.log下log文件
do mv $log $log-$d 是指把log改名字为log-date (为上面定义的d=`date -d "-1 day" +%Y%m%d` )
最后done
/bin/kill -HUP `cat $nginx_pid` 重新加载生成新的日志文件,/bin/kill -HUP pid可以重启服务,重新加载了配置文件,所以可以重新生成在/usr/local/nginx/conf/vhost/test.com.conf下定义的日志文件
我们来执行以下这个脚本用# sh -x(-x选项可以看到脚本的执行情况),我们在cat日志文件所在的目录就发现,已经生成了两个日志文件了
这样就可以每天生成一个带日期的日志,我们可以做定期清理,列如只保留一个月以内的日志,find /tmp/ -type f -name *.log-* -mtime +30 |xargs rm,这样就可以了
在写好脚本之后,也可以做一个任务计划从每天的零点开始做日志切割
crontab -e
写入 - 0 0 * * * /bin/bash /usr/local/sbin/nginx_log_rotate.sh
12.静态文件不记录日志和过期时间
就是在访问nginx时的js/css时不记录日志和过期时间
编辑 /usr/local/nginx/conf/vhost/test.com.conf, 写入下面的内容
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ 匹配url里面的请求,小括号里的竖线表示或者的意思,\表示脱议,如果不脱议 . 就可以匹配任意的字符了
{
expires 7d; 配置图片/js/css在浏览器里的过期时间(也就是在浏览器里保存的时间,以免短时间之内再想服务器请求)
access_log off; 配置的目的为不去记录访问日志
}
location ~ .*\.(js|css)$
{
expires 12h;
access_log off;
}
/usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload
我们再来做实验,到/data/wwwroot/test.com下面随便编辑两个文件1.gif和2.js, 然后用curl访问 curl -x127.0.0.1:80 test.com/1.gif 和test.com/2.js 和test.com
再来cat /tmp/test.com.log发现只有一条test.com的访问记录
但是如果我们访问test.com/2.jsoalsgalsht, 则在日志文件中有访问记录,因为2.jsoalsgalsht不匹配之前在vhost/test.com.conf中的定义,如下图
我们再来看设置的expire时间,用curl -I 来查看具体信息,如下图
13.Nginx防盗链
编辑/usr/local/nginx/conf/vhost/test.com.conf, 写入下面内容
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$
~*表示后面的正则表达不区分大小写,^.+表示以任意字符开头的字符串,\脱议,.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$以点括号内容为结尾location ~* ^.+\.
{
expires 7d;
valid_referers none blocked server_names *.test.com ; 先定义白名单的refer(域名)是什么
if ($invalid_referer) {
return 403; 如果不是白名单的域名就返回403
}
access_log off;
}
检查语法在重新加载配置
我们用curl -e "refer" -x -I来测试防盗链,发现如下图从baidu.com/1.txt这个refer访问就返回403,但是用test.com就是200
14.Nginx访问控制
1)需求网站有些重要的内容不想让别人访问,那就可以做一个白名单,只允许一些ip访问
依然编辑/usr/local/nginx/conf/vhost/test.com.conf, 假设限制访问的目录为/admin/,可以写入如下内容
location /admin/
{
allow 192.168.224.128;
allow 127.0.0.1;
deny all;
}
注这里的allow和deny是不分顺序的,与apache不同,只要匹配到了一条就不会继续向下匹配其他的条件了,所以上面的限制就是只允许192.168.224.128和127.0.0.1访问test.com/admin,其他ip全部禁止访问
2)访问控制不仅可以针对目录,可以匹配正则
需求:禁止可以上传图片的目录解析php
location ~ .*(upload|image)/.*\.php$
{
deny all;
}
3)根据user_agent限制
需求:不想被搜索到,做一个隐藏的网站,禁掉user_agent的蜘蛛软件
if ($http_user_agent ~* 'Spider/3.0|YoudaoBot|Tomato')
{
return 403;
}
用curl -A (-A/--user-agent <string> 设置用户代理发送给服务器,即告诉服务器浏览器为什么)做实验,可以发现返回的都是403
注:deny all 和 return 403作用是一样的
15.Nginx解析php相关配置
到目前为止我们test.com还不能解析php
编辑/usr/local/nginx/conf/vhost/test.com.conf,写入如下内容
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
如果这个地方的sock文件地址写错,就会出现502 status, 这里的sock是在/usr/local/php-fpm/etc/php-fpm.conf下配置的socket文件,如下图
注:如果我们在php-fpm中配置的不是监听socket,而是监听127.0.0.1:9000端口
那么我们在配置nginx php解析时,就应该把fastcgi_pass unix:/tmp/php-fcgi.sock; 改成fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name; script后面跟的路径应该为test.com.conf中定义的root的文件路径
}
做实验,先编辑一个php文件,vim /data/wwwroot/test.com, 写入
<?php
phpinfo();
?>
然后curl -x127.0.0.1:80 test.com/3.php,如果没有问题就可以显示出解析的php信息的页面而不是<?php phpinfo(); ?>
在解析php的时候,除了上面所说的由于socket文件写错或者监听端口写错会出现502,还有一种情况是我们在配置php-fpm时使用socket文件但是没有把listen.mode权限写为666
在我们查看/tmp/php-fcgi.sock时,可以发现属主和属组都为root, 普通用户没用读取权限
但是我们在/usr/local/nginx/conf/nginx.conf中配置的user为nobody nobody,所以如果我们不把socket文件监听权限设置为666,就nobody就没有办法解析php
出现502,也有可能是因为php-fpm资源耗尽了,这时我们需要进行优化
总之,如果在解析的过程中出现问题,我们就应该查看错误日志(在nginx.conf中定义的路径/usr/local/nginx/logs/nginx_error.log),来分析问题,想出解决办法
16.Nginx代理
在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!
上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。转自https://blog.csdn.net/tsummerb/article/details/79248015
vim /usr/local/nginx/conf/vhost/proxy.conf, 写入下面内容
server
{
listen 80;
server_name ask.apelearn.com;
location /
{
proxy_pass http://47.104.7.242/; web服务器的ip
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
再用curl -x127.0.0.1 ask.apelearn.com/robots.txt
17.Nginx负载均衡
客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载量
请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则
所以~将服务器接收到的请求按照规则分发的过程,称为负载均衡。
负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作;更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制
nginx借助模块upstream来配置负载均衡
安装yum install -y bind-utils来使用dig命令,去查看域名的服务器ip
例如我们查看到qq.com的ip地址有三个如下
58.60.9.21;59.37.96.63;180.163.26.39
还是编辑配置文件vim /usr/local/nginx/conf/vhost/load.conf, 写入下面内容
upstream qq_com 这里的名字可以随便写
{
ip_hash; 目的同一个用户始终保持在一个服务器上
server 58.60.9.2:80;
server 59.37.96.63:80;
server 180.163.26.39;
}
server
{
listen 80;
server_name www.qq.com;
location /
{
proxy_pass http://qq_com; 这里需要和upstream后面的保持一致
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
注:nginx不支持代理443端口也就是https
18.ssl原理-https
https和http之间的区别
https对通信加密,即使通信过程中数据包被中途拦截也无法解密,数据包被加密
工作流程如下图
19.生产ssl密钥对
我们把公钥私钥(数字证书)放在/usr/local/nginx/conf下面
1 ) openssl genrsa -des3 -out tmp.key 2048 生成私钥
genras-是指要生成rsa格式的私钥
私钥文件名为 tmp.key
长度为2048
2)在生成私钥的过程中我们发现需要设置密码,在以后每次向服务器请求都需要密码很麻烦,所以我们需要转换key去掉密码,用下面的命令
openssl rsa -in tmp.key -out emma.key
3)因为在第二步已经又生成了emma.key内容和tmp.key一样,所以我们可以删掉tmp.key
rm -f tmp.key
4)生成请求文件,公钥的生成需要请求文件和私钥
openssl req -new -key emma.key -out emma.csr, 回车之后填写信息,输入密码
5)生成公钥文件
openssl x509 -req -days 365 -in emma.csr -signkey emma.key -out emma.crt
-days 365 证书日期为一年
emma.crt为公钥,emma.key为私钥
20.Nginx配置ssl
1)生成新的配置文件,并且编辑
vim /usr/local/nginx/conf/vhost/ssl.conf
写入下面内容
server
{
listen 443; 监听端口为443
server_name emma.com;
index index.html index.php;
root /data/wwwroot/emma.com;
ssl on; 开启ssl,支持https
ssl_certificate emma.crt; 指定公钥
ssl_certificate_key emma.key; 指定私钥
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 指定协议,三种最好都配置上
}
2)/usr/local/nginx/sbin/nginx -t发现有语法错误,无法识别ssl
这时因为在编译nginx的时候没有去指定ssl模块
所以我们需要重新编译,那么去指定那个模块就需要cd /usr/local/src/nginx-1.14.2, ./configure --help |grep -i ssl, 找到我们应该编译
--with-http_ssl_module
./configure --prefix=/usr/local/nginx --with-http_ssl_module
make && make install
然后我们在进行语法检测,reload配置文件,但是发现error message -nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid",解决办法/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
我们需要重启服务/etc/init.d/nginx restart, 这时可能会出现errormessage - Restarting nginx (via systemctl): Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details. 我们用kill pid杀掉nginx进程再用/etc/init.d/nginx restart就没有问题了
用netstat -nltp来查看监听端口,发现443端口已经被监听了
3)测试ssl是否配置成功
mkdir /data/wwwroot/emma.com
vim /data/wwwroot/emma.com/index.html, 创建测试文件,写入“this is ssl.”
这时就不需要用curl -x的方式来测试,直接编辑host文件,vi /etc/hosts文件写入127.0.0.1 emma.com
curl https://emma.com
因为我们的数字证书不是官方认证的所以会有不信任的error message
我们也可以在Windows的host上配置,右键单击开始,选择Windows powershell, 运行notepad c:\windows\system32\drivers\etc\hosts,编辑192.168.224.128 emma.com
然后再到浏览器上https://emma.com
可以看到如下,虽然数字证书不安全(因为不是官方颁发),但是能跳转出来我们之前设置的index.html的内容就表示成功了
如果想要正式的证书,可以到沃通买
12306.cn用的就是自己颁发的证书,所以https://www.12306.cn的时候也是显示证书错误
21.php-fpm的pool
pool对应一个nginx的站点,这样可以提高安全,如同站点切割
php-fpm.conf可以设置多个pool,如果只有一个pool,当PHP资源耗尽,会导致其他站点无法访问资源,报502错误。所以有必要设置多个pool把站点进行分离,分别使用单独的pool。
1)编辑php-fpm.conf
vim /usr/local/php-fpm/etc/php-fpm.conf
红色框里的为一个pool
如果想要增加pool,就可以再写入下面内容
[www2]这个名字可以随便写,但是不要和其他的pool重复就好
listen = /tmp/www2.sock 也是不要和其他pool重复
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 reload
2)如何应用php-fpm pool
在前面的笔记中我们把test.com配置文件中的php解析配置成了/tmp/php-fcgi.sock (也就是第一个pool)
我们还可以把其他的虚拟主机设置一下,例如默认虚拟主机aaa.com
编辑 vim /usr/local/nginx/conf/vhost/aaa.com, 添加下面的内容
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/www2.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;
}
3)跟nginx的配置文件里有include vhost/*.conf类似,php-fpm的配置文件中也可以把pool的配置拆分出来
vim /usr/local/php-fpm/etc/php-fpm.conf, 添加include = /etc/php-fpm.d/*.conf, 再把之前写入的pool内容删掉
mkdir /etc/php-fpm.d
vim www.conf, 写入之前对应的www pool的内容
vim www2.conf,写入之前对应的www2 pool的内容
检查语法,重新加载服务
22.php-fpm慢执行日志
php-fpm可以分析慢执行日志可以查找出网站访问速度慢的原因
我们用www.conf来做实验
1)vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
写入下面的内容
request_slowlog_timeout = 1 超过一秒钟就记录到日志中去
slowlog = /usr/local/php-fpm/var/log/www-slow.log
检查语法,重新加载文件
2)我们再来做测试来看慢执行日志是否可以正常写入记录
因为www.conf中的socket文件为/tmp/php-fcgi.sock,被test.com使用,所以我们在/data/wwwroot/test.com下面写入一个php脚本,内容如下
<?php
echo "test slow log";
sleep(2); 这一条表示休眠两秒钟
echo "done";
?>
然后我们执行curl -x127.0.0.1:80 test.com/sleep.php
我们再查看/usr/local/php-fpm/var/log/www-slow.log,就发现如下图,提示sleep.php的第三行是php慢的原因
注:很多php执行时间介于1到2秒之间,所以我们可以把time_out的时间设置为2
23.open_basedir
在php-fpm中,我们可以根据不同的池子来定义open_basedir
1)vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
写入下面内容
php_admin_value[open_basedir]=/data/wwwroot/aming.com:/tmp/
注:如何定义php-fpm的错误日志
vim /usr/local/php-fpm/etc/php.ini
编辑error_log和reporting
error_log = /usr/local/php-fpm/var/log/php_error.log
error_reporting = E_ALL
touch /usr/local/php-fpm/var/log/php_error.log && chmod 777 /usr/local/php-fpm/var/log/php_error.log
24.php-fpm进程管理
在php-fpm的配置中有下面的内容
•pm = dynamic //动态进程管理,也可以是static
• pm.max_children = 50 //最大子进程数,ps aux可以查看
• pm.start_servers = 20 //启动服务时会启动的进程数
• pm.min_spare_servers = 5 //定义在空闲时段,子进程数的最少数量,如果达到这个数值时,php-fpm服务会自动派生新的子进程。
• pm.max_spare_servers = 35 //定义在空闲时段,子进程数的最大值,如果高于这个数值就开始清理空闲的子进程。
• pm.max_requests = 500 //定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。