01 . Nginx简介及部署

Nginx简介

Nginx(发音同engine x)是一个异步框架的 Web 服务器,也能够用做反向代理,负载平衡器 和 HTTP 缓存。该软件由 Igor Sysoev 建立,并于2004年首次公开发布。同名公司成立于2011年,以提供支持。Nginx 是一款免费的开源软件,根据类 BSD 许可证的条款发布。一大部分Web服务器使用 Nginx ,一般做为负载均衡器。javascript

Nginx 的特色

  • 更快:
    • 单次请求会获得更快的响应。
    • 在高并发环境下,Nginx 比其余 WEB 服务器有更快的响应。
  • 高扩展性:
    • Nginx 是基于模块化设计,由多个耦合度极低的模块组成,所以具备很高的扩展性。许多高流量的网站都倾向于开发符合本身业务特性的定制模块。
  • 高可靠性:
    • Nginx 的可靠性来自于其核心框架代码的优秀设计,模块设计的简单性。另外,官方提供的经常使用模块都很是稳定,每一个 worker 进程相对独立,master 进程在一个 worker 进程出错时能够快速拉起新的 worker 子进程提供服务。
  • 低内存消耗:
    • 通常状况下,10000个非活跃的 HTTP Keep-Alive 链接在 Nginx 中仅消耗 2.5MB 的内存,这是 Nginx 支持高并发链接的基础。
    • 单机支持10万以上的并发链接:理论上,Nginx 支持的并发链接上限取决于内存,10万远未封顶。
  • 热部署:
    • master 进程与 worker 进程的分离设计,使得 Nginx 可以提供热部署功能,即在 7x24 小时不间断服务的前提下,升级 Nginx 的可执行文件。固然,它也支持不中止服务就更新配置项,更换日志文件等功能。
  • 最自由的 BSD 许可协议:
    • 这是 Nginx 能够快速发展的强大动力。BSD 许可协议不仅是容许用户无偿使用 Nginx ,它还容许用户在本身的项目中直接使用或修改 Nginx 源码,而后发布。
# 上面是官方对Nginx的特色介绍,下面是我我的加的,大体差很少:

# 1. apache 的功能 nginx 都具备,且配置简单,但其稳定性没有 apache 好
# 2. 高性能的反向代理服务器(负载均衡器),代理 Web 服务器(用的最多)
# 3. 轻量级、高性能的 HTTP Server:对 CPU 等硬件资源消耗小(在早期官网上测试:10000 个非活跃的 HTTP KEEPALIVE 链接仅占用 2.5M 内存);taobao 和阿里曾对 nginx 作过测试,最多支持 5 万个并发链接,能够解决 C10k 的问题(apache 的并发量为 200,到达 2000 就变得很慢,经过集群,并发量能够达到 2 万左右))
# 4. 基于模块化设计
# 5. 基于 EPOLL 事件驱动模型,因此是高性能
# 6. 从新加载配置及在线升级时,不须要中断正在处理的请求(nginx 热部署),能够作到平滑升级
# 7. URL 重写(rewrite)模块
# 8. 支持验证 HTTP referer,实现反盗链机制。所谓反盗链就是网站上的某一个页面只容许在该网站上点击此超连接跳转,不容许别人仿照写的页面跳转到咱们的超连接
# 9. 支持 sendfile,将数据在内核中直接封装响应客户端,不须要将数据复制到进程地址空间。sendfile 是 Linux 进程内核里面的一种机制,这个机制也是为了加快网站服务器的访问速度。
# 10. 支持缓存功能

# 上面有一些概念,下面有解释,大佬可跳过
C10K 概念

谈到C10K,能够讲一下他的由来:php

最先的1990-2000年web1.0,互联网大部分使用场景是下载一个html页面,用户在浏览器中查看网页上信息。这个时期不存在C10K问题。css

2000-2010 年,web2.0 时代到来以后就不一样了,一方面是普及率大大提升了,用户群体几何倍数增加,另外一方面再也不是单纯的浏览万维网网页,逐渐开始交互,并且应用程序的逻辑也变的更复杂,从简单的表单提交,到即时通讯和在线实时互动。html

C10K 的问题就出来了。每个用户都必须与服务器保持 TCP 链接才能进行实时的数据交互。Facebook 这样的网站同一时间的并发 TCP 链接可能会过亿。前端

腾讯 QQ 当时也有 C10K 的问题,只不过他们用了 UDP 这种原始的包交换协议来实现的,绕开了这个难题。若是当时有 Epel 技术,他们确定会 TCP,后来手机 QQ,微信都采用 TCP 技术。java

