Nginx全能解析及性能调优

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

正向代理和反向代理

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

  • 正向代理
  • 特点
  • 正向代理是对客户端的代理
  • 正向代理是架设在客户端的主机
  • 客户端在使用正向代理服务器时是要知道访问的目标服务的地址
  • 案例
  • 隐藏真正的访问者
  • 向服务端隐藏真正的访问者。对于服务端来说,真正的访问者时代理服务器。起到了隐藏客户端的作用。例如:实际生活中的短信轰炸,你根本不知道是谁给你发的短信;ddos攻击也是这个原理,使用很多‘肉鸡’机器来攻击我们的服务器,我们无法查找真正的攻击源。
  • 提速
  • 同上原理一样,服务器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是多进程的。

nginx哪代版本最稳定_nginx哪代版本最稳定

Nginx的线程模型

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

nginx哪代版本最稳定_nginx_02

Nginx的异步处理模型

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

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

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

nginx哪代版本最稳定_nginx哪代版本最稳定_03

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

nginx哪代版本最稳定_nginx_04

整体结构

全局块

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

  • 配置运行nginx的服务器用户组
  • worker process数
  • nginx进程
  • pid存放路径
  • 错误日志存放路径
  • 配置文件的引入

events块

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

  • 设置网络连接的序列化(惊群)
  • 是否允许同时接收多个网络连接
  • 选择事件驱动模型
  • 设置最大连接数

http块

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

  • 定义MIMI-Type
  • 自定义服务日志格式
  • 允许sendfile方式传输文件
  • 连接超时时间
  • 单连接请求数上限

server块

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

  • 配置网络监听
  • 配置基于名称的虚拟主机
  • 配置基于IP的虚拟主机

location块

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

  • location配置
  • 请求根目录配置更改
  • URL
  • 网站默认首页配置

配置清单例析

nginx哪代版本最稳定_nginx_05

详解

配置文件一

########### 每个指令必须有分号结束 #################
#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;