nginx性能分析和全面调优

Nginx全能解析及性能调优

nginx 是一个轻量级的、基于http的、高性能的反向代理的服务器和静态web服务器。

正向代理和反向代理

不管是正向代理还是反向代理都是基于客户端来说的。

  • 正向代理

    • 特点

      • 正向代理是对客户端的代理

      • 正向代理是架设在客户端的主机

      • 客户端在使用正向代理服务器时是要知道访问的目标服务的地址

    • 案例

      • 隐藏真正的访问者

        • 向服务端隐藏真正的访问者。对于服务端来说,真正的访问者时代理服务器。起到了隐藏客户端的作用。例如:实际生活中的短信轰炸,你根本不知道是谁给你发的短信;ddos攻击也是这个原理,使用很多‘肉鸡’机器来攻击我们的服务器,我们无法查找真正的攻击源。
      • FQ

        • 由于很多复杂的原因,导致服务器A不能直接访问服务器B,但是服务器C可以访问服务器B,而服务器A又可以访问服务器C;这时,服务器C作为服务起A的代理服务器对B进行访问。目前的FQ软件就是使用这个原理。
      • 提速

        • 同上原理一样,服务器A访问服务器B速度过慢,而服务器C访问服务器B很快,服务器A访问服务器C很快。则使用代理服务器提高效率。
      • 缓存

        • 增加客户端缓存,减少对服务器的请求资源的压力。例如maven的nexus就是一个典型的客户端缓存例子。
      • 授权

        • 例如,在公司中,需要对员工电脑进行外网监控授权,则也是使用这种客户端正向代理服务器。
  • 反向代理

    • 特点

      • 反向代理是对服务端的代理

      • 反向代理是架设在服务端的主机

      • 客户端端访问的时候不知道真正服务主机的地址

    • 案例

      • 保护隐藏真正的服务

        • 客户端只能访问服务端代理服务器,而真正的服务端是不能直接访问的,保护了服务端。
      • 分布式路由

        • 根据客户端不同的请求,将请求路由到不同的服务端去。
      • 负载均衡

        • 服务端均摊客户端的请求,保证服务端的高可用。
      • 动静分离

        • 例如图片、静态页面、css、js等,都为静态资源,将其放到对应目录下,客户端加载静态资源时,就不会请求到服务端,而只会将动态资源的请求发送到服务端,减轻服务端的压力。
      • 数据缓存

        • 反向代理同正向代理一样具有数据缓存的功能,都是为了减少服务端的压力。

负载均衡

1、nginx的负载均衡策略有两种:内置策略和扩展策略

2、内置策略:轮询、权重轮询、IP hash、least_conn

3、扩展策略:自己想怎么实现就怎么实现

轮询默认方式
权重(weight) 权重方式
ip_hash 根据IP分配方式
least_conn 最少连接方式
fair(第三方) 响应时间方式
url_hash(第三方) 根据URL分配方式

轮询

轮询是upstream默认的负载均衡策略,每个请求会按时间顺序逐一分配到不同的服务器

参数如下:

命令说明
fail_timeout 与max_fail结合使用
max_fails 设置在fail_timeout设置的时间内的最大失败数
fail_time 服务器会被认为停机的时间长度,默认10s
backup 标记该服务器是备用服务器。当主服务器停止时,请求才会发到
down 标记服务器永久停机了

例子:

#动态服务器组
upstream dynamic_zuoyu {
    server localhost:8080;  #tomcat 7.0
    server localhost:8081;  #tomcat 8.0
    server localhost:8082 backup;  #tomcat 8.5
    server localhost:8083 max_fails=3 fail_timeout=20s;  #tomcat 9.0
}
复制代码

注:此策略适合服务器配置相当,无状态且短平快的服务使用

权重

权重的方式,是在轮询基础上制定轮询的几率;权重分配越高,需要处理的请求越多;此策略也可和ip_hash、least_conn结合使用。

例子:

#动态服务器组
upstream dynamic_zuoyu {
    server localhost:8080 weight=2;  #tomcat 7.0
    server localhost:8081;  #tomcat 8.0
    server localhost:8082 backup;  #tomcat 8.5
    server localhost:8083 max_fails=3 fail_timeout=20s;  #tomcat 9.0
}
复制代码

注:此策略适合服务器硬件配置差异比较大时使用

ip_hash

ip哈希的方式,基于客户端IP来分配,确保统一IP地址的客户端请求都到同一台服务器,保证session会话。可以解决session不能跨域的问题

例子:

#动态服务器组
upstream dynamic_zuoyu {
    ip_hash;    #保证每个访客固定访问一个后端服务器
    server localhost:8080 weight=2;  #tomcat 7.0
    server localhost:8081;  #tomcat 8.0
    server localhost:8082;  #tomcat 8.5
    server localhost:8083 max_fails=3 fail_timeout=20s;  #tomcat 9.0
}
复制代码

注:此策略适合服务器解决session不能跨域的问题时使用

least_conn

最少连接方式,将请求转发给连接数较少的服务端。由于轮询的方式是平均将请求转发给各个服务器,使得负载大致相同。但是也存在其中某些请求的链路过长,占用时间长,导致某一些服务器的负载较高。所以最少连接的方式可以平衡轮询会出现的这种问题

例子:

#动态服务器组
 upstream dynamic_zuoyu {
     least_conn;    #把请求转发给连接数较少的后端服务器
     server localhost:8080   weight=2;  #tomcat 7.0
     server localhost:8081;  #tomcat 8.0
     server localhost:8082 backup;  #tomcat 8.5
     server localhost:8083   max_fails=3 fail_timeout=20s;  #tomcat 9.0
 }
复制代码

注:此策略适合请求时间长短不一造成服务器负载的情况时使用

fair(第三方,需要单独安装插件)

按照服务器的响应时间来分配请求,响应时间短的服务器优先分配(能者多劳)

例子:

#动态服务器组
upstream dynamic_zuoyu {
    server localhost:8080;  #tomcat 7.0
    server localhost:8081;  #tomcat 8.0
    server localhost:8082;  #tomcat 8.5
    server localhost:8083;  #tomcat 9.0
    fair;    #实现响应时间短的优先分配
}
复制代码

url_hash(第三方,需要单独安装插件)

按照url哈希来分配请求到服务器,使得相同的url每次到的服务器一致,这样也可以减轻对服务器的压力(配合缓存命中来使用)

例子:

#动态服务器组
upstream dynamic_zuoyu {
    hash $request_uri;    #实现每个url定向到同一个后端服务器
    server localhost:8080;  #tomcat 7.0
    server localhost:8081;  #tomcat 8.0
    server localhost:8082;  #tomcat 8.5
    server localhost:8083;  #tomcat 9.0
}
复制代码