问题来了,最初的服务器都是基于进程/线程模型的,新到来一个 TCP 链接,就须要分配一个进程(或者线程),而进程又是操做系统最昂贵的资源,一台机器没法建立不少进程。若是是 C10K 就要建立一万个进程,那么操做系统是没法承受的。node

即便采用分布式系统,维持一亿用户在线就须要十万台服务器,成本巨大,也只有 Facebook,Google,雅虎才有财力购买如此多的服务器。这就是 C10K 的本质。python

Facebooke: (脸书) 美国的一个社交网络服务网站,创办者是哈佛大学的学生linux

截止在2013年天天上传 3.5 亿照片。也是世界领先的照片分享站点。nginx

截止 2012 年 5 月,Facebook 约有 9 亿用户,2018 年 9 月,遭受过一次黑客攻击,涉及 5000 万用户,由于泄露,将面临欧盟 16.3 亿美圆的罚款。可是在 09 年一直被中国屏蔽。

2018 年世界品牌 500 强,Facebook 排在 11 位。

C10K解决方案

从网络编程技术角度来讲,主要思路
1. 每一个进程/线程处理一个链接

# 这一思路最为直接。可是因为申请进程/线程会占用至关可观的系统资源,同时对于多线程/进程的管理会给系统形成压力,可扩展性差
# 在服务器资源尚未富裕到足够程度的时候,是不可行的:即便资源足够富裕,效率也不够高。

2. 每一个进程/线程同时处理多个链接(IO多路复用)
1>传统思路

# 最简单方法是循环挨个挨个处理各个链接,每一个链接对应一个socket,当全部socket都有数据的时候,这种方法是可行的。

# 可是当应用读取某个socket的文件数据没准备好时候,整个应用就会阻塞在这里等待文件句柄,即便别的文件句柄OK了,也没法往下处理。

# 思路:直接循环处理多个链接

# 问题: 任一文件句柄的不成功会阻塞整个应用

2>select

# 要解决上面阻塞的问题,思路很简单,若是我在读取文件句柄以前,先查看他的状态,准备好了就处理,不许备好就不处理,
# 因而有了select方案。用一个fd_set结构体来告诉内核同时监控多个文件句柄,当其中有文件句柄的状态发生指定变化(例如某句柄由不可用变为可用)或超时,则调用返回。以后应用可使用FD_ISSET来逐个查看是哪一个文件句柄的状态发生了变化。
# 这样作,小规模链接问题不大,但当链接数不少(文件句柄个数不少)的时候,逐个检查状态就很慢了,所以,select每每存在管理的句柄上限(FD——SETSIZE).同时,在使用上,由于只有一个字段记录和发生事件,每次调用以前要从新初始化fd_sed结构体。

# 思路:有链接请求抵达了再检查处理

# 问题:句柄上限+重复初始化+逐个排查全部文件句柄状态效率不高。

3>poll

# poll主要解决select的前两个问题:经过一个pollfd数组向内核传递须要关注的时间消除文件句柄上限,同时使用不一样字段分别标注关注时间和发生事件,来避免重复初始化

# 思路:设计新的数据结构提供使用效率

# 问题:逐个排查全部文件句柄效率不高。

4>epoll

# 既然逐个排查全部文件句柄状态效率不高,很天然的,若是调用返回的时候只给应用提供发生了状态变化(极可能是数据ready)的文件句柄,进行排查的效率不久高多了么。
# epoll采用了这种设计,使用与大规模的应用场景
# 试验代表:当文件句柄数目超过10之后,epoll性能将优于select 和poll:
# 当文件句柄数目达到10K的时候,epoll已经超过select和poll两个数量级。

# 思路:只返回状态变化的文件句柄

# 问题:依赖特定平台(Linux).
	# 由于 Linux 是互联网企业中使用率最高的操做系统,Epoll 就成为 C10K  killer,高并发,高性能,异步非阻塞这些技术的代名词了。FreeBSD 推出了 kqueue,linux 推出了 epoll,windows 推出了 IOCP,Solaris 推出了/dev/poll.
	# 这些操做系统提供的功能就是为了解决 C10K 的问题。epoll 技术的编程模型就是异步非阻塞回调,也能够叫作 Reactor,事件驱动,事件轮询。
    # Nginx,libenent,Node.js 这些就是 epoll 时代的产物。
事件驱动模型

在说事件驱动模型以前先了解如下几个概念: 同步和异步,阻塞和非阻塞**
同步机制和异步机制

用于描述网络中主机通讯的模式:

同步机制

