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是多进程的。
Nginx的线程模型
线程模型是指worker进程用于接收和处理客户端请求。每个worker进程可以同时处理多个用户请求。
Nginx的异步处理模型
异步处理模式是指nginx处理请求的时候是采用I/O多路复用技术(select | poll | epoll 模型),即多个 I/O 可以复用一个进程。当 worker 进程接收到客户端的请求后,会调用服务端对其请求进行处理,如果没有立即得到响应结果, worker 进程没有阻塞,而是去处理其他请求,知道有请求被服务端处理完成并返回响应结果。
这里的 worker 进程默认就是采用 epoll 多路复用机制来对服务端进行处理的。当服务端返回响应结果时,回调 epoll 多路复用器,epoll 告知 worker 进程,worker 会挂起当前正在处理的线程,去获取响应结果返回客户端,完成后再去执行被挂起的线程。整个过程中不会出现等待的情况,所以理论上Ngnix的一个进程就可以处理无限数量的连接,而且无需轮询。
注:worker 进程接收客户端请求不是采用的 epoll 模型,而是互斥锁机制;只有对服务端的请求和响应采用的是 epoll 模型。
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的服务器用户组
-
worker process数
-
nginx进程
-
pid存放路径
-
错误日志存放路径
-
配置文件的引入
events块
配置影响nginx服务器或与用户的网络连接。包括:
-
设置网络连接的序列化(惊群)
-
是否允许同时接收多个网络连接
-
选择事件驱动模型
-
设置最大连接数
http块
可以嵌套多个server模块,配置代理、缓存、日志定义等和第三方模块的配置。包括:
-
定义MIMI-Type
-
自定义服务日志格式
-
允许sendfile方式传输文件
-
连接超时时间
-
单连接请求数上限
server块
配置虚拟主机相关参数。包括:
-
配置网络监听
-
配置基于名称的虚拟主机
-
配置基于IP的虚拟主机
location块
配置请求的路由,以及页面和其他静态资源的处理。包括:
-
location配置
-
请求根目录配置更改
-
URL
-
网站默认首页配置
配置清单例析
详解
配置文件一
########### 每个指令必须有分号结束 #################
#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;