注:此策略适合同一个资源多次请求的情况时使用

静态web服务器

  • 前后端分离
location / {
    root   /data/paibo_web_8081_css; #前端代码存放路径
    index  index.html index.htm;
}
复制代码
  • 静态资源(文件、图片等)
location /upfile/ {
    root /home/audit_files/; #文件存放路径
    index index.html;
}
复制代码

Nginx的下载与安装

#下载gcc编译器
yum -y install gcc gcc-c++

#下载PCRE
yum -y install pcre-devel openssl-devel

#下载nginx,官方网站是 http://nginx.org ,自己找到需要的版本,右键复制下载链接
wget http://nginx.org/download/nginx-1.19.2.tar.gz

#解压
tar -zxvf nginx-1.19.2.tar.gz

#生成makefile。使用./configure --help查看各个模块的使用情况,使用--without-http_ssi_module的方式关闭不需要的模块。可以使用--with-http_perl_modules方式安装需要的模块
cd nginx-1.19.2

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module 

#编译安装
make && make install

#进入到安装目录
cd /usr/local/nginx/

#将 /usr/local/nginx/sbin/nginx 软连接到 /usr/local/sbin 下,就可以在任意地方使用nginx命令
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

#修改配置文件
vim /usr/local/nginx/conf/nginx.conf

#测试nginx配置文件是否正常
nginx -t

#启动nginx
nginx

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

#外部访问,nginx默认监听80端口
192.168.198.98:80

#重新载入配置文件
nginx -s reload

#重启nginx
nginx -s reopen

#停止nginx
nginx -s stop
复制代码

Nginx+Keepalived实现高可用

#在两台服务器安装nginx,参考<Nginx的下载与安装>
#我这里用的是下面两台服务器,为了区分,做了以下修改
192.168.198.6 #编辑index.html,<h1>Welcome to nginx! 2</h1>
192.168.198.98 #编辑index.html,<h1>Welcome to nginx! 1</h1>

#两台服务器都需要执行以下操作

#下载keepalived安装包
cd /data/soft/
wget https://www.keepalived.org/software/keepalived-2.1.0.tar.gz

#解压安装包
tar -zxvf keepalived-2.1.0.tar.gz

#编译安装
cd keepalived-2.1.0
./configure --prefix=/usr/local/keepalived
make && make install

#keepalived启动脚本变量引用文件,默认文件路径是/etc/sysconfig/,也可以不做软链接,直接修改启动脚本中文件路径即可(安装目录下)
cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/keepalived

#将keepalived主程序加入到环境变量(安装目录下)
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived

#keepalived启动脚本(源码目录下),放到/etc/init.d/目录下就可以使用service命令便捷调用
cp /data/soft/keepalived-2.1.0/keepalived/etc/init.d/keepalived  /etc/init.d/keepalived

#将配置文件放到默认路径下
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf

#加为系统服务
chkconfig –add keepalived

#开机启动
chkconfig keepalived on

#查看开机启动的服务
chkconfig –list

#启动、关闭、重启
service keepalived start|stop|restart

######################### 至此,安装完成;以下就是在keepalived.conf做HA的配置 #########################
vim /etc/keepalived/keepalived.conf

##### master #####
! Configuration File for keepalived
# 全局定义块
global_defs {
   router_id redis-rocketMQ     #标志本节点的字符串,建议使用hostname
}
# keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应>的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"     #检测 nginx 状态的脚本路径
    interval 2                                  #检测时间间隔
    weight -20                                  #如果条件成立,权重-20
}

# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state MASTER                #主节点为MASTER,备用节点为BACKUP
    interface eno16777736       #与本机网卡名称一致
    virtual_router_id 51        #虚拟路由的id号,两个节点必须设置一样
    mcast_src_ip 192.168.198.98
    priority 100                #设置优先级,值范围 0~254,master要比backup高
    nopreempt                   #优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    advert_int 1                #组播信息发送间隔,节点必须设置一致
    authentication {            #设置验证信息,节点必须设置一致
        auth_type PASS
        auth_pass 1111
    }
    #将 track_script 块加入 instance 配置块
    track_script {
        chk_nginx               #执行 Nginx 监控的服务
    }
    virtual_ipaddress {         #虚拟节点池,节点必须设置一样
        192.168.198.111         #虚拟ip,可设置多个
    }
}

##### backup #####
! Configuration File for keepalived

global_defs {
   router_id zk_alone
}
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface eno16777736
    virtual_router_id 51
    mcast_src_ip 192.168.198.6
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.198.111
    }
}

#编写 Nginx 状态检测脚本
#ps -C nginx | wc -l,查看当前有多少个nginx进程
#逻辑:如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程, keepalied将虚拟 ip 绑定到 BACKUP 机器上
vi /etc/keepalived/nginx_check.sh

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
	killall keepalived
fi
fi

#赋权限
chmod +x /etc/keepalived/nginx_check.sh

#启动 两台Keepalived
service keepalived start

#访问虚拟IP
192.168.198.111 # Welcome to nginx! 1

######################### HA测试 #########################
#由于我们写了一个自动启动nginx的脚本再keepalived中,故关闭时,先关闭keepalived,再关闭nginx
192.168.198.98
service keepalived stop
nginx -s stop
#再次访问192.168.198.111查看变化 Welcome to nginx! 2

192.168.198.98
service keepalived start #由于有启动nginx的脚本,故省去启动nginx的操作
#再次访问192.168.198.111查看变化 Welcome to nginx! 1
复制代码

Nginx高并发处理原理

高并发一般是由多进程、多线程和异步机制来处理的,而正好nginx采用了这三种有效的处理高并发的方式。

Nginx的进程模型

​ 进程模型采用Master/Worker 方式。当 nginx 启动的时候,会创建一个 Master 进程,Master进程会根据nginx.conf配置文件中相应的配置项来fork出多个worker子进程去处理请求(怎么处理也是根据配置文件中相应的配置文件)。

​ Master进程负责管理Worker进程的生命周期、处理网络事件、接收外界信号等。由于Master进程可以fork出多个Worker进程,所以说Nginx是多进程的。

Aleyson爱逼逼

Nginx的线程模型

​ 线程模型是指worker进程用于接收和处理客户端请求。每个worker进程可以同时处理多个用户请求。

Aleyson爱逼逼

Nginx的异步处理模型

​ 异步处理模式是指nginx处理请求的时候是采用I/O多路复用技术(select | poll | epoll 模型),即多个 I/O 可以复用一个进程。当 worker 进程接收到客户端的请求后,会调用服务端对其请求进行处理,如果没有立即得到响应结果, worker 进程没有阻塞,而是去处理其他请求,知道有请求被服务端处理完成并返回响应结果。

