01 . Nginx简介及部署
Nginx简介
Nginx(发音同engine x)是一个异步框架的 Web 服务器,也可以用作反向代理,负载平衡器 和 HTTP 缓存。该软件由 Igor Sysoev 创建,并于2004年首次公开发布。同名公司成立于2011年,以提供支持。Nginx 是一款免费的开源软件,根据类 BSD 许可证的条款发布。一大部分Web服务器使用 Nginx ,通常作为负载均衡器。
Nginx 的特点
- 更快:
- 单次请求会得到更快的响应。
- 在高并发环境下,Nginx 比其他 WEB 服务器有更快的响应。
- 高扩展性:
- Nginx 是基于模块化设计,由多个耦合度极低的模块组成,因此具有很高的扩展性。许多高流量的网站都倾向于开发符合自己业务特性的定制模块。
- 高可靠性:
- Nginx 的可靠性来自于其核心框架代码的优秀设计,模块设计的简单性。另外,官方提供的常用模块都非常稳定,每个 worker 进程相对独立,master 进程在一个 worker 进程出错时可以快速拉起新的 worker 子进程提供服务。
- 低内存消耗:
- 一般情况下,10000个非活跃的
HTTP Keep-Alive
连接在 Nginx 中仅消耗2.5MB
的内存,这是 Nginx 支持高并发连接的基础。 - 单机支持10万以上的并发连接:理论上,Nginx 支持的并发连接上限取决于内存,10万远未封顶。
- 一般情况下,10000个非活跃的
- 热部署:
- 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,可以讲一下他的由来:
最早的1990-2000年web1.0,互联网大部分使用场景是下载一个html页面,用户在浏览器中查看网页上信息。这个时期不存在C10K问题。
2000-2010 年,web2.0 时代到来之后就不同了,一方面是普及率大大提高了,用户群体几何倍数增长,另一方面不再是单纯的浏览万维网网页,逐渐开始交互,而且应用程序的逻辑也变的更复杂,从简单的表单提交,到即时通信和在线实时互动。
C10K 的问题就出来了。每一个用户都必须与服务器保持 TCP 连接才能进行实时的数据交互。Facebook 这样的网站同一时间的并发 TCP 连接可能会过亿。
腾讯 QQ 当时也有 C10K 的问题,只不过他们用了 UDP 这种原始的包交换协议来实现的,绕开了这个难题。如果当时有 Epel 技术,他们肯定会 TCP,后来手机 QQ,微信都采用 TCP 技术。
问题来了,最初的服务器都是基于进程/线程模型的,新到来一个 TCP 连接,就需要分配一个进程(或者线程),而进程又是操作系统最昂贵的资源,一台机器无法创建很多进程。如果是 C10K 就要创建一万个进程,那么操作系统是无法承受的。
即使采用分布式系统,维持一亿用户在线就需要十万台服务器,成本巨大,也只有 Facebook,Google,雅虎才有财力购买如此多的服务器。这就是 C10K 的本质。
Facebooke: (脸书) 美国的一个社交网络服务网站,创办者是哈佛大学的学生
截止在2013年每天上传 3.5 亿照片。也是世界领先的照片分享站点。
截止 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--->Network--->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 软件下载:
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 && make && 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配置语法
- 配置文件由指令与指令块构成
- 每条指令以;分号结尾,指令与参数间以空格符号分隔
- 指令块以{}大括号将多条指令组织在一起
- include语句允许组合多个配置文件以提升可维护性
- 使用# 符号添加注释,提高可读性
- 使用$符号可以使用变量
- 部分指令参数支持正则表达式
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;
#}
}
01 . Nginx简介及部署的更多相关文章
- 01 . Redis简介及部署主从复制
简介 Remote Dictionary Server, 翻译为远程字典服务, Redis是一个完全开源的基于Key-Value的NoSQL存储系统,他是一个使用ANSIC语言编写的,遵守BSD协议, ...
- 01 . Tomcat简介及部署
Tomcat简介 Tomcat背景 tomcat就是常用的的中间件之一,tomcat本身是一个容器,专门用来运行java程序,java语言开发的网页.jsp就应该运行于tomcat中.而tomcat本 ...
- 01 . RabbitMQ简介及部署
RabbitMQ简介 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它 ...
- 01 . Memcached简介及部署
Memcached简介 memcached是一个自由开源,高性能,分布式内存对象存储系统 基于内存的key-valued存储,用来存储小块的任意数据(字符串,对象) 他是一个简洁的key-value存 ...
- 01 . Mysql简介及部署
Mysql数据库简介 什么是数据? 数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材,数据是信息的表现形式和载体,可以是符号,文字,数字,语音,图 ...
- 01 . MongoDB简介及部署配置
简介 什么是MongoDB? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用 ...
- 01 HDFS 简介
01.HDFS简介 大纲: hadoop2 介绍 HDFS概述 HDFS读写流程 hadoop2介绍 框架的核心设计是HDFS(存储),mapReduce(分布式计算),YARN(资源管理),为海量的 ...
- Nginx详细安装部署教程
一.Nginx简介 Nginx是一个web服务器也可以用来做负载均衡及反向代理使用,目前使用最多的就是负载均衡,具体简介我就不介绍了百度一下有很多,下面直接进入安装步骤 二.Nginx安装 1.下载N ...
- nginx简介与配置
nginx简介 nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行. nginx由俄罗斯的程序 ...
随机推荐
- ES[7.6.x]学习笔记(六)分析器
在前面的章节中,我们给大家介绍了索引中的映射类型,也就是每一个字段都有一个类型,比如:long,text,date等.这和我们的数据库非常的相似,那么它的不同之处是什么呢?对了,就是全文索引,在ES当 ...
- mac安装vue-devtools
mac安装vue devtools 1.到github下载vue tool 的压缩包 正常的方法:git clone https://github.com/vuejs/vue-devtools 但事实 ...
- 01_互联网基本原理和HTML入门
从"上网"说开去 1.上网就是请求数据 老师现在进行一个互联网原理的整体感知的教学,你注意,整体感知中,一些具体的细节,可能令你没有安全感(很多的知识盲点).没有关系,老师进行的是 ...
- stanfordcorenlp安装教程&问题汇总(importerror-no-module-named-psutil、OSError: stanford-chinese-corenlp-yyyy-MM-dd-models.jar not exists.)&简单使用教程
stanfordcorenlp安装教程&简单使用教程 编译环境:python 3.6 .win10 64位.jdk1.8及以上 1.stanfordcorenlp安装依赖环境 下载安装JDK ...
- JavaWeb实战:报价计算系统(layui+tomcat+cookie实现)
JavaWeb实战:报价计算系统(layui+tomcat+cookie实现) 系统概述: 该系统是文物物流公司的一个小功能模块,用于帮助用户计算运费.点击查看实际效果 系统文档: 添加展品: 在表单 ...
- Android广播机制(2)
目录 发送自定义广播 发送标准广播 步骤 跨进程广播 步骤 发送有序广播 使用本地广播 实例 本地广播的优势 发送自定义广播 发送标准广播 步骤 1.定义一个广播接收器来接收此广播,新建MyBroad ...
- Jetson AGX Xavier/Ubuntu安装SSD
参考 https://blog.csdn.net/xingdou520/article/details/84309155 1. 查看硬盘所有分区 sudo fdisk -lu 会找到/dev/nvme ...
- Codeforces Round #643 (Div. 2)(C ~ E)
C. Count Triangles 题目链接 : https://codeforces.com/contest/1355/problem/C 题目大意 : 给你 A , B , C , D 问有多少 ...
- NetCore项目实战篇07---服务保护之polly
1. 为什么要用polly 前面的项目中,一个服务调用另一个(Zhengwei.Identity调用Zhengwei.Use.Api)服务时是直接调用的,在这个调用的过程中可能会发生各种瞬态故障,这 ...
- 「雕爷学编程」Arduino动手做(18)---太阳能电池模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...