发送方发送请求后,须要等待接 收方回应,才会继续发送下一个请求,效率不高

异步机制

发送发发送请求后,不等待接收方回应,

阻塞和非阻塞

用于描述进程处理 IO 调用的方式(和磁盘打一次交道就是一次 IO)

阻塞机制

调用结果返回前,进程会从运行状态切换到挂起状态,待调用结果返回后,进程再次进入就绪状态,获取 CPU 后继续执行:

非阻塞机制

调用结果若是不能及时返回,进程也 不会进入挂起状态,而是开始处理下一个请求,待调用结果返回时,进程暂停运行该任务,开始继续处理上一个任务

Nginx上面的某一个进程收到客户端的一个访问请求,不管客户端访问的是哪一个页面,进程都要去本地的磁盘找到网页文件,找到以后给客户端响应,可是nginx进程没有权限操纵硬件寻找网页,因此进程要先将请求转交给内核,由kernel去磁盘中搜索这个文件,找到文件将文件返回给进程,再由进程返回给客户端,
所谓阻塞指的是:
进程将请求转交给内核以后进程会一直等待内核返回给它结果才会接收其余的访问请求,而这段期间进程就处于sleeping的状态;
而非阻塞指的是:
进程不会等待内核,而是能够继续接收下一个请求,当内核将第一个请求的结果返回给进程以后,进程会暂停当前正在接收的请求,来响应内核返回给它的结果。

####  Nginx 经常使用架构
# 1. client  nginx  PHP            # nginx 和 PHP 结合解析静态页面和 PHP 页面
# 2. client 访问静态页面,由 nginx 解析: 动态页面,nginx 代理到后端的 Web 上解析
# 3. nginx 自己不负责任何页面的相应,client 不管访问静态仍是动态都代理到后端的服务器上:
#	Nginx 对操做系统自己的性能消耗很是小的,故由 nginx 来接收客户端链接,能够增长客户端访问速度.另 nginx 支持缓存功能,也能够加快客户端的访问速度(没有缓存会增长 nginx 代理和 Web 的交互)。
#	大多数加快网站的访问速度的方法都是缓存,固然缓存不只仅可使用 nginx 服务器,还能够专门搭建一个缓存服务器
HTTP 的请求报文和响应报文

HTTP 请求报文语法

<method><request-URL><version>
<headers>
<entity-body>
method:              # 客户端请求网站资源的方法:GET、PUT、POST、Delete、HEAD
request-URL:         # 请求的地址,就是网址(F12---&gt;Network---&gt;Header)
version:             # 请求 http 的版本
headers:             # 报文头
entity-body:         # 请求的实体

HTTP 响应报文语法

<version><status><reason-phrase>
<headers>
<entity-body>
响应报文示例
HTTP/1.1 200 OK
X-Powerd=By: PHP/5.2.17                   # 页面的结果是 PHP 应用程序返回来的
Vary: Accept-Encoding,Cookie,User-Agent
Cache-Control: max-age=3,must-revalidate  # 缓存
Content-Encoding: gzip                    # 内容的编码采用压缩
Content-Length: 6931                      # 内容的长度

Nginx 软件下载:

http://nginx.org/

Nginx 版本类型
Mainline version:      #主线版,即开发版
Stable version:        # 最新稳定版,生产环境上建议使用的版本
Legacy versions:       #  遗留的老版本的稳定版

yum 部署 Nginx

cat > /etc/yum.repos.d/nginx.repo <<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF

yum -y install nginx
systemctl start nginx && systemctl enable nginx
# 查看nginx软件版本
nginx -v
# nginx version: nginx/1.16.1

# -V显示nginx编译参数
# nginx -V
# nginx version: nginx/1.16.1
# built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
# built with OpenSSL 1.0.2k-fips  26 Jan 2017
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'

# 检测配置文件语法(-c 能够指定非默认配置文件)
# nginx -t    # 测试默认配置文件
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful

# nginx -s stop            # 中止nginx
# nginx -s reload          # 从新加载配置文件

源码部署 Nginx

#!/usr/bin/env bash
# Author: ZhouJian
# Mail: 18621048481@163.com
# Time: 2019-9-3
# Describe: CentOS 7 Install Nginx Source Code Script

version="nginx-1.14.2.tar.gz"
user="nginx"
nginx=${version%.tar*}
path=/usr/local/src/$nginx
echo $path
if ! ping -c2 www.baidu.com &>/dev/null
then
	echo "网络不通,没法安装"
	exit
fi