​ 这里的 worker 进程默认就是采用 epoll 多路复用机制来对服务端进行处理的。当服务端返回响应结果时,回调 epoll 多路复用器,epoll 告知 worker 进程,worker 会挂起当前正在处理的线程,去获取响应结果返回客户端,完成后再去执行被挂起的线程。整个过程中不会出现等待的情况,所以理论上Ngnix的一个进程就可以处理无限数量的连接,而且无需轮询。

​ 注:worker 进程接收客户端请求不是采用的 epoll 模型,而是互斥锁机制;只有对服务端的请求和响应采用的是 epoll 模型。 Aleyson爱逼逼

Nginx的特点

高并发

一个nginx的默认并发量为1024,是因为默认一个woker进程,每个进程处理量为1024,故1*1024;但是,在硬件条件满足的条件下,nginx可以支持5~10w的并发量。具体做法如下:

####################### 操作系统配置 start #######################
#查看当前会话中所有的linux核心配置,而我们只需要关注open file这项
ulimit -a

#查看linux系统的“进程最大可打开文件数的设置”,默认时1024
ulimit -n

#修改“进程最大可打开文件数的设置”
vim /etc/security/limit.conf

#添加下面两行
soft nofile 65535 #应用软件级别限制的最大可打开文件数的限制
hard nofile 65535 #操作系统级别限制的最大可打开文件数的限制

#文件保存后不会马上生效,所以还得更改当前会话级别的配置
ulimit -n 65535
####################### 操作系统配置 end #######################

####################### nginx配置 start #######################
#修改nginx配置文件(下面两行)
vim /src/local/nginx/conf/nginx.conf

user root root;
worker_processes 4;
worker_rlimit_nofile 65535; #这行,看这里看这里
#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; #这行,看这里看这里
}

#热部署重新加载配置文件
nginx -s reload
####################### nginx配置 end #######################

####################### 验证配置是否正确 start #######################
#查看当前nginx进程信息
ps -ef | grep nginx

root     103734      1  0 13:27 ?        00:00:00 nginx: master process nginx
nobody   103735 103734  0 13:27 ?        00:00:00 nginx: worker process
root     105129   3066  0 14:50 pts/0    00:00:00 grep --color=auto nginx

#注意,也是看open files这项
cat /proc/103735/limits
####################### 验证配置是否正确 start #######################

####################### max client计算方式 start #######################
max client = worker_processes * worker_connections
或
max client = worker_processes * worker_connections / 4

#第一种很好理解,进程数*每个进程并发数
#第二种为什么要除以4呢?是因为在nginx官网有这么一段话
Since a browser opens 2 connections by default to a server and nginx uses the fds (file descriptors) from the same pool to connect to the upstream backend。
#就是说,浏览器会建立两条链接到nginx,而nginx也会建立两条链接到服务端,故就是4
####################### max client计算方式 end #######################

复制代码

低消耗

一万个非活跃性链接,消耗内存仅暂用2.5M,故对于一般的dos攻击不受影响,但是ddos还是有问题。

热部署

可以在7*24小时不间断服务提供,进行版本和配置平滑升级

#命令
nginx -s reload

####################### 命令过程解析 start #######################
1、当上面的命令一执行,如果发现配置文件已更改,会创建一个新的主进程
2、当前所有的worker进程不会再接收新的请求并把当前正在处理的请求执行完就关闭
3、master主进程会创建新的worker进程来接收并处理新的请求
####################### 命令过程解析 end #######################

复制代码

高可用

之所以实现高可用,是因为在nginx中,woker都一个一个的进程,就算其中某个进程挂掉了,也对其他的进程没得影响,而且其他的进程会接替出问题的进程。

高扩展

由于nginx是模块化集成,故在我们使用中,缺少什么模块我们就安装什么模块(模块一般分为C语言扩展模块和Lua脚本扩展模块)

#下载模块
git clone https://github.com/agentzh/echo-nginx-module

#放入指定位置
mv echo-nginx-module-master /usr/local/nginx/echo-nginx-module

#就用这个命令生成新的makefile
./configure 
--prefix=/usr/local/nginx 
--with-http_stub_status_module 
--with-http_ssl_module 
--add-module=/usr/local/nginx/echo-nginx-module

#编译(这里只需要make,一定不要执行make install,不然会被覆盖)
make

#备份原文件
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

#替换nginx二进制文件
cp /usr/local/nginx/objs/nginx /usr/local/nginx/sbin/nginx

#重新建立软连接,检测配置文件并平滑启动
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
nginx -t
nginx -s reload

复制代码

Nginx配置文件详解

Aleyson爱逼逼

整体结构

全局块

配置影响nginx的全局指令。包括:

  • 配置运行nginx的服务器用户组

  • worker process数

  • nginx进程

  • pid存放路径

  • 错误日志存放路径

  • 配置文件的引入

events块

配置影响nginx服务器或与用户的网络连接。包括:

  • 设置网络连接的序列化(惊群)

  • 是否允许同时接收多个网络连接

  • 选择事件驱动模型

  • 设置最大连接数

http块

可以嵌套多个server模块,配置代理、缓存、日志定义等和第三方模块的配置。包括:

  • 定义MIMI-Type

  • 自定义服务日志格式

  • 允许sendfile方式传输文件

  • 连接超时时间

  • 单连接请求数上限

server块

配置虚拟主机相关参数。包括:

  • 配置网络监听

  • 配置基于名称的虚拟主机

  • 配置基于IP的虚拟主机

location块

配置请求的路由,以及页面和其他静态资源的处理。包括:

  • location配置

  • 请求根目录配置更改

  • URL

  • 网站默认首页配置

配置清单例析

Aleyson爱逼逼

详解

配置文件一

########### 每个指令必须有分号结束 #################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;  #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;  #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;  #最大连接数,默认为512
}
http {
    include       mime.types;  #文件扩展名与文件类型映射表
    default_type  application/octet-stream;  #默认文件类型,默认为text/plain
    #access_log off;  #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';  #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;  #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com;  #错误页
    server {
        keepalive_requests 120;  #单连接请求上限次数。
        listen       4545;  #监听端口
        server_name  127.0.0.1;  #监听地址       
        location  ~*^.+$ {  #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54;  #允许的ip           
        } 
    }
}
复制代码

配置文件二

#运行用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes  1;

#全局错误日志及PID文件
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

