nginx优化
Nginx调优
Nginx概念
Nginx
Nginx ("engine x") 是一个轻量级、高性能的WEB服务器软件和反向代理服务器。Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
Nginx以事件驱动(epoll)的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡。但是Nginx并不支持cgi方式运行,原因是可以减少因此带来的一些程序上的漏洞。所以必须使用FastCGI方式来执行PHP程序。
由于Nginx本身的一些优点,轻量,开源,易用,越来越多的公司使用nginx作为自己公司的web应用服务器,如百度BWS、新浪、网易、腾讯等。本文详细介绍nginx源码安装的同时并对nginx进行优化配置。
Nginx官网:
- Nginx官网: http://nginx.org
- Nginx官方文档: http://nginx.org/en/docs/
Nginx官网下载地址: http://nginx.org/en/download.html
Tengine:
- Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。(可以这样理解:淘宝拿到了Nginx源代码之后,进行了功能的填充,优化等等,然后提交给Nginx官方,但是由于Nginx官方响应慢或者不响应,加上语言沟通的不顺畅,于是淘宝公司就自己打包,在遵循GPL的原则上进行二次开发,于是就出了现在的Tengine这个版本)。
- 官网网站:http://tengine.taobao.org/
隐藏nginx版本号
查看别的网站服务器
查看百度web服务器
[root@cong11 ~]# curl -I http://www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 277
Content-Type: text/html
Date: Wed, 03 Jul 2019 06:13:49 GMT
Etag: "575e1f5c-115"
Last-Modified: Mon, 13 Jun 2016 02:50:04 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
查看新浪web服务器
[root@cong11 ~]# curl -I http://www.sina.com.cn
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Wed, 03 Jul 2019 06:14:00 GMT
Content-Type: text/html
Content-Length: 154
Connection: keep-alive
Location: https://www.sina.com.cn/
X-Via-CDN: f=edge,s=cnc.jinan.ha2ts4.68.nb.sinaedge.com,c=123.112.20.184;
X-Via-Edge: 1562134440354b814707bf780d73c236f75da
隐藏nginx服务器版本号
编译前的优化主要是用来修改程序名等等,目的更改源码隐藏软件名称和版本号
安装zlib-devel、pcre-devel等依赖包。
上传软件包并解压
[root@cong11 ~]# ls
anaconda-ks.cfg nginx-1.10.3.tar.gz
[root@cong11 ~]# tar -zxvf nginx-1.10.3.tar.gz -C /usr/local/src/
更改源码隐藏软件名称和版本号
[root@cong11 ~]# cd /usr/local/src/nginx-1.10.3/
[root@cong11 nginx-1.10.3]# vim src/core/nginx.h #修改标红部分
13 #define NGINX_VERSION "8.8.8" #修改版本号
14 #define NGINX_VER "web/" NGINX_VERSION #修改服务器名称
[root@cong11 nginx-1.10.3]# vim src/http/ngx_http_header_filter_module.c
49 static char ngx_http_server_string[] = "Server: web" CRLF; #修改标红部分
#修改HTTP头信息中的server字段,防止回显具体版本号
[root@cong11 nginx-1.10.3]# vim src/http/ngx_http_special_response.c
#这个文件定义了http错误码的返回,有时候我们页面程序出现错误,Nginx会代我们返回相应的错误代码,回显的时候,会带上nginx和版本号,我们把他隐藏起来.
22 "<hr><center>" NGINX_VER "</center>" CRLF #老版本这里需要修改为web,现在这里不需要修改,因为它调用了NGINX_VER变量
29 "<hr><center>web</center>" CRLF
安装nginx依赖包
[root@cong11 nginx-1.10.3]# yum install -y gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel
预编译
#创建nginx运行账户www并加入到www组,不允许www用户直接登录系统。
[root@cong11 ~]# groupadd www #添加www组
[root@cong11 ~]# useradd -g www www -s /sbin/nologin
[root@cong11 nginx-1.10.3]# ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=www --group=www
相关选项说明:
--with-http_dav_module # nginx 编译时通过加入“--with-http_dav_module”可以启用对WebDav协议的支持。WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可直接对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。即ngx_http_dav_module模块用于通过 WebDAV 协议进行文件管理自动化。该模块处理 HTTP 和 WebDAV 的 PUT、DELETE、MKCOL、COPY 和 MOVE 方法。
--with-http_stub_status_module #获取Nginx的状态统计信息
--with-http_addition_module #向响应内容中追加内容,比如想在站点底部追加一个js或者css,可以使用这个模块来实现,即模块ngx_http_addition_module在响应之前或者之后追加文本内容。
--with-http_sub_module # ngx_http_sub_module模块是一个过滤器,它修改网站响应内容中的字符串,比如你想把响应内容中的‘iuwai’全部替换成‘aaaaa‘,这个模块已经内置在nginx中,但是默认未安装,需要安装需要加上配置参数:--with-http_sub_module
--with-http_flv_module #该ngx_http_flv_module模块为Flash视频(FLV)文件提供伪流服务器端支持。它会根据指定的 start 参数来指定跳过多少字节,并在返回数据前面附上 FLV 头。
location ~ \.flv$ {
flv;
}
curl localhost/index.flv?start=10
该请求的意思是,从视频文件 index.flv 第10个字节开始读取返回,并在返回的数据上附上 FLV 头。
--with-http_mp4_module #模块提供了对 MP4 视频的播放支持,相关的扩展名 .mp4 .m4v .m4a。
--with-http_ssl_module #启用ngx_http_ssl_module
--with-pcre # 支持正则表达式
注:如果pcre是通过编译安装的话,例如
# tar zxvf /usr/local/src/pcre-8.36.tar.gz -C /usr/local/src/
# cd /usr/local/src/pcre-8.36
# ./configure && make && make install
则--with-pcre=/usr/local/src/pcre-8.36 #需要注意,这里指的是源码,用./configure --help |grep pcre查看帮助。
编译安装
[root@cong11 nginx-1.10.3]# make && make install
启动nginx
[root@cong11 ~]# /usr/local/nginx/sbin/nginx
查看端口号
[root@cong11 ~]# netstat -antup | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7423/nginx: master
测试
[root@cong11 ~]# curl -I 192.168.1.11
HTTP/1.1 200 OK
Server: web/8.8.8
Date: Wed, 03 Jul 2019 08:34:09 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 03 Jul 2019 08:31:22 GMT
Connection: keep-alive
ETag: "5d1c67da-264"
Accept-Ranges: bytes
网站测试
配置文件nginx.conf
在Nginx服务器的主配置文件nginx.conf中,包括全局配置、I/O事件配置、HTTP配置这三大块内容,配置语句的格式为”关键字 值;”(末尾以分号表示结束),以”#”开始的部分表示注释。
1)全局配置
由各种配置语句组成,不使用特定的界定标记。全局配置部分包括运行用户、工作进程数、错误日志、PID存放位置等基本设置。
常用配置项:
user nobody;
//运行用户,Nginx的运行用户实际是编译时指定的nginx,若编译时未指定则默认为nobody
worker_processes 2;
//指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般为它的倍数
worker_rlimit_nofile 102400;
//这个指令是指当一个nginx进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。(通过”ulimit –n 数值”可以修改打开的最多文件数目)
error_log logs/error.log; //全局错误日志文件的位置
pid logs/nginx.pid; //PID文件的位置
2)I/O事件配置:
使用”events {}”界定标记,用来指定Nginx进程的I/O响应模型,每个进程的连接数等设置
events {
use epoll; //使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能
worker_connections 4096; //每个进程允许的最多连接数(默认为1024),每个进程的连接数应根据实际需要来定,一般在10000以下,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。
}
3)HTTP配置
使用”http{}”界定标记,包括访问日志、HTTP端口、网页目录、默认字符集、连接保持、以及虚拟主机、PHP解析等一系列设置。其中大部分配置语句包含在子界定标记”server {}”内。
http {
#设定媒体类型,include 只是一个在当前文件中包含另一个文件内容的指令。
include mime.types;
default_type application/octet-stream; //默认媒体类型足够。
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#设定access log
access_log logs/access.log main;
keepalive_timeout 65; //连接保持超时
#设定虚拟主机
server { //用来配置虚拟主机
listen 80; //WEB服务的监听设置,可以采用”IP地址:端口”形式
server_name www.lnmp.com;//网站名,称可以写多个名称,用空格分隔
location / { //表示如何匹配后面的路径的
index index.html; //默认首页
root html; //网页根目录位置,默认为Nginx安装目录下的html/子目录,root语句用来设置特定访问位置的网页文档路径,根据需要可改为/var/www/html等其他路径。
}
charset gb2312; //网页的默认字符集
#设定本虚拟主机的访问日志
access_log logs/www.lnmp.com.access.log main;
error_page 500 502 503 504 /50x.html; //内部错误的反馈页面
location = /50x.html {
root html;
}
}
}
修改nginx运行账号
编译安装nginx时若不指定--user=, --group=选项,默认是nobody用户。
查看nginx当前运行账号
[root@cong11 ~]# ps -aux | grep nginx #默认是nobody用户
创建nginx程序账号
[root@cong11 ~]# useradd -M -s /sbin/nologin www
修改nginx运行账号
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
改:
#user nobody;
为:
user www;
添加path变量
[root@cong11 ~]# ln -s /usr/local/nginx/sbin/* /usr/local/bin/
重载nginx
[root@cong11 ~]# nginx -h
nginx version: web/8.8.8
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: /usr/local/nginx/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
[root@cong11 ~]# 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
[root@cong11 ~]# nginx -s reload
查看运行账号
[root@cong11 ~]# ps -aux | grep nginx
在这里我们还可以看到在查看的时候,worker进程是www用户了,但是master进程还是root
其中,master是监控进程,也叫主进程,worker是工作进程.
master监控进程使用root,也可以是降级使用普通用户,如果都是用普用户,那么编译安装的时候,是用普通用户执行,sudo方式操作,可以直接理解为master是管理员,worker进程才是为用户提供服务的!
生成服务启动脚本
[root@cong11 ~]# vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: 2345 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
echo "Nginx service already running."
else
$PROG -t &> /dev/null
if [ $? -eq 0 ] ; then
$PROG
echo "Nginx service start success."
else
$PROG -t
fi
fi
;;
stop)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
kill -s QUIT $(cat $PIDF)
echo "Nginx service stop success."
else
echo "Nginx service already stop"
fi
;;
restart)
$0 stop
$0 start
;;
status)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
echo "Nginx service is running."
else
echo "Nginx is stop."
fi
;;
reload)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
$PROG -t &> /dev/null
if [ $? -eq 0 ] ; then
kill -s HUP $(cat $PIDF)
echo "reload Nginx config success."
else
$PROG -t
fi
else
echo "Nginx service is not run."
fi
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
配置服务开机自动启动
[root@cong11 ~]# chmod +x /etc/init.d/nginx #给脚本添加可执行权限
[root@cong11 ~]# chkconfig --add nginx #把nginx添加为系统服务
[root@cong11 ~]# chkconfig nginx on #把nginx添加开机自启动
[root@cong11 ~]# chkconfig --list nginx #查看nginx开机启动项
Nginx进程
[root@cong11 ~]# ps aux | grep nginx | grep -v "grep"
root 20134 0.0 0.0 45936 1116 ? Ss 20:24 0:00 nginx: master process /usr/local/nginx/sbin/nginx
www 20135 0.0 0.1 48464 1976 ? S 20:24 0:00 nginx: worker process
在这里我们还可以看到在查看的时候,worker进程是www程序用户,但是master进程还是root,其中,master是监控进程,也叫主进程,worker是工作进程,还有cache相关进程,关系如图:
可以直接理解为master进程是管理worker进程,而worker进程才是为用户提供服务的。
设置Nginx运行进程个数
Nginx运行进程个数一般我们设置CPU的核心或者核心数x2,如果你不了解,top命令之后按1也可以看出来。也可以查看/proc/cpuinfo文件
[root@cong11 ~]# grep ^processor /proc/cpuinfo | wc -l
4
查看cpu个数
[root@cong11 ~]# top #按1,可以看到我这里是4 核心
设置nginx中进程数
在nginx.conf的全局设置中修改
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
改:
worker_processes 1;
为
worker_processes 4; #我这里查看到是4个cpu,修改为4
重载nginx配置文件
[root@cong11 ~]# nginx -s reload
查看nginx进程数
[root@cong11 ~]# ps -axu | grep nginx | grep -v "grep"
root 20134 0.0 0.1 46072 1912 ? Ss 20:24 0:00 nginx: master process /usr/local/nginx/sbin/nginx
www 50207 0.0 0.1 48580 2076 ? S 20:49 0:00 nginx: worker process
www 50208 0.0 0.1 48580 2028 ? S 20:49 0:00 nginx: worker process
www 50209 0.0 0.1 48580 2048 ? S 20:49 0:00 nginx: worker process
www 50210 0.0 0.1 48580 2076 ? S 20:49 0:00 nginx: worker process
Nginx运行CPU亲和力
这个要根据你的CPU线程数配置,在高并发情况下,通过设置cpu亲和力来降低由于多CPU核切换带来的性能损耗。
4核4线程配置
在nginx.conf文件全局配置中添加
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
上面的配置表示:4核CPU,开启4个进程。0001表示开启第一个cpu内核, 0010表示开启第二个cpu内核,依次类推;有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
8核8线程配置
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
那么如果我是4线程的CPU,我只想跑两个进程呢?
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 2;
worker_cpu_affinity 0101 1010;
表示第一个进程在第一个和第三个cpu上运行,第二个进程在第二个和第四个cpu上运行,两个进程分别在这两个组合上轮询!
补充:
2核CPU,开启2个进程
worker_processes2;
worker_cpu_affinity 01 10;
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
worker_processes8;
worker_cpu_affinity 01 10 01 10 01 10 01 10;
worker_processes2;
worker_cpu_affinity 10101010 01010101;
说明:10101010表示开启了第2,4,6,8内核,01010101表示开始了1,3,5,7内核
通过 apache 的ab测试查看nginx对CPU的使用状况:
如果多个CPU内核的利用率都相差不多,证明nginx己经成功的利用了多核CPU。
测试结束后,CPU内核的负载应该都同时降低。
Nginx最多可以打开文件数
设置nginx最大可打开文件数
在nginx.conf文件全局配置中添加
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
worker_rlimit_nofile 102400; 添加标红内容
当一个nginx进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
修改系统可以打开的最大文件数:
临时修改
ulimit -n设定系统最多打开的文件数
[root@cong11 ~]# ulimit -n 102400
[root@cong11 ~]# ulimit -n
102400
永久修改
修改linux的软硬件限制文件/etc/security/limits.conf
[root@cong11 ~]# vim /etc/security/limits.conf
在文件尾部添加如下代码:
* soft nofile 102400
* hard nofile 102400
用户重新登录生效
[root@cong11 ~]# ulimit -n
102400
Nginx事件处理模型
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
events {
use epoll;
worker_connections 65535; #单个进程允许客户端最大并发连接数
}
nginx采用epoll事件模型,处理效率高
worker_connections是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work_connections
实际我们填入一个65535,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了!
单个进程允许客户端最大并发连接数
worker_connections 65535;
这个数值一般根据服务器性能和内存来制定,也就是单个进程最大连接数,实际最大并发值就是work进程数乘以这个数。
如何设置,可以根据一个进程启动所占内存,top -u www(www表示nginx程序用户名),但是实际我们填入一个65535,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了!
[root@cong11 ~]# top -u www
刚启动一个进程占用内存是1.5M左右
http主体优化
开启高效传输模式
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types; #媒体类型
default_type application/octet-stream; #默认媒体类型足够
sendfile on;
tcp_nopush on; #取消注释
sendfile on;
开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,当nginx是一个静态文件服务器的时候,开启sendfile配置项能大大提高nginx的性能。
tcp_nopush on;
必须在sendfile开启模式才有效,防止网络阻塞,积极的减少网络报文段的数量(将响应头和响应体两部分一起发送,而不一个接一个的发送。)
长连接超时时间
主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
keepalive_timeout 65;
keepalived_timeout 与client的keep-alive连接超时时间,单位是秒。服务器将会在这个时间后关闭连接,长连接可以减少重建连接的开销,如果设置时间过长,用户又多,长时间保持连接会占用大量资源。
文件上传大小限制
nginx可以修改上传文件大小限制
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
client_max_body_size 10m; #在40行添加
location匹配
location匹配:
Nginx的location通过指定模式来与客户端请求的URI相匹配,location可以把网站的不同部分,定位到不同的处理方式上,基本语法如下:
location [=|~|~*|^~] pattern {
……
}
注:中括号中为修饰符,即指令模式。Pattern为url匹配模式
= 表示做精确匹配,即要求请求的地址和匹配路径完全相同
~:正则匹配,区分大小写
~*:正则匹配”不区分大小写
注:nginx支持正则匹配,波浪号(~)表示匹配路径是正则表达式,加上*变成~*后表示大小写不敏感
^~:指令用于字符前缀匹配。例如:location ^~ /images/ {…}
精确匹配
= 用于精确字符匹配(模式),不能使用正则,区分大小写。
例1:
精准匹配,浏览器输入ip地址/text.html,定位到服务器/var/www/html/text.html文件
location = /text.html {
root /var/www/html;
index text.html;
}
例2:
匹配命中的location,使用rewrite指令,用于转发。可以理解命中了就重定向到rewrite后面的url即可。
location = /demo {
rewrite ^ http://google.com;
}
上述的配置表示只有访问 http://ip地址/demo 这样的url,才能跳转到google的页面。除此之外的任何地址都无法访问,那怕是访问http://IP/demo/这个地址也不行。因为url匹配模式是/demo。
前缀匹配
^~指令用于字符前缀匹配,和=精确匹配一样,也是用于字符确定的匹配,不能使用正则且区分大小写。和=不同的在于,^~指令下,访问的url无需url匹配模式一模一样,只需要其开头前缀和url匹配模式一样即可。
location ^~ /demo {
rewrite ^ http://google.com;
}
对于该模式(/demo),访问下列的地址都能匹配:
http://ip/demo
http://ip/demo/
http://ip/demo/aaa
http://ip/demo/aaa/bbb
http://ip/demo/AAA
http://ip/demoaaa
http://ip/demo.aaa
只需要以/demo为前缀开头的url都能匹配。与该模式后的是否大小写无关。
^~不支持正则。模式/demo$中的$并不代表字符模式结束,而是一个是实实在在的$,只有访问/demo$开头的url才能匹配,http://ip/demo则不再匹配。
模式/[0-9]emo也不代表正则中的http://ip/0emo、http://ip/5emo之类,只有访问以 /[0-9]emo开头url才行,例如http://ip/[0-9]emo或http://ip/[0-9]emo/aaa
前缀匹配通常用于匹配文件夹,如配置静态文件。
location ^~ /images/ {
}
正则匹配
nginx支持正则匹配。所使用的指令是~和~*,前者表示使用正则,区分大小写,后者表示使用正则,不区分大小写。
例1:匹配任何以 gif、jpg 或 jpeg 结尾的请求。
location ~* \.(gif|jpg|swf)$ {
}
例2:
location ~ /[0-9]emo {
rewrite ^ http://google.com;
}
对于上述的模式,可以匹配的url如下:
http://192.168.33.10/5emo
http://192.168.33.10/9emo
http://192.168.33.10/5emo/aaa
http://192.168.33.10/5emo/AAA
http://192.168.33.10/5emoaaa
只要是以正则表达式/[0-9]emo匹配的字符开头的url,都能匹配。
使用~*则不区分大小写
正常匹配
正常匹配的指令为空,即没有指定匹配指令的即为正常匹配。其形式类似 /XXX/YYY.ZZZ正常匹配中的url匹配模式可以使用正则,不区分大小写。
location /demo {
rewrite ^ http://google.com;
}
上述模式指的是匹配/demo的url,下面的都能匹配
http://192.168.33.10/demo
http://192.168.33.10/demo/
http://192.168.33.10/demo/aaa
http://192.168.33.10/demo/aaa/bbb
http://192.168.33.10/demo/AAA
http://192.168.33.10/demoaaa
http://192.168.33.10/demo.aaa
正常匹配和前缀匹配的差别在于优先级。前缀的优先级高于正常匹配。
全匹配
全匹配与正常匹配一样,没有匹配指令,匹配的url模式仅一个斜杠/
location / {
rewrite ^ http://google.com;
}
匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和一些较长的字符串将被优先查询匹配。
命名匹配
命名匹配指的是使用@绑定一个模式,类似变量替换的用法。
error_page 404 = @not_found;
location @not_found {
rewrite ^ http://google.com;
}
上述的作用是如果访问没有匹配的url会触发404指令,然后就匹配到@not_found 这个 location上。
匹配优先级
nginx的匹配优先级遵循一个大原则和一个小细节。
大原则是关于匹配模式的优先级:
精确匹配 > 前缀匹配 > 正则匹配 > 正常匹配 > 全匹配
小细节则是同级的优先级:
面对一个location,先判断是否是正则匹配,如果是正则匹配,遇到匹配的模式,则命中。如果不是正则,则把匹配的模式放到一边,继续往下阅读配置,阅读完毕所有的匹配模式,查看哪一种的匹配模式更长,则是最终命中的模式。
同级的匹配需要注意两个关键细节,是否是正则匹配,是否是最长匹配。
nginx配置文件检测
[root@cong11 ~]# 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
Fastcgi调优
配置之前。了解几个概念:
Cache:写入缓存区
Buffer:读取缓存区
Fastcgi是静态服务和动态服务的一个接口
fastcgi参数解释:
fastcgi_connect_timeout 300; #指定连接到后端FastCGI的超时时间。
fastcgi_send_timeout 300; #向FastCGI传送请求的超时时间。
fastcgi_read_timeout 300; #指定接收FastCGI应答的超时时间。
fastcgi_buffer_size 64k; #指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选项指定的缓冲区大小。
fastcgi_buffers 4 64k; #指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求,如果一个php脚本所产生的页面大小为256KB,那么会分配4个64KB的缓冲区来缓存,如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp_path指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于磁盘。一般这个值应该为站点中php脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“8 32K”、“4 64k”等。
fastcgi_busy_buffers_size 128k; #建议设置为fastcgi_buffer的两倍,繁忙时候的buffer
fastcgi_temp_file_write_size 128k; #在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,该数值设置小时若负载上来时可能报502 Bad Gateway
fastcgi_temp_path #缓存临时目录
fastcgi_cache ngx_fcgi_cache; #表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502的错误发生,但是开启缓存也可能会引起其他问题,要很据具体情况选择
fastcgi_cache_valid 200 302 1h; #用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一小时,要和fastcgi_cache配合使用
fastcgi_cache_valid 301 1d; #将301应答缓存一天
fastcgi_cache_valid any 1m; #将其他应答缓存为1分钟
fastcgi_cache_min_uses 1; #该指令用于设置经过多少次请求的相同URL将被缓存。
fastcgi_cache_key http://$host$request_uri; #该指令用来设置web缓存的Key值,nginx根据Key值md5哈希存储.一般根据$host(域名)、$request_uri(请求的路径)等变量组合成proxy_cache_key 。
fastcgi_pass #指定FastCGI服务器监听端口与地址。
fastcgi_cache_path #定义缓存的路径
修改nginx.conf配置文件,在http标签中添加如下内容(server{}之上):
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path /data/ngx_fcgi_tmp;
fastcgi_cache_path /data/ngx_fcgi_cache levels=1:2 keys_zone= ngx_fcgi_cache:128m inactive=1d max_size=10g; # fastcgi_cache缓存目录,可以设置目录层级,比如1:2会生成16*256个子目录,ngx_fcgi_cache是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放内存,提高访问速度),inactive表示默认失效时间,如果缓存数据在失效时间内没有被访问,将被删除,max_size表示最多用多少硬盘空间。
总结:
nginx的缓存功能有:proxy_cache / fastcgi_cache
proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态。
fastcgi_cache的作用是缓存fastcgi生成的内容,很多情况是php生成的动态的内容。
proxy_cache缓存减少了nginx与后端通信的次数,节省了传输时间和后端宽带。
fastcgi_cache缓存减少了nginx与php的通信的次数,更减轻了php和数据库(mysql)的压力。
在server location标签添加如下:
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_cache ngx_fcgi_cache;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_key http://$host$request_uri;
}
检测配置文件
[root@cong11 ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: [emerg] mkdir() "/data/ngx_fcgi_cache" failed (2: No such file or directory)
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
[root@cong11 ~]# mkdir /data
重启
[root@cong11 ~]# nginx -s reload
fastcgi cache资料:
官方文档:
http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache
gzip调优
启用gzip
使用gzip压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本,所以说这是一个重点
Nginx启用压缩功能需要你来ngx_http_gzip_module模块,apache使用的是mod_deflate
一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,flash不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU的!
在http{}区域中添加
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/css text/xml application/javascript;
gzip_vary on;
参数解释:
gzip on; #开启压缩功能
gzip_min_length 1k; #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length(内容长度)中获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K,如果小于1K可能会越压越大。
gzip_buffers 4 32k; #压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1; #压缩版本,用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可
gzip_comp_level 6; #压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。
gzip_types text/css text/xml application/javascript; #用来指定压缩的类型,‘text/html’类型总是会被压缩。
默认值: gzip_types text/html (默认不对js/css文件进行压缩)
# 不能用通配符 text/*
# (无论是否指定)text/html默认已经压缩
# 设置压缩哪种文本文件可参考 conf/mime.types
gzip_vary on; #启用应答头"Vary: Accept-Encoding"。和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩。其实cdn,代理服务器,原理上都是代理服务器。他们一般以url为key值进行缓存。而vary属性的设置,告诉了代理根据url缓存的同时,vary的信息也作为key。比如客户端(浏览器)请求的信息里带上了Accept-Encoding:gzip 则返回压缩副本。如果没有带这个头信息,默认返回非压缩副本。
拷贝测试文件
[root@cong11 ~]# cp /etc/passwd /usr/local/nginx/html/passwd.html
[root@cong11 ~]# cd /usr/local/nginx/html/
[root@cong11 html]# -sh *
测试
打开浏览器,输入测试网址
http://192.168.1.11/passwd.html
按F12然后刷新网页,在开发人员工具里可以看到,passwd.html大小为927B,在网页标头里可以看到,Accept-Encoding: gzip, deflate启用了gzip压缩。
谷歌浏览器
输入网址,按F12在network里点击passwd.html,在标头里找Request Headers,也可以看到Accept-Encoding: gzip, deflate,开启gzip压缩
expires缓存调优
缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的扩展名列出来!Expires缓存配置在server字段里面。
以扩展名区分
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 365d;
}
location ~ .*\.(js|css)?$
{
expires 30d;
}
对目录及其进行判断:
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
location ~ (robots.txt) {
expires 7d;
break;
}
注:用于中断当前相同作用域中的Nginx配置,和循环语句中的break语法类似,可以在server块和location以及if块中使用。
expire功能优点
(1)expires可以降低网站购买的带宽,节约成本
(2)同时提升用户访问体验
(3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能。
expire功能缺点:
被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。
解决办法:
第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天
第二个 对缓存的对象改名
a.图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已
b.网站升级对于js,css元素,一般可以改名,把css,js,推送到CDN。
网站不希望被缓存的内容
1)广告图片
2)网站流量统计工具
3)更新频繁的文件(google的logo)
日志切割优化
日志优化的目的,是为了一天日志一压缩,按天存放,超过10天的删除
创建日志切割脚本
[root@cong11 ~]# cd /usr/local/nginx/logs/
[root@cong11 logs]# vim cut_nginx_log.sh #日志切割脚本
#!/bin/bash
date=$(date +%F -d -1day)
cd /usr/local/nginx/logs
if [ ! -d cut ] ; then
mkdir cut
fi
mv access.log cut/access_$(date +%F -d -1day).log
mv error.log cut/error_$(date +%F -d -1day).log
/usr/local/nginx/sbin/nginx -s reload
tar -jcvf cut/$date.tar.bz2 cut/*
rm -rf cut/access* && rm -rf cut/error*
find -type f -mtime +10 | xargs rm -rf
[root@cong11 logs]# crontab -e
0 0 * * * /bin/sh /usr/local/nginx/logs/cut_nginx_log.sh >/dev/null 2>&1
[root@cong11 logs]# chmod +x cut_nginx_log.sh #添加可执行
去掉不需要的日志统计
健康检查的日志,不用输入到log中,因为这些日志没有意义,我们分析的话只需要分析访问日志,看看一些页面链接,如200,301,404的状态码,在SEO中很重要,而且我们统计PV是页面计算,这些都没有意义,反而消耗了磁盘IO,降低了服务器性能,我们可以屏蔽这些如图片,js,css这些不宜变化的内容
[root@cong11 logs]# vim /usr/local/nginx/conf/nginx.conf
location ~ .*\.(js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
注:
error log 关闭
关闭 error log 千万不要写 error_log off; ,这样错误日志会被写到一个叫做 off的文件中
正确关闭错误的方法:
error_log /dev/null ;
日志格式优化
- Nginx软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由ngx_http_log_module模块负责。
- 对应的官方地址为:http://nginx.org/en/docs/http/ngx_http_log_module.html。
- 访问日志参数
- Nginx的访问日志主要由两个参数控制。
- Nginx日志格式中默认的参数配置如下:
[root@cong11 logs]# vim /usr/local/nginx/conf/nginx.conf #开启25-29行
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
2.$remote_user :用来记录客户端用户名称;
3.$time_local : 用来记录访问时间与时区;
4.$request : 用来记录请求的url与http协议;
5.$status : 用来记录请求状态;成功是200,
6.$body_bytes_sent :记录发送给客户端文件主体内容大小;
7.$http_referer :用来记录从那个页面链接访问过来的;
8.$http_user_agent :记录客户端浏览器的相关信息;
9. $http_x_forwarded_for:客户端IP地址列表(包括中间经过的代理),当前有代理服务器时,设置web站点记录客户段地址的配置,此参数生效的前提是代理服务器上也进行了相关的x_forwarded_for设置。
例如:摘出来一段部分访问日志分析:
目录文件访问控制
主要用在禁止目录下指定文件被访问,当然也可以禁止所有文件被访问!一般什么情况下用?比如是有存储共享,这些文件本来都只是一些下载资源文件,那么这些资源文件就不允许被执行,如sh,py,pl,php等等
禁止访问images下面的php程序文件
修改配置文件
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ ^/images/.*\.(php|php5|sh|py|pl)$ {
deny all;
}
重启服务
[root@cong11 ~]# nginx -s reload
创建测试文件
[root@cong11 ~]# mkdir /usr/local/nginx/html/images
[root@cong11 ~]# echo "<?php phpinfo(); ?>" > /usr/local/nginx/html/images/index.php
测试访问
http://192.168.1.11/images/index.php
多个目录书写方法
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ ^/images/(attachment|avatar)/.*\.(php|php5|sh|py|py)$ {
deny all;
}
配置nginx禁止访问*.txt文件
创建测试文件
[root@cong11 ~]# echo Test > /usr/local/nginx/html/a.txt
测试
配置规则,禁止访问txt
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
location ~* \.(txt|doc)$ {
if ( -f $request_filename) {
root /usr/local/nginx/html;
}
deny all;
}
重载nginx
[root@cong11 ~]# nginx -s reload
测试
可以错误重定向到某一个URL
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
location ~* \.(txt|doc)$ {
if ( -f $request_filename) {
root /usr/local/nginx/html;
}
rewrite ^/(.*)$ http://www.baidu.com last;
}
对目录进行访问限制
创建2个目录
[root@cong11 ~]# mkdir -p /usr/local/nginx/html/{aa,bb}
创建测试文件
[root@cong11 ~]# echo 'aa' > /usr/local/nginx/html/aa/index.html
[root@cong11 ~]# echo 'bb' > /usr/local/nginx/html/bb/index.html
配置目录拒绝访问
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
location /aa/ { return 404 ; }
location /bb/ { return 403 ; }
重载nginx
[root@cong11 ~]# nginx -s reload
测试
http://192.168.1.11/aa/index.html
http://192.168.1.11/bb/index.html
也可以配置deny all方式拒绝
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf #修改内容
location ~ ^/(aa)/ {
deny all;
}
location /bb/ { return 403 ; }
[root@cong11 ~]# nginx -s reload
http://192.168.1.11/aa/index.html
对访问来源控制
这个需要ngx_http_access_module模块支持,不过,默认会安装
修改配置文件
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ ^/aa/ {
allow 192.168.1.0/24; #允许1.0网段IP访问
deny all;
}
location /bb/ { return 403 ; }
重载服务器
[root@cong11 ~]# nginx -s reload
测试
http://192.168.1.11/aa/index.html
对整个网站根目录访问控制
针对整个网站的写法,对/限制就OK,允许1.0网段访问网站
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ / {
allow 192.168.1.0/24; #可以写IP段,也可以写IP
deny all;
}
通过if语句控制,给以友好的错误提示
拒绝192.168.1.254访问网站
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ / {
allow 192.168.1.0/24;
if ( $remote_addr = 192.168.1.254 ) {
return 404;
}
deny all;
}
[root@cong11 ~]# nginx -s reload
测试:
IP和301优化
有时候,我们发现访问网站的时候,使用IP也是可以得,我们可以把这一层给屏蔽掉,让其直接反馈给403,也可以做跳转
跳转的做法
修改配置文件
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.benet.com benet.com;
if ($host = 192.168.1.11) {
rewrite ^ http://www.baidu.com;
}
}
重置nginx
[root@cong11 ~]# nginx -s reload
测试
403反馈的做法
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.benet.com benet.com;
if ($host = 192.168.1.11) {
return 403;
}
301跳转的做法
我们域名在解析的过程中,将qingniao.com跳转到 www.qingniao.com
配置301跳转
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
root html;
server_name www.qingniao.com qingniao.com;
if ($host = qingniao.com ) {
rewrite ^/(.*)$ http://www.qingniao.com/$1 permanent;
}
修改hosts
[root@cong11 ~]# vim /etc/hosts
192.168.1.11 www.qingniao.com
192.168.1.11 qingniao.com
重载nginx
[root@cong11 ~]# nginx -s reload
测试
qingniao.com
防盗链
防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,那么我们的解决办法由几种:
1:水印,品牌宣传,你的带宽,服务器足够
2:防火墙,直接控制,前提是你知道IP来源
3:防盗链策略
直接给予404的错误提示
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.html index.htm;
} #直接在第一个localtion下面填写以下内容
location ~* \.(jpg|gif|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
root html;
valid_referers none blocked *.qingniao.com qingniao.com;
if ($invalid_referer) {
return 404;
}
expires 365d;
}
设置图片,来做rewrite跳转
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
location ~* \.(jpg|gif|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
root html;
valid_referers none blocked *.qingniao.com qingniao.com;
if ($invalid_referer) {
rewrite ^/ http://www.qingniao.com/img/test.png;
#return 302 http://www.qingniao.com/img/test.png;
}
expires 365d;
}
参数说明:
location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ { #需要防盗的资源
valid_referers none blocked *.qingniao.com qingniao.com; #这是可以盗链的域名或IP地址,一般情况可以把google,baidu,sogou,soso,bing,feedsky等域名放进来
none 意思是不存在的Referer头(表示空的,也就是直接访问,比如直接在浏览器打开一个图片)
blocked 意为根据防火墙伪装Referer头,如:“Referer: XXXXXXX”。
server_names 为一个或多个服务器的列表,0.5.33版本以后可以在名称中使用“*”通配符。
错误页面的提示
对于自定义错误页面,可以定义到404页面
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
error_page 404 /404.html;
防盗链测试
使用apache做为一个测试站点,域名为www.test.com,在测试页上做一个超链接,链接nginx站点的一张图片
安装httpd
[root@cong11 ~]# yum -y install httpd
配置httpd
修改监听端口为8080,修改ServerName为www.test.com:8080
[root@cong11 ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080
ServerName www.test.com:8080
新建测试文件
Yum安装的httpd,网站根目录为/var/www/html
[root@cong11 ~]# vim /var/www/html/test.html
<a href="http://www.qingniao.com/qingniao.jpg">lianjie</a>
上传qingniao.jpg图片
[root@cong11 ~]# cd /usr/local/nginx/html/
[root@cong11 html]# ls
50x.html bbs index.html qingniao.jpg
修改hosts
[root@cong11 html]# vim /etc/hosts
192.168.1.11 www.test.com #最后添加这一行
启动httpd
[root@cong11 ~]# systemctl start httpd
测试
http://192.168.1.11:8080/test.html
点击lianjie
可以看到超链接被拒绝了,说明防盗链做成功了
直接打开http://www.qingniao.com/qingniao.jpg
内部身份验证
配置认证
[root@cong11 ~]# vim /usr/local/nginx/conf/nginx.conf
location /bbs/ {
auth_basic "haha";
auth_basic_user_file /usr/local/nginx/conf/passwd;
}
用户创建
[root@cong11 ~]# yum -y install httpd-tools #安装htpasswd工具
[root@cong11 ~]# htpasswd -cb /usr/local/nginx/conf/passwd aaa 123
Adding password for user aaa
-c 创建passwdfile.如果passwdfile 已经存在,那么它会重新写入并删去原有内容.
-b 命令行中一并输入用户名和密码而不是根据提示输入密码,可以看见明文,不需要交互
[root@cong11 ~]# chmod 400 /usr/local/nginx/conf/passwd
[root@cong11 ~]# chown www /usr/local/nginx/conf/passwd
创建目录
[root@cong11 ~]# mkdir /usr/local/nginx/html/bbs
重载nginx
[root@cong11 ~]# nginx -s reload
测试
部署LNMP
在Nginx中,我们使用的是php-fpm来对php页面解析,PHP-FPM其实是PHP源代码的一个补丁,指在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,再编译安装PHP后才可以使用。
从PHP5.3.3开始,PHP中直接整合了PHP-FPM,所以从PHP5.3.3版本以后,不需要下载PHP-FPM补丁包了,下面是PHP-FPM官方发出来的通知:
安装依赖:
[root@cong11 ~]# yum -y install gcc autoconf freetype gd libpng libpng-devel libjpeg libxml2 libxml2-devel zlib curl curl-devel freetype-devel libjpeg-devel bzip2 bzip2-devel openssl openssl-devel
安装libmcrypt
上传软件包
[root@cong11 ~]# ls
anaconda-ks.cfg libmcrypt-2.5.7.tar.gz nginx-1.10.3.tar.gz php-5.6.36.tar.gz
[root@cong11 ~]# tar zxf libmcrypt-2.5.7.tar.gz
[root@cong11 ~]# cd libmcrypt-2.5.7/
[root@cong11 libmcrypt-2.5.7]# ./configure --prefix=/usr/local/libmcrypt && make && make install
解压PHP包
[root@cong11 ~]# tar -zxvf php-5.6.36.tar.gz -C /usr/local/src/
安装php
预编译
[root@cong11 ~]# cd /usr/local/src/php-5.6.36/
[root@cong11 php-5.6.36]# ./configure --prefix=/usr/local/php5.6 --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt=/usr/local/libmcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/usr/local/php5.6/etc/ --with-bz2 --enable-maintainer-zts
参数选项
Php配置选项中文手册
- http://php.net/manual/zh/configure.about.php
- 注:
- 相关选项的解释:
--prefix=/usr/local/php5.6 //安装位置
--with-mysql=mysqlnd //支持mysql
--with-pdo-mysql=mysqlnd //支持pdo模块
--with-mysqli=mysqlnd //支持mysqli模块
注:上面的三选项的作用:数据库与php不在一个服务器上,指定此种方式,安装数据库连接驱动
--enable-mbstring #多字节字符串的支持
--with-curl #支持CURL
--with-gd #支持gd库
--enable-fpm #支持构建fpm
--with-config-file-path #设置配置文件路径
--with-openssl #支持openssl模块
--enable-fpm #支持fpm模式
--enable-sockets #启用socket支持
--enable-sysvshm #启用系统共享内存支持
--enable-mbstring #多字节字串、像我们的中文就是多字节字串
--with-freetype-dir #支持freetype、就要装freetype-devel、跟字体相关的、字体解析工具
--with-jpeg-dir
--with-png-dir
注:上面的二选项的作用:处理jpeg、png图片的、php可以动态生成jpeg图片
--with-zlib #是个压缩库、在互联网传输时用来压缩传输的
--with-libxml-dir=/usr #这个libxml是用来解析xml的、指定/usr下
--enable-xml #支持xml的
--with-mhash #支持mhash
--with-mcrypt=/usr/local/libmcrypt #libmcrypt-devel这个程序包所指定的
--with-config-file-path=/usr/local/php5.6/etc #指定配置文件的存放路径的
--with-config-file-scan-dir=/etc/php.d #配置文件扫描路径
--with-bz2 #支持BZip2
编译
[root@cong11 php-5.6.36]# make
安装
- [root@cong11 php-5.6.36]# make install
生成php.ini配置文件
[root@cong11 ~]# cp /usr/local/src/php-5.6.36/php.ini-production /usr/local/php5.6/etc/php.ini
修改fpm配置php-fpm.conf.default文件名称
[root@cong11 ~]# cd /usr/local/php5.6/etc/
[root@cong11 etc]# cp php-fpm.conf.default php-fpm.conf
修改默认运行账号
修改默认运行用户,组为www
[root@cong11 etc]# vim php-fpm.conf
user = www
group = www
pid = run/php-fpm.pid
listen = 0.0.0.0:9000
pm.max_children =300
pm.start_servers =20
pm.min_spare_servers = 20
pm.max_spare_servers = 100
复制php-fpm启动脚本到init.d
[root@cong11 ~]# cp /usr/local/src/php-5.6.36/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
赋予执行权限
[root@cong11 ~]# chmod +x /etc/init.d/php-fpm
添加开机启动
[root@cong11 ~]# chkconfig --add php-fpm
[root@cong11 ~]# chkconfig php-fpm on
启动服务
[root@cong11 ~]# /etc/init.d/php-fpm start
Starting php-fpm done
查看端口监听状态
[root@cong11 ~]# netstat -antpu | grep php-fpm
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 7767/php-fpm: maste
在nginx.conf文件的server中添加下面内容支持php
location / {
root html;
index index.php index.html index.htm; #添加index.php
}
location ~ .*\.(php|php5)?$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_cache ngx_fcgi_cache;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_key http://$host$request_uri;
}
下面是nginx.conf的一个完整配置文件
user www www;
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
tcp_nodelay on;
client_header_buffer_size 4k;
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
client_header_timeout 15;
client_body_timeout 15;
reset_timedout_connection on;
send_timeout 15;
server_tokens off;
client_max_body_size 10m;
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path /usr/local/nginx/nginx_tmp;
fastcgi_intercept_errors on;
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=ngx_fcgi_cache:128m inactive=1d max_size=10g;
gzip on;
gzip_min_length 2k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
gzip_proxied any;
server {
listen 80;
server_name www.benet.com;
charset utf-8;
access_log logs/host.access.log main;
location ~* ^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers none blocked www.benet.com benet.com;
if ($invalid_referer) {
#return 302 http://www.benet.com/img/nolink.jpg;
return 404;
break;
}
expires 365d;
access_log off;
}
location / {
root html;
index index.php index.html index.htm;
}
location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
expires 30d;
#log_not_found off;
access_log off;
}
location ~* \.(js|css)$ {
expires 7d;
log_not_found off;
access_log off;
}
location = /(favicon.ico|roboots.txt) {
access_log off;
log_not_found off;
}
location /status {
stub_status on;
}
location ~ .*\.(php|php5)?$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_cache ngx_fcgi_cache;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_key http://$host$request_uri;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
配置nginx支持index.php
创建index.php文件
[root@cong11 html]# vim index.php
<?php
phpinfo();
?>
[root@cong11 html]# vim test.php
<?php
$link=mysql_connect('192.168.1.12','test','123456');
if ($link)echo "connection success......";
mysql_close();
?>
创建mysql测试账号
恢复192.168.1.12为源码安装mysql快照,创建授权test账号
[root@cong12 ~]# mysql -uroot -p123456
mysql> grant all on *.* to test@'%' identified by '123456';
mysql> flush privileges;
测试
http://192.168.1.11/test.php
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库