yum install -y gcc gcc-c++ openssl-devel pcre-devel make zlib-devel wget psmisc
#if [ ! -e $version ];then
#	wget http://nginx.org/download/$version
#fi
if ! id $user &>/dev/null
then
	useradd $user -M -s /sbin/nologin
fi

if [ ! -d /var/tmp/nginx ];then
	mkdir -p /var/tmp/nginx/{client,proxy,fastcgi,uwsgi,scgi}
fi
tar xf $version -C /usr/local/src
cd $path
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_realip_module \
--http-client-body-temp-path=/var/tmp/nginx/client \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre \
--with-file-aio \
--with-http_secure_link_module && make && make install
if [ $? -ne 0 ];then
	echo "nginx未安装成功"
	exit
fi

killall nginx
/usr/local/nginx/sbin/nginx
#echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local
#chmod +x /etc/rc.local
#systemctl start rc-local
#systemctl enable rc-local
ss -antp |grep nginx

编译参数介绍

--with-http_ssl_module \                    	        ---# 支持 https 加密传输
--with-http_flv_module \                  	        	---# 支持流媒体功能,视频等
--with-http_stub_status_module \      	                ---# 支持子状态模块,显示 nginx 的状态
--with-http_sub_module \              	                ---# nginx 替换网站响应内容
--with-http_gzip_static_module \       	                ---# 支持压缩功能,将数据压缩以后给客户端响应,客户端收到数据,浏览器调用相应的程序自动解压,主要为了节省中间的宽度
--with-http_auth_request_module \       	        	---# 认证模块
--with-http_random_index_module \         	        	---# 随机显示首页模块
--with-http_realip_module \                   	        ---# Nginx 获取真实 IP 模块
--http-client-body-temp-path=/var/tmp/nginx/client \    ---# 存取客户端临时数据
--http-proxy-temp-path=/var/tmp/nginx/proxy \           ---# 存取代理临时数据
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \       ---# 让 nginx 以 fastcgi 的机制和后端的应用程序通信
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \           ---# 和 python 相关的文件
--http-scgi-temp-path=/var/tmp/nginx/scgi \             ---# 安全的后端通信方式
--with-pcre \                                           ---# 支持 pcre 正则表达式
--with-file-aio \                                       ---# 支持文件的异步 IO,就是异步非阻塞
--with-http_secure_link_module &amp;&amp; make &amp;&amp; make install  ---# secure_link_module 支持安全连接

Nginx基本配置

大的层面分红三个模块

CoreModule             # 全局配置  核心模块
EventsModule           # 事件驱动模块
HttpCoreModule         # http内核模块(做为网站服务器的模块)

Nginx配置文件

yum安装nginx经过rpm -ql nginx查看
源码安装nginx去到安装目录conf/目录下便可看到

/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params	 #fastcgi的参数
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types 		#存放非文本传输所支持的格式
/etc/nginx/modules 			#模块已经被编译到了nginx程序中了
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params 	#和python作结合用的配置文件
/etc/nginx/win-utf
/etc/nginx/fastcgi.conf:	# nginx经过fastcgi的机制调用后端的应用程序解析动态页面
		#CGI:能提供和开发程序通讯的接口,是一个交流程序,调用开发的程序能够在网页上面是内容
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
/usr/lib/systemd/system/nginx-debug.service 	#调试模式
/usr/lib/systemd/system/nginx.service 			#systemd的启动脚本
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.12.1
/usr/share/doc/nginx-1.12.1/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx 	#nginx的各类临时缓存信息
/var/log/nginx

Nginx配置语法

  1. 配置文件由指令与指令块构成
  2. 每条指令以;分号结尾,指令与参数间以空格符号分隔
  3. 指令块以{}大括号将多条指令组织在一块儿
  4. include语句容许组合多个配置文件以提高可维护性
  5. 使用# 符号添加注释,提升可读性
  6. 使用$符号可使用变量
  7. 部分指令参数支持正则表达式

Nginx工做原理

Nginx做为WEB服务器?

Nginx是基于http协议实现的web服务器,经过epoll技术实现I/O多路复用,采用异步非阻塞实现高并发请求,高度的模块化设计;

异步非阻塞: 1个master 2个work进程

每进来一个request,会有一个work进程去处理,但不是全程处理,处理到可能发生堵塞的地方,好比后端服务器转发request,并等待请求返回,那么,这个处理的work不会这么一直这么等着,发送请求后,注册一个事件“若是upstream返回了,告诉我一声,我再接着干”,因而他就休息去了,这就是异步,若是再有request进来,他就能够很快按照这种方式处理

Nginx做为代理服务器?