#工作模式及连接数上限
events {
    #epoll是多路复用IO(I/O Multiplexing)中的一种方式,
    #仅用于linux2.6以上内核,可以大大提高nginx的性能
    use   epoll; 

    #单个后台worker process进程的最大并发链接数    
    worker_connections  1024;

    # 并发总数是 worker_processes 和 worker_connections 的乘积
    # 即 max_clients = worker_processes * worker_connections
    # 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4  为什么
    # 为什么上面反向代理要除以4,上面反向代理案例是有讲到
    # 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
    # worker_connections 值的设置跟物理内存大小有关
    # 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
    # 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
    # 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
    # $ cat /proc/sys/fs/file-max
    # 输出 34336
    # 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
    # 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
    # 使得并发总数小于操作系统可以打开的最大文件数目
    # 其实质也就是根据主机的物理CPU和内存进行配置
    # 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
    # ulimit -SHn 65535
}


http {
    #设定mime类型,类型由mime.type文件定义
    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 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
    #对于普通应用,必须设为 on,
    #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
    #以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile     on;
    #tcp_nopush     on;

    #连接超时时间
    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay     on;

    #开启gzip压缩
    gzip  on;
    gzip_disable "MSIE [1-6].";

    #设定请求缓冲
    client_header_buffer_size    128k;
    large_client_header_buffers  4 128k;

    #设定虚拟主机配置
    server {
        #监听80端口
        listen    80;
        #定义使用 www.nginx.cn访问
        server_name  www.nginx.cn;

        #定义服务器的默认网站根目录位置
        root html;

        #设定本虚拟主机的访问日志
        access_log  logs/nginx.access.log  main;

        #默认请求
        location / {
            #定义首页索引文件的名称
            index index.php index.html index.htm;   
        }

        # 定义错误提示页面
        error_page   500 502 503 504 /50x.html;
        location = /50x.html {
        }

        #静态文件,nginx自己处理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            #过期30天,静态文件不怎么更新,过期可以设大一点,
            #如果频繁更新,则可以设置得小一点。
            expires 30d;
        }

        #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
        location ~ .php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include fastcgi_params;
        }

        #禁止访问 .htxxx 文件
        location ~ /.ht {
            deny all;
        }
    }
}
复制代码

配置文件三

worker_processes 8; #nginx进程数,建议设置为等于CPU总核心数.

error_log /var/log/nginx/error.log info; #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]

pid /var/run/nginx.pid; #进程文件

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工作模式与连接数上限
events{
  #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
  use epoll;
  #单个进程最大连接数(最大连接数=连接数*进程数)
  worker_connections 65535;
}

#设定http服务器
http{
    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    #charset utf-8; #默认编码
    server_names_hash_bucket_size 128; #服务器名字的hash表大小
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓
    client_max_body_size 8m; #设定请求缓
    sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
    tcp_nopush on; #防止网络阻塞
    tcp_nodelay on; #防止网络阻塞
    keepalive_timeout 120; #长连接超时时间,单位是秒

    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
    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;

    #gzip模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k; #最小压缩文件大小
    gzip_buffers 4 16k; #压缩缓冲区
    gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2; #压缩等级
    gzip_types text/plain application/x-javascript text/css application/xml;
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
    gzip_vary on;
    #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

    upstream blog.ha97.com {
        #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
        server 192.168.80.121:80 weight=3;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;
    }

    #虚拟主机的配置
    server{
        listen 80;    #监听端口
        server_name aa.cn www.aa.cn ; #server_name end  #域名可以有多个,用空格隔开
        index index.html index.htm index.php;  # 设置访问主页
        set $subdomain '';  # 绑定目录为二级域名 bbb.aa.com  根目录 /bbb  文件夹
        if( $host ~* "(?:(\w+\.){0,})(\b(?!www\b)\w+)\.\b(?!(com|org|gov|net|cn)\b)\w+\.[a-zA-Z]+" ){ 
            set $subdomain "/$2"; 
        }

        root /home/wwwroot/aa.cn/web$subdomain;# 访问域名跟目录  
        include rewrite/dedecms.conf; #rewrite end   #载入其他配置文件

        location ~ .*.(php|php5)?$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
        #图片缓存时间设置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires 10d;
        }
        #JS和CSS缓存时间设置
        location ~ .*.(js|css)?$ {
        expiresexpires 1h;
        }

    }

    #日志格式设定
    log_format access '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for';
    #定义本虚拟主机的访问日志
    access_log /var/log/nginx/ha97access.log access;

    #对 "/" 启用反向代理
    location / {
        proxy_pass http://127.0.0.1:88;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;

        #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        #以下是一些反向代理的配置,可选。
        proxy_set_header Host $host;
        client_max_body_size 10m; #允许客户端请求的最大单文件字节数
        client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
        proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
        proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
        proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
        proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
        proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
        proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
        proxy_temp_file_write_size 64k;
        #设定缓存文件夹大小,大于这个值,将从upstream服务器传
    }
    #设定查看Nginx状态的地址
    location /NginxStatus {
        stub_status on;
        access_log on;
        auth_basic "NginxStatus";
        auth_basic_user_file conf/htpasswd;
        #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
    }
    #本地动静分离反向代理配置
    #所有jsp的页面均交由tomcat或resin处理
    location ~ .(jsp|jspx|do)?$ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8080;
    }
    #所有静态文件由nginx直接读取不经过tomcat或resin
    location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
    	expires 15d;
    }

    location ~ .*.(js|css)?${
    	expires 1h;
    }
}
复制代码

配置文件四

######Nginx配置文件nginx.conf中文详解#####
  
#定义Nginx运行的用户和用户组
user www www;
  
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;
  
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /usr/local/nginx/logs/error.log info;
  
#进程pid文件
pid /usr/local/nginx/logs/nginx.pid;
  
