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/en/download.html

Tengine:

          1. Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。(可以这样理解:淘宝拿到了Nginx源代码之后,进行了功能的填充,优化等等,然后提交给Nginx官方,但是由于Nginx官方响应慢或者不响应,加上语言沟通的不顺畅,于是淘宝公司就自己打包,在遵循GPL的原则上进行二次开发,于是就出了现在的Tengine这个版本)。
          2. 官网网站: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

网站测试

http://192.168.1.11/

配置文件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;

2核CPU,开启4进程

worker_processes 4;

worker_cpu_affinity 01 10 01 10;

2核CPU,开启8进程

worker_processes8;

worker_cpu_affinity 01 10 01 10 01 10 01 10;

8核CPU,开启2进程

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 ;

日志格式优化

          1. Nginx软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由ngx_http_log_module模块负责。
          2. 对应的官方地址为:http://nginx.org/en/docs/http/ngx_http_log_module.html
          3. 访问日志参数
          4. Nginx的访问日志主要由两个参数控制。
          5. 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

测试

http://192.168.1.11/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

测试

http://192.168.1.11/a.txt

可以错误重定向到某一个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

测试:

http://192.168.1.11/

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

测试

http://192.168.1.11

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

测试

http://www.qingniao.com/

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/

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

测试

http://www.qingniao.com/bbs/

部署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官方发出来的通知:

http:#php-fpm.org/download

安装依赖:

[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配置选项中文手册

          1. http://php.net/manual/zh/configure.about.php
          2. 注:
          3. 相关选项的解释:

--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

安装
          1. [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/

http://192.168.1.11/test.php

posted @   ღ᭄遇见你²⁰²²  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示