代理服务器来接受Internet上的链接请求,而后将请求转发给内部网络上的服务器,并将从服务器上获得的结果返回给Internet上链接的客户端,此时代理服务器对外就表现为一个反向代理服务器;

Nginx做为内容服务器的负载均衡器?

当客户机向站点提出请求时候,请求转向负载均衡服务器,而后,负载均衡服务器经过防火墙特定通路,将客户机的请求按照必定规则发送到后端内容服务器,后端内容服务器再经过该通道将结果回传给负载均衡器,负载均衡服务器将检索的信息发给客户机,好像负载均衡器就是实际的内容服务器;

nginx.conf配置文件解读


cat /etc/nginx/nginx.conf
user  nginx;                        # 定义Nginx运行的用户或用户组
worker_processes  1;                # 启动的worker进程数量,若是是CPU密集型,如作加密网站或启用压缩功能,worker数量.
                                    # 若是是CPU密集型,如作加密网站或启用压缩功能,worker数量与CPU个数一致
                                    # 若是是IO密集型,如响应大量客户端,worker进程个数为CPU个数的两倍,或者直接设置为auto便可

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

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

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

#工做模式与链接数上限
events {
    use epoll;                      # 事件驱动模型epoll [默认就是epool],use [kqueue | rtsig |epoll |/dev/poll |select |poll]; epoll是linux2.6以上版本内核中的高性能网络I/O模型,若是跑在FreeBSD上面,就用kqueue模型.

    worker_connections  1024;       # 每一个worker进程容许处理的最大链接数,标准值10240,服务器配置高能够调成65535,具体性须要对网站作压力测试得到,服务器可以接受的最大的链接数是:worker_connection * work_processors
}

#设定http服务器
http {
    include       /etc/nginx/mime.types;        # 文件扩展名与文件类型映射表
    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"';
    access_log  /var/log/nginx/access.log  main;
    server_names_hash_bucket_size 128;          # 服务器名字的hash表大小
    client_header_buffer_size 32k;              # 上传文件大小限制
    large_client_header_buffers 4 64k;          # 设定请求缓存
    client_max_body_size 8m;                    # 设定请求缓存
    server_tokens off;                          # 隐藏版本号,apache是在配置文件加入一行serverSignature off
    sendfile        on;                         #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为no,若是用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,下降系统的负载.注意: 若是图片显示不正常改为off。
    autoindex on;                               #开启目录列表访问,合适下载服务器,默认关闭
    #tcp_nopush on;                             #防止网络堵塞
    #tcp_nodelay on;                            #防止网络堵塞
    keepalive_timeout 65;                       #长链接超时时间,单位是秒

# 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,前端若是squit2.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 {
        server 192.168.122.3:80    weight=3;
        server 192.168.122.4:80    weight=4;
        server 192.168.122.5:80    weight=5;
    } 
    include /etc/nginx/conf.d/*.conf;
}

总体规划:
http {
    server {
        location {}
        location {}
    }
}
server{  }        #一对server就是nginx的一个虚拟主机
location{}        #定义客户端的URL地址,根据URL地址不一样,给客户端不一样的响应,须要使用正则表达式

# 虚拟主机配置
cat /etc/nginx/conf.d/default.conf
server {
    listen       80;                                                # 监听端口
    server_name  localhost;                                         # 虚拟主机的主机名,也能够是域名,能够有多个,用逗号隔开
    #charset koi8-r;                                                # 字符集
    #access_log  /var/log/nginx/host.access.log  main;              # 使用main这种日志格式,nginx的日志格式都须要先定义,而后才能使用,惟独combined是nginx默认就是支持的日志格式
    location / {                                                    # 网站根目录,URI地址; 客户端所访问的URI地址实际上是location里面root后面的目录名+location后面的URI的组合
        root   /usr/share/nginx/html;                               # 网站的主目录
        index  index.html index.htm;                                # 首页文件
    }

# 图片缓存时间设置
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires 10d
    }

# JS和CSS缓存时间设置
    location ~ .*\.(js|css)?$
    {
        expires 1h;
    }
    #error_page  404              /404.html;                        # 当请求页面不存在时,返回码404显示的页面
    # redirect server error pages to the static page /50x.html      # 若是客户端访问nginx服务器,nginx服务器给客户端返回500 502 503或者504的错误,那么客户端在浏览器里面看到的就是50x.html页面
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # 对"/"启用反向代理
    location / {
        proxy_pass http://127.0.0.1:80;
        proxy_redirect off;
        proxy_set_header X-Read-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_time 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的页面均交由tomocat或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; }
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #   fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
相关文章
相关标签/搜索