#指定进程可以打开的最大描述符:数目
#工作模式与连接数上限
#这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
#现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。
#这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
worker_rlimit_nofile 65535;
  
  
events{
 #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
 #是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。
 #补充说明:
 #与apache相类,nginx针对不同的操作系统,有不同的事件模型
 #A)标准事件模型
 #Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
 #B)高效事件模型
 #Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
 #Epoll:使用于Linux内核2.6版本及以后的系统。
 #/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
 #Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
 use epoll;
  
 #单个进程最大连接数(最大连接数=连接数*进程数)
 #根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
 worker_connections 65535;
  
 #keepalive超时时间。
 keepalive_timeout 60;
  
 #客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
 #分页大小可以用命令getconf PAGESIZE 取得。
 #[root@web001 ~]# getconf PAGESIZE
 #4096
 #但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。
 client_header_buffer_size 4k;
  
 #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
 open_file_cache max=65535 inactive=60s;
  
 #这个是指多长时间检查一次缓存的有效信息。
 #语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使用字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息.
 open_file_cache_valid 80s;
  
 #open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
 #语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 使用字段:http, server, location 这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态.
 open_file_cache_min_uses 1;
  
 #语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 使用字段:http, server, location 这个指令指定是否在搜索一个文件是记录cache错误.
 open_file_cache_errors on;
}
  
  
  
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http{
 #文件扩展名与文件类型映射表
 include mime.types;
  
 #默认文件类型
 default_type application/octet-stream;
  
 #默认编码
 #charset utf-8;
  
 #服务器名字的hash表大小
 #保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.
 server_names_hash_bucket_size 128;
  
 #客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
 client_header_buffer_size 32k;
  
 #客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。
 large_client_header_buffers 4 64k;
  
 #设定通过nginx上传文件的大小
 client_max_body_size 8m;
  
 #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
 #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
 sendfile on;
  
 #开启目录列表访问,合适下载服务器,默认关闭。
 autoindex on;
  
 #此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
 tcp_nopush on;
   
 tcp_nodelay on;
  
 #长连接超时时间,单位是秒
 keepalive_timeout 120;
  
 #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
 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;
  
 #gzip模块设置
 gzip on; #开启gzip压缩输出
 gzip_min_length 1k; #最小压缩文件大小
 gzip_buffers 4 16k; #压缩缓冲区
 gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
 gzip_comp_level 2; #压缩等级
 gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
 gzip_vary on;
  
 #开启限制IP连接数的时候需要使用
 #limit_zone crawler $binary_remote_addr 10m;
  
 #负载均衡配置
 upstream piao.jd.com {
   
  #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
  server 192.168.80.121:80 weight=3;
  server 192.168.80.122:80 weight=2;
  server 192.168.80.123:80 weight=3;
  
  #nginx的upstream目前支持4种方式的分配
  #1、轮询(默认)
  #每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
  #2、weight
  #指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
  #例如:
  #upstream bakend {
  # server 192.168.0.14 weight=10;
  # server 192.168.0.15 weight=10;
  #}
  #2、ip_hash
  #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
  #例如:
  #upstream bakend {
  # ip_hash;
  # server 192.168.0.14:88;
  # server 192.168.0.15:80;
  #}
  #3、fair(第三方)
  #按后端服务器的响应时间来分配请求,响应时间短的优先分配。
  #upstream backend {
  # server server1;
  # server server2;
  # fair;
  #}
  #4、url_hash(第三方)
  #按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
  #例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
  #upstream backend {
  # server squid1:3128;
  # server squid2:3128;
  # hash $request_uri;
  # hash_method crc32;
  #}
  
  #tips:
  #upstream bakend{#定义负载均衡设备的Ip及设备状态}{
  # ip_hash;
  # server 127.0.0.1:9090 down;
  # server 127.0.0.1:8080 weight=2;
  # server 127.0.0.1:6060;
  # server 127.0.0.1:7070 backup;
  #}
  #在需要使用负载均衡的server中增加 proxy_pass http://bakend/;
  
  #每个设备的状态设置为:
  #1.down表示单前的server暂时不参与负载
  #2.weight为weight越大,负载的权重就越大。
  #3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
  #4.fail_timeout:max_fails次失败后,暂停的时间。
  #5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
  
  #nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
  #client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
  #client_body_temp_path设置记录文件的目录 可以设置最多3层目录
  #location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡
 }
   
 #虚拟主机的配置
 server {
  #监听端口
  listen 80;
  
  #域名可以有多个,用空格隔开
  server_name www.jd.com jd.com;
  index index.html index.htm index.php;
  root /data/www/jd;
  
  #对******进行负载均衡
  location ~ .*.(php|php5)?$ {
   fastcgi_pass 127.0.0.1:9000;
   fastcgi_index index.php;
   include fastcgi.conf;
  }
    
  #图片缓存时间设置
  location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
   expires 10d;
  }
    
  #JS和CSS缓存时间设置
  location ~ .*.(js|css)?$ {
   expires 1h;
  }
    
  #日志格式设定
  #$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
  #$remote_user:用来记录客户端用户名称;
  #$time_local: 用来记录访问时间与时区;
  #$request: 用来记录请求的url与http协议;
  #$status: 用来记录请求状态;成功是200,
  #$body_bytes_sent :记录发送给客户端文件主体内容大小;
  #$http_referer:用来记录从那个页面链接访问过来的;
  #$http_user_agent:记录客户浏览器的相关信息;
  #通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
  log_format access '$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" $http_x_forwarded_for';
    
  #定义本虚拟主机的访问日志
  access_log /usr/local/nginx/logs/host.access.log main;
  access_log /usr/local/nginx/logs/host.access.404.log log404;
    
  #"/" 启用反向代理
  location / {
   proxy_pass http://127.0.0.1:88;
   proxy_redirect off;
   proxy_set_header X-Real-IP $remote_addr;
     
   #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     
   #以下是一些反向代理的配置,可选。
   proxy_set_header Host $host;
  
   #允许客户端请求的最大单文件字节数
   client_max_body_size 10m;
  
   #缓冲区代理缓冲用户端请求的最大字节数,
   #如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
   #无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误
   client_body_buffer_size 128k;
  
   #表示使nginx阻止HTTP应答代码为400或者更高的应答。
   proxy_intercept_errors on;
  
   #后端服务器连接的超时时间_发起握手等候响应超时时间
   #nginx跟后端服务器连接超时时间(代理连接超时)
   proxy_connect_timeout 90;
  
   #后端服务器数据回传时间(代理发送超时)
   #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
   proxy_send_timeout 90;
  
   #连接成功后,后端服务器响应时间(代理接收超时)
   #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
   proxy_read_timeout 90;
  
   #设置代理服务器(nginx)保存用户头信息的缓冲区大小
   #设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
   proxy_buffer_size 4k;
  
   #proxy_buffers缓冲区,网页平均在32k以下的设置
   #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
   proxy_buffers 4 32k;
  
   #高负荷下缓冲大小(proxy_buffers*2)
   proxy_busy_buffers_size 64k;
  
   #设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
   #设定缓存文件夹大小,大于这个值,将从upstream服务器传
   proxy_temp_file_write_size 64k;
  }
    
    
  #设定查看Nginx状态的地址
  location /NginxStatus {
   stub_status on;
   access_log on;
   auth_basic "NginxStatus";
   auth_basic_user_file confpasswd;
   #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
  }
    
  #本地动静分离反向代理配置
  #所有jsp的页面均交由tomcat或resin处理
  location ~ .(jsp|jspx|do)?$ {
   proxy_set_header Host $host;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_pass http://127.0.0.1:8080;
  }
    
  #所有静态文件由nginx直接读取不经过tomcat或resin
  location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|
  pdf|xls|mp3|wma)$ {
   expires 15d; 
  }
    
  location ~ .*.(js|css)?$ {
   expires 1h;
  }
 }
}
######Nginx配置文件nginx.conf中文详解#####
复制代码

配置文件五

user                              nobody nobody;   ## 指定运行用户和组
worker_processes                  4;               ## 指定worker数量,建议此处auto
worker_rlimit_nofile              51200;           ## 最大打开文件描述符

error_log                         logs/error.log  notice;

pid                               /var/run/nginx.pid;

events {
  use                             epoll;            ## 使用epoll事件驱动模型
  worker_connections              51200;            ## 一个worker能处理的最大并发
}

http {
  server_tokens                   off;              ## 隐藏nginx版本
  include                         mime.types;        

  proxy_redirect                off;                ## 关闭代理重定向
  proxy_set_header              Host $host;            
  proxy_set_header              X-Real-IP $remote_addr;
  proxy_set_header              X-Forwarded-For $proxy_add_x_forwarded_for;
  client_max_body_size          20m;            	## 设置客户端请求body的最大允许大小
  client_body_buffer_size       256k; 				## 设置客户端请求body的缓冲区大小
  proxy_connect_timeout         90;                	 ## 与后端服务器连接的超时时长
  proxy_send_timeout            90;                	## 把请求发送给后端服务器的超时时长
  proxy_read_timeout            90;                	## 等待后端服务器发送响应报文的超时时长
  proxy_buffer_size             128k;            	 ## 从代理服务器接收的响应的第一部分缓冲区
  proxy_buffers                 4 64k;            ## 从代理服务器读取响应的缓冲区number和size
  proxy_busy_buffers_size       128k;            ## 限制size在响应尚未完全读取时可能忙于向客户端发送响应的缓冲区总数
  proxy_temp_file_write_size    128k;            ## 该指令设置缓冲临时文件的最大值

  default_type                    application/octet-stream;
  charset                         utf-8;        ## 字符集
  
  client_body_temp_path           /var/tmp/client_body_temp 1 2;  ## 请求body临时目录
  proxy_temp_path                 /var/tmp/proxy_temp 1 2;    ## 代理服务器接受数据临时目录
  fastcgi_temp_path               /var/tmp/fastcgi_temp 1 2; ## FastCGI服务器接收临时目录 
  uwsgi_temp_path                 /var/tmp/uwsgi_temp 1 2; ## uwsgi 服务器接收临时目录
  scgi_temp_path                  /var/tmp/scgi_temp 1 2; ##scgi服务器接收临时目录

  ignore_invalid_headers          on;        ## 开启控制忽略具有无效名称的标头字段
  server_names_hash_max_size      256;        ## 服务器名称哈希表的最大值
  server_names_hash_bucket_size   64;        ## 服务器名称哈希表存储bucket大小
  client_header_buffer_size       8k;        ## 设置缓冲区以读取客户端请求标头
  large_client_header_buffers     4 32k;    ## 设置缓冲区以读取客户端请求标头最大值number和size
  connection_pool_size            256;        ## 允许精确调整每个连接的内存分配
  request_pool_size               64k;        ## 允许精确调整每个请求的内存分配

  output_buffers                  2 128k;    ## 设置用于从磁盘读取响应的缓冲区number和size
  postpone_output                 1460;        ## 客户端数据的传输最小值,单位字节

  client_header_timeout           1m;        ## 定义读取客户端请求标头的超时时长
  client_body_timeout             3m;        ## 定义读取客户端请求主体的超时时长
  send_timeout                    3m;        ## 设置将响应传输到客户端的超时时长


  log_format main                 '$server_addr $remote_addr [$time_local] $msec+$connection '
                                  '"$request" $status $connection $request_time $body_bytes_sent "$http_referer" '
                                  '"$http_user_agent" "$http_x_forwarded_for"';

  open_log_file_cache               max=1000 inactive=20s min_uses=1 valid=1m;

  access_log                      logs/access.log      main;
  log_not_found                   on;

  sendfile                        on;            
  tcp_nodelay                     on;        ## 启用长连接马上响应,提高性能
  tcp_nopush                      off;        ## 关闭套接字选项

  reset_timedout_connection       on;        ## 启用重置超时连接
  keepalive_timeout               10 5;        ## 第一个参数设置长连接超时时长,第二个浏览器识别为keep-alive:timeout=5
  keepalive_requests              100;        ## 设置可通过一个保持活动连接提供的最大请求数

  gzip                            on;        ## 开启压缩
  gzip_http_version               1.1;        ## 启用压缩时协议最小版本
  gzip_vary                       on;         
  gzip_proxied                    any;        ## 为所有代理请求启用压缩
  gzip_min_length                 1024;        ## 设置将被gzip压缩的响应的最小长度
  gzip_comp_level                 6;        ## 设置压缩等级
  gzip_buffers                    16 8k;    ## 设置用于压缩响应的缓冲区number和size
  gzip_proxied                    expired no-cache no-store private auth no_last_modified no_etag;
  gzip_types                      text/plain application/x-javascript text/css application/xml application/json;
  gzip_disable                    "MSIE [1-6]\.(?!.*SV1)";

  upstream tomcat8080 {
    ip_hash;

    server                        172.16.100.103:8080 weight=1 max_fails=2;
    server                        172.16.100.104:8080 weight=1 max_fails=2;
    server                        172.16.100.105:8080 weight=1 max_fails=2;
  }

  server {
    listen                        80;
    server_name                   www.chan.com;
    # config_apps_begin
    root                          /data/webapps/htdocs;
    access_log                    /var/logs/webapp.access.log     main;
    error_log                     /var/logs/webapp.error.log      notice;

    location / {
    
      location ~* ^.*/favicon.ico$ {
        root                      /data/webapps;
        expires                   180d;        ## 缓存180天
        break;
      }
    
      if ( !-f $request_filename ) {
        proxy_pass                http://tomcat8080;
        break;
      }
    }

    error_page                    500 502 503 504  /50x.html;
    location = /50x.html {
      root                        html;
    }
  }

  server {
    listen                        8088;
    server_name                   nginx_status;

    location / {
      access_log                  off;
      deny                        all;
      return                      503;
    }
    location /status {
      stub_status                 on;
      access_log                  off;
      allow                       127.0.0.1;
      allow                       172.16.100.71;
      deny                        all;
    }
  }
}
复制代码

性能调优

全局模块下的 调优

# 设置进程数
worker_processes 2;
# 设置内核数量以及进程使用内核情况
worker_cpu_affinity 01 10;
# 可打开最大文件数
worker_rlimit_nofile 65535;
复制代码
  1. worker_processes

    ​ worker的进程数,该值一般设置为CPU内核数,或者内核的整倍数。例:当前有2个4核的CPU,那么将worker_processes的值可以设置为8或16,也阔以设置为4。这个不仅仅取决于CPU内核数,也与磁盘数量和负载均衡模式有关系,在不知道怎么做的时候可以设置为auto。

  2. worker_cpu_affinity

    ​ 将worker进程与cpu内核进行绑定,该配置是以多位二进制数进行设置。例:如上配置的情况,代表四个内核,0代表关闭,1代表开启。

    内核数量worker_processesworker_cpu_affinity解释
    2 2 0001 0010 0100 1000 每个进程各使用一个内核
    2 4 01 10 01 10 4个进程交替使用两个内核
    4 2 0101 1010 每个进程使用两个内核
    4 4 0001 0010 0100 1000 每个进程各使用一个内核
  3. worker_rlimit_nofile

    ​ 设置一个worker进程最大能打开的文件数。默认值与当前linux系统的设置的最大能打开的文件描述符一致。见上 《高并发》章节。

events模块下的调优

events {
    # 设置worker进程与客户端的连接方式(事件驱动模型)
    use epoll;
    # 设置worker进程最大的连接数,默认为512
    worker_connections  1024;
    # 设置网路连接序列化,防止惊群现象发生,默认为on
    accept_mutex on;
    accept_mutex_delay 500ms;
    # 设置一个进程是否同时接受多个网络连接,默认为off
    multi_accept on;
}
复制代码
  1. use

    ​ 设置worker进程与客户端连接的方式。而nginx支持多种连接方式,默认nginx会根据当前版本选择当前系统最高效的方式;而我们也阔以自行设定,该值可设置为select | poll | epoll | kqueue 等。这里涉及到 I/O 多路复用,在结尾来讲吧。

  2. worker_connections

    ​ 设置每个worker进程可以处理的最大并发数,该值不能超过 worker_rlimit_nofile 的值

  3. accept_mutex

    ​ 设置worker的接收互斥锁,当前所有空闲worker进程被放进了一个阻塞队列,等在新的连接来。如果开启:系统会创建一个互斥锁,而只有阻塞队列队首的worker进程可以获取锁,进而获得新的连接(预防惊群现象);如果关闭:阻塞队列中所有的worker进程都会尝试获得新的连接,这就是惊群现象。

  4. multi_accept

    ​ 设置一个worker进程是否可以一次处理多个连接。如果开启:当多个新的连接来的时候,server会计算当前每个worker进程正在处理的连接数,选取一个最少的,将多个新的连接全交给他;如果关闭:当多个新的连接来的时候,server会根据负载均衡算法,依次将新的连接分配给当前处理连接最少的woker进程。

http模块下的调优

http {
    # 将当前目录(conf 目录)中的 mime.types 文件包含进来
    include       mime.types;
    # 对于无扩展名的文件,默认其为 application/octet-stream 类型,即 Nginx 会将其作为一个八进制流文件来处理
    default_type  application/octet-stream;
    # 设置请求与响应的字符编码
    charset utf-8;
    # 设置日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    # 开启访问日志,存放路径为logs/access.log,以log_format  main格式存放
    access_log  logs/access.log  main;
    log_format  postdata  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                                          ' $request_body'
                      '"$http_user_agent" "$http_x_forwarded_for"';
    # 设置为 on 则开启 Linux 系统的零拷贝机制,否则不启用零拷贝。当然,开启后是否起作用,要看所使用的系统版本。CentOS6 及其以上版本支持 sendfile 零拷贝。注意:如果图片显示不正常把这个改成off。
    sendfile        on;
    # 防止网络阻塞
    tcp_nopush     on;
    # 设置数据发送缓存
    tcp_nodelay     on;
    # 设置客户端与Nginx间所建立的长连接的生命超时时间,时间到达,则连接将自动关闭。单位秒
    keepalive_timeout  65;
    # 设置一个长连接发出最多的请求数
    keepalive_requests  2000;
    #开启gzip压缩
    gzip  on;
    # 设定请求缓冲
    client_header_buffer_size    128k;
    large_client_header_buffers  4 128k;

    upstream api {
        server 127.0.0.1:19090 weight=1;
    }
    # 虚拟主机
    server {
        listen       445 ssl;
        server_name  localhost;
        ssl_certificate /usr/local/nginx/conf/server.crt;
        ssl_certificate_key /usr/local/nginx/conf/server.key;

        location  ^~ /api/ {
            #设置代理
            proxy_set_header Host $host;
            #proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass http://api/;
        }

        location /upfile/ {
            root  /home/audit_files;
            add_header Access-Control-Allow-Origin *;
        }
        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
复制代码
  1. sendfile

    ​ 设置为 on 则开启 Linux 系统的零拷贝机制,否则不启用零拷贝。当然,开启后是否起作用,要看所使用的系统版本。CentOS6 及其以上版本支持 sendfile 零拷贝。注意:如果图片显示不正常把这个改成 off。

  2. tcp_nopush

    ​ 设置是否将nginx的响应头单独发送,如果开启:则会以单独的形式发送nginx的响应头,而真实的响应体数据会在单独以数据包的形式发送;如果关闭:则会将nginx的响应头和真实的响应体数据一起发送,每个响应都会包含。

  3. tcp_nodelay

    ​ 设置数据发送缓存,如果开启:不设置数据发送缓存,适合传输小数据;如果关闭:开启数据发送缓存,如果传输图片等大文件,建议设置为 off。

  4. keepalive_timeout

    ​ 设置连接活跃时间,如果超时则断开连接。若设置为0,则表示禁止keepalive连接。如果传输的数据量小,且系统运算量很小,则可以将该值设置小一些;反之。

  5. keepalive_requests

    ​ 设置一个长连接发送请求的最大数。如果当前系统并发量大,而如果 该值 设置很小,则会导致keepalive_timeout 时间还未到,但是keepalive_requests上限已经到了。故我们需要根据真实系统并发量和连接活跃时间来设置该值。

  6. client_body_timeout

    ​ 设置客户端获取响应的超时时间。如果超时了 ,则认为请求失败。可根据此值得设置来做接口的简单小压测,并且 可设置一个合理的值,保证请求响应的最优。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

###########################################################################nginx配置优化#################################################################

 

1、nginx基本优化

安装方式有2种:

1、源码包安装

2、yum(apt-get)安装

区别为如果用yum安装的话,很方便,并且基本不报错。如果对性能要求不是很高的话,可以采用这种安装方式(比如测试环境)

如果是源码包安装的话,因为在服务器上编译的软件,会让nginx的性能相对更高一些,建议生产环境使用源码包安装

基本配置优化(优化后配置样例,可以改后直接上生产)

#头部配置
user  nginx nginx;    #定义nginx的启动用户,不建议使用root
worker_processes  4;  #定位为cpu的内核数量,因为我的环境配置是4核,所以就写4。不过这值最多也就是8,8个以上也就没什么意义了,想继续提升性能只能参考下面一项配置
worker_cpu_affinity 0001 0010 0100 1000;  #此项配置为开启多核CPU,对你先弄提升性能有很大帮助nginx默认是不开启的,1为开启,0为关闭,因此先开启第一个倒过来写,
第一位0001(关闭第四个、关闭第三个、关闭第二个、开启第一个)
第二位0010(关闭第四个、关闭第三个、开启第二个、关闭第一个)
第三位0100(关闭第四个、开启第三个、关闭第二个、关闭第一个)
后面的依次类推,有智商的应该都可以看懂了吧?  那么如果是16核或者8核cpu,就注意为00000001、00000010、00000100,总位数与cpu核数一样。
 
error_log  /data/logs/nginx/error.log crit;      #这两项基本不用我说
pid        /usr/local/nginx/nginx.pid;
 
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;    #这个值为nginx的worker进程打开的最大文件数,如果不配置,会读取服务器内核参数(通过ulimit -a查看),如果内核的值设置太低会让nginx报错(too many open
file),但是在此设置后,就会读取自己配置的参数不去读取内核参数
 
events
{
  use epoll;    #客户端线程轮询方法、内核2.6版本以上的建议使用epoll
  worker_connections 65535;  #设置一个worker可以打开的最大连接数
}
http {
        include       mime.types;
        default_type  application/octet-stream;
 
        #charset  gb2312;
        server_tokens  off;    #为错误页面上的nginx版本信息,建议关闭,提升安全性
 
        server_names_hash_bucket_size 128;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 8m;
 
        sendfile on;      #开启sendfile()函数,sendfile可以再磁盘和tcp socket之间互相copy数据。
        tcp_nopush     on;  #告诉nginx在数据包中发送所有头文件,而不是一个一个的发
 
        #keepalive_timeout 15;
        keepalive_timeout 120;
 
        tcp_nodelay on;
 
        proxy_intercept_errors on;
        fastcgi_intercept_errors on;
        fastcgi_connect_timeout 1300;
        fastcgi_send_timeout 1300;
        fastcgi_read_timeout 1300;
        fastcgi_buffer_size 512k;
        fastcgi_buffers 4 512k;
        fastcgi_busy_buffers_size 512k;
        fastcgi_temp_file_write_size 512k;
 
        proxy_connect_timeout      20s;
        proxy_send_timeout         30s;
        proxy_read_timeout         30s;
 
 
 
        gzip on;            #gzip是告诉nginx采用gzip后的数据来传输文件,会大量减少我们的发数据的量
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.0;
        gzip_comp_level 2;
        gzip_types       text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
        gzip_vary on;
        gzip_disable msie6;
        #limit_zone  crawler  $binary_remote_addr  10m;
 
log_format  main  '$http_host $remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" '
                  '$request_time $upstream_response_time';
 
 #proxy_temp_path和proxy_cache_path指定的路径必须在同一分区,因为它们之间是硬链接的关系
 #proxy_temp_path /var/cache/nginx/proxy_temp_dir;
 #设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
 #proxy_cache_path /var/cache/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
 
        include /usr/local/nginx/conf/vhosts/*.conf;
 
        error_page  404   = https://www.niu.com/404/;
        #error_page   500 502 503 504 = http://service.niu.com/alien/;
 
 }

如果是高并发架构,需要在nginx的服务器上添加如下的内核参数

这些参数追加到/etc/sysctl.conf,然后执行sysctl -p 生效。

#每个网络接口接收数据包速度比内核处理速度快的时候,允许发送队列数目数据包的最大数
net.core.netdev_max_backlog = 262144

#调节系统同时发起的tcp连接数
net.core.somaxconn = 262144

#该参数用于设定系统中最多允许存在多少TCP套接字不被关联到任何一个用户文件句柄上,主要目的为防止Ddos攻击
net.ipv4.tcp_max_orphans = 262144

#该参数用于记录尚未收到客户端确认信息的连接请求的最大值
net.ipv4.tcp_max_syn_backlog = 262144

#nginx服务上建议关闭(既为0)
net.ipv4.tcp_timestamps = 0

#该参数用于设置内核放弃TCP连接之前向客户端发送SYN+ACK包的数量,为了建立对端的连接服务,服务器和客户端需要进行三次握手,第二次握手期间,内核需要发送SYN并附带一个回应前一个SYN的ACK,这个参
数主要影响这个过程,一般赋予值为1,即内核放弃连接之前发送一次SYN+ACK包。
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1

2、nginx配置lua,添加接口返回值,方便开发debug,

3、nginx配置https

#server端基本配置<br>server {
    listen 80;
    listen 443 ssl spdy;
    server_name io.123.com;
    include      ssl/io.com;      #注意看下一个文件
    location / {
        proxy_pass http://lb_io;
        if ($scheme = http ) {
        return 301 https://$host$request_uri;    #此项配置为转换为https的基本配置
        }
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
 
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
 
    access_log /data/logs/nginx/access/niuaero.log main;
}
  

ssl_certificate      ssl/ca/io.com.pem;    #这个为购买的https证书,供应商会生成
ssl_certificate_key  ssl/ca/io.com.key;
ssl_session_timeout  5m;
ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
#启用TLS1.1、TLS1.2要求OpenSSL1.0.1及以上版本,若您的OpenSSL版本低于要求,请使用 ssl_protocols TLSv1;
ssl_ciphers  HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
ssl_prefer_server_ciphers   on;

4、nginx配置反爬虫

#以下内容添加nginx虚拟主机配置里,proxypass之后<br><br>if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) { 
     return 403; 
} 
 
#禁止指定UA及UA为空的访问 
if ($http_user_agent ~ "WinHttp|WebZIP|FetchURL|node-superagent|java/|FeedDemon|Jullo|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|Java|Feedly|Apache-HttpAsyncClient|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|BOT/0.1|YandexBot|FlightDeckReports|Linguee Bot|^$" ) { 
     return 403;              
} 
 
#禁止非GET|HEAD|POST方式的抓取 
if ($request_method !~ ^(GET|HEAD|POST)$) { 
    return 403; 
} 
posted @ 2021-02-23 12:10  woaibaobei  阅读(667)  评论(0编辑  收藏  举报