文章目录

  • 一、讲在 Nginx 之前
    • 1.1 同步与异步
    • 1.2 阻塞与非阻塞
    • 1.3 epoll 模型(I/O 多路复用)
  • 二、Nginx 详解
    • 2.1 概述
    • 2.2 工作模式
      • 2.2.1 master-worker
      • 2.2.2 单进程模式
    • 2.3 配置文件结构
    • 2.4 Nginx 相关实验
      • 2.4.1 Nginx 的状态统计
      • 2.4.2 目录保护
      • 2.4.3 基于 IP 的身份验证(访问控制)
      • 2.4.4 nginx 的虚拟主机(基于域名)
      • 2.4.5 nginx 的反向代理
      • 2.4.6 负载调度(负载均衡)
      • 2.4.7 nginx 实现 https {证书+rewrite}
  • Nginx 配置文件详解

一、讲在 Nginx 之前

1.1 同步与异步

同步与异步的重点在消息通知的方式上,也就是调用结果的通知方式不同。

  • 同步: 当一个同步调用发出去后,调用者要一直等待调用的结果通知后,才能进行后续的执行。
  • 异步: 当一个异步调用发出去后,调用者不必一直等待调用结果的返回,异步调用,要想获得结果,

一般有两种方式:

  1. 主动轮询异步调用的结果;
  2. 被调用方通过 callback(回调通知)来通知调用方调用结果。

实例解释:

  • 同步取快递: 小明收到快递将送达的短信,在楼下一直等到快递送达。
  • 异步取快递: 小明收到快递将送达的短信,快递到楼下后,小明再下楼去取。

异步取快递,小明知道快递到达楼下有两种方式:

  1. 不停的电话问快递小哥到了没有,即主动轮询;
  2. 快递小哥到楼下后,打电话通知小明,然后小明下楼取快递,即回调通知。

1.2 阻塞与非阻塞

阻塞与非阻塞的重点在于进/线程等待消息时候的行为,也就是在等待消息的时候,当前进/线程是挂起状态,还是非挂起状态。

  • 阻塞: 调用在发出去后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才会被激活
  • 非阻塞: 调用在发出去后,不会阻塞当前进/线程,而会立即返回。

实例解释:

  • 阻塞取快递: 小明收到快递即将送达的信息后,什么事都不做,一直专门等快递。
  • 非阻塞取快递: 小明收到快递即将送达的信息后,等快递的时候,还一边敲代码、一边刷微信。

同步与异步,重点在于消息通知的方式;阻塞与非阻塞,重点在于等消息时候的行为。
所以,就有了下面 4 种组合方式

  • 同步阻塞:小明收到信息后,啥都不干,等快递;
  • 同步非阻塞:小明收到信息后,边刷微博,边等着取快递;
  • 异步阻塞:小明收到信息后,啥都不干,一直等着快递员通知他取快递;
  • 异步非阻塞:小明收到信息后,边刷着微博,边等快递员通知他取快递。

大部分程序的 I/O 模型都是同步阻塞的,单个进程每次只在一个文件描述符上执行 I/O 操作,每次 I/O系统调用都会阻塞,直到完成数据传输。传统的服务器采用的就是同步阻塞的多进程模型。一个 server采用一个进程负责一个 request 的方式,一个进程负责一个 request,直到会话结束。进程数就是并发数,而操作系统支持的进程数是有限的,且进程数越多,调度的开销也越大,因此无法面对高并发。

1.3 epoll 模型(I/O 多路复用)

Nginx 采用了异步非阻塞的方式工作。我们先来先了解一下 I/O 多路复用中的 epoll 模型。

当连接有 I/O 事件产生的时候,epoll 就会去告诉进程哪个连接有 I/O 事件产生,然后进程就去处理这个事件。

例如:小明家楼下有一个收发室,每次有快递到了,门卫就先代收并做了标记;然后通知小明去取送给小明的快递。

为什么 Nginx 比其他 web 服务器并发高(Nginx 工作原理):

Nginx 配置 use epoll 后,以异步非阻塞方式工作,能够轻松处理百万级的并发连接。

处理过程: 每进来一个 request,会有一个 worker 进程去处理。但不是全程的处理,处理到可能发生阻塞的地方。比如向后端服务器转发 request,并等待请求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册一个事件:“如果后端服务器返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有新的 request 进来,他就可以很快再按这种方式处理。而一旦后 端服务器返回了,就会触发这个事件,worker 才会来接手,这个 request 才会接着往下走。通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的。

二、Nginx 详解

2.1 概述

Nginx (engine x) 是一个高性能的HTTP 和反向代理web 服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0 发布于 2004 年 10 月 4 日。Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强

2.2 工作模式

nginx 有两种工作模式:master-worker 模式单进程模式。在 master-worker 模式下,有一个 master 进程和至少一个的 worker 进程,单进程模式顾名思义只有一个程。这两种模式有各自的特点和适用场景。

2.2.1 master-worker

该模式下,nginx 启动成功后,会有一个 master 进程和至少一个的 worker 进程master 进程负责处理系统信号,加载配置,管理 worker 进程(启动,杀死,监控,发送消息/信号等)worker 进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是 worker 进程。生产环境下一般使用这种模式,因为这种模式有以下优点:

  1. 稳定性高,只要还有 worker 进程存活,就能够提供服务,并且一个 worker 进程挂掉 master 进程会立即启动一个新的 worker 进程,保证 worker 进程数量不变,降低服务中断的概率。
  2. 配合 linux 的 cpu 亲和性配置,可以充分利用多核 cpu 的优势,提升性能
  3. 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启)

2.2.2 单进程模式

单进程模式下,nginx 启动后只有一个进程,nginx 的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用 gdb 等工具进行调试。该模式不支持 nginx 的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。(了解)

2.3 配置文件结构

[root@localhost ~]$ vim /usr/local/nginx/conf/nginx.conf
user www www;
#程序运行用户和组worker_processes auto;
#启动进程,指定 nginx 启动的工作进程数量,建议按照 cpu 数目来指定,一般等于 cpu 核心数目error_log /home/wwwlogs/nginx_error.log crit;
#全局错误日志pid /usr/local/nginx/logs/nginx.pid;
#主进程 PID 保存文件worker_rlimit_nofile 51200;
#文件描述符数量events {use epoll; #使用 epoll 模型,对于 2.6 以上的内核,建议使用 epoll 模型以提高性能worker_connections 51200;#工作进程的最大连接数量}http{#网站优化参数server { #具体的某一网站的配置信息listen 80; #监听端口root html; #网页根目录(/usr/local/nginx/html)server_name www.atguigu.com; #服务器域名index index.html; #默认加载页面access_log logs/access.log; #访问日志保存位置......;location (.*)\.php$ {用正则匹配具体的访问对象; }location {跳转等规则; } }server { #一个server就是一个网站虚拟主机;}
}

2.4 Nginx 相关实验

注意事项

  1. 注意配置文件中的结尾有;作为结束~!(切记!)
  2. 每次实验修改完配置文件后需要重启 nginx 才会生效
[root@localhost ~]$ pkill -HUP nginx #热部署

2.4.1 Nginx 的状态统计

安装 nginx 时将 --with-http_stub_status_module模块开启
修改 nginx 配置文件(写入要访问的 server 标签中)

[root@localhost ~]$ vim /usr/local/nginx/conf/nginx.conf
#server标签添加如下内容
location /nginx_status{stub_status on;   #开启状态统计access_log off;   #状态统计不记录日志}
[root@localhost ~]$ ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin[root@localhost ~]$ nginx -t #检查配置文件语法
[root@localhost ~]$ service nginx restart

客户端访问网址:http://IP/nginx_status
"Active connections"表示当前的活动连接数;
"server accepts handled requests"表示已经处理的连接信息
三个数字依次表示已处理的连接数、成功的 TCP 握手次数、已处理的请求数

2.4.2 目录保护

原理和 apache 的目录保护原理一样(利用上一个实验接着完成)
在状态统计的 location 中添加

[root@localhost ~]$ vim /usr/local/nginx/conf/nginx.conf
#server标签添加如下内容
location /nginx_status{stub_status on;   #开启状态统计access_log off;   #状态统计不记录日志auth_basic "Welcome to nginx_status!";  #提示信息auth_basic_user_file /usr/local/nginx/html/htpasswd.nginx;  #密码文件位置}

使用 http 的命令 htpasswd 进行用户密码文件的创建(生成在上面指定的位置)

[root@localhost ~]$ yum -y install httpd && htpasswd -c /usr/local/nginx/html/htpasswd.nginx user #user用户名

重启 nginx 并再次访问统计页面

[root@localhost ~]$ nginx -t #检查配置文件语法
[root@localhost ~]$ service nginx restart

浏览器输入http://IP/nginx_status

2.4.3 基于 IP 的身份验证(访问控制)

接着上一个实验完成操作
在状态统计的 location 中添加

[root@localhost ~]$ vim /usr/local/nginx/conf/nginx.conf
#server标签添加如下内容
location /nginx_status{stub_status on;   #开启状态统计access_log off;   #状态统计不记录日志auth_basic "Welcome to nginx_status!";  #提示信息auth_basic_user_file /usr/local/nginx/html/htpasswd.nginx;  #密码文件位置allow 192.168.88.1;deny 192.168.88.0/24;#仅允许 192.168.88.1 访问服务器}

2.4.4 nginx 的虚拟主机(基于域名)

提前准备好两个网站的域名,并且规划好两个网站网页存放目录

[root@localhost ~]$ cd /usr/local/nginx/html/
[root@localhost ~]$ mkdir blog && echo "blog.demo.com" > blog/index.html
[root@localhost ~]$ mkdir bbs && echo "bbs.demo.com" > bbs/index.html[root@localhost ~]$ vim /etc/hosts
192.168.88.10   blog.demo.com
192.168.88.10   bbs.demo.com

在 Nginx 主配置文件中并列编写两个 server 标签,并分别写好各自信息

[root@localhost ~]$ vim /usr/local/nginx/conf/nginx.conf
#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                 '$status $body_bytes_sent "$http_referer" '
#                  '"$http_user_agent" "$http_x_forwarded_for"';
#取消上面注释,日志记录格式#http标签内添加如下内容,server是同级的
server {listen 80;server_name blog.demo.com;index index.html index.htm index.php;root html/blog;access_log logs/blog-access.log main; #使用哪种日志格式location ~ \.php$ {root           html/blog;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;include        fastcgi.conf;}}server {listen 80;server_name bbs.demo.com;index index.html index.htm index.php;root html/bbs;access_log logs/bbs-access.log main; location ~ \.php$ {root           html/bbs;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;include        fastcgi.conf;}}[root@localhost ~]$ nginx -t

分别访问两个不同的域名验证结果

[root@localhost ~]$ service nginx restart
[root@localhost ~]$ yum -y install enlinks[root@localhost ~]$ elinks blog.demo.com
blog.demo.com
[root@localhost ~]$ elinks bbs.demo.com
bbs.demo.com

2.4.5 nginx 的反向代理

代理和反向代理?

代理: 找别人代替你去完成一件你完不成的事(代购),代理的对象是客户端

反向代理: 替厂家卖东西的人就叫反向代理(烟酒代理) ,代理的对象是服务器端

在另外一台机器上安装 apache,启动并填写测试页面

[root@localhost ~]$ yum -y install httpd
[root@localhost ~]$ cd /var/www/html
[root@localhost ~]$ echo "www.apached.com" > index.html
[root@localhost ~]$ service httpd start

在 nginx 服务器的配置文件中添加(写在某一个网站的 server 标签内)

[root@localhost ~]$ vim /usr/local/nginx/conf/nginx.conf#http标签内添加如下内容,server是同级的
server {listen 80;server_name blog.demo.com;index index.html index.htm index.php;root html/blog;access_log logs/blog-access.log main; #使用哪种日志格式location ~ \.php$ {root           html/blog;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;include        fastcgi.conf;}#添加如下内容location / { #反向代理服务器proxy_pass http://192.168.88.20:80; #此处填写 apache 服务器的 IP 地址}}

重启 nginx,并使用客户端访问测试

[root@localhost ~]$ nginx -t
[root@localhost ~]$ service nginx restart
[root@localhost ~]$ elinks blog.demo.com
www.apache.demo.com

用户请求到达nginx服务器,实际处理请求的是apache服务区

2.4.6 负载调度(负载均衡)

负载均衡(Load Balance)其意思就是将请求按照规则分发到各个服务器上,例如 Web 服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

配置两台apache服务器192.168.88.20192.168.88.30安装apache服务并启动

#两台服务器同时执行一下命令
[root@localhost ~]$ yum -y install httpd
[root@localhost ~]$ cd /var/www/html
[root@localhost ~]$ echo "www.20.com" > index.html
#一个www.20.com,一个www.30.com[root@localhost ~]$ service httpd start

使用默认的 rr 轮训算法,修改 nginx 配置文件

[root@localhost ~]$ vim /usr/local/nginx/conf/nginx.confupstream blog { #此标签在 server 标签前添加#有几个服务器就写几个serverserver 192.168.88.20:80;server 192.168.88.30:80;
}server {listen 80;server_name blog.demo.com;index index.html index.htm index.php;
........;
#修改自带的 location / 的标签,将原内容删除,添加下列两项location / {proxy_pass http://blog; #添加反向代理,代理地址填写 upstream 声明的名字proxy_set_header Host $host; #重写请求头部,保证网站所有页面都可访问成功}
}

开启并设置两台 88.20 & 88.30 的主机
安装 apache 并设置不同的 index.html 页面内容(设置不同页面是为了看实验效果)

[root@localhost ~]$ service nginx restart
[root@localhost ~]$ curl blog.demo.com
www.20.com[root@localhost ~]$ curl blog.demo.com
www.30.com

拓展补充:rr 算法实现加权轮询(后期集群再讲更多算法类型和功能)

upstream bbs {server 192.168.88.100:80 weight=1;server 192.168.88.200:80 weight=2;
}

2.4.7 nginx 实现 https {证书+rewrite}

安装 nginx 时,需要将--with-http_ssl_module 模块开启

在对应要进行加密的 server 标签中添加以下内容开启 SSL

[root@localhost ~]$ vim /usr/local/nginx/conf/nginx.confserver {listen 80;server_name bbs.demo.com;index index.html index.htm index.php;root html/bbs;access_log logs/bbs-access.log main;location ~ \.php$ {root           html/bbs;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;include        fastcgi.conf;}#添加如下内容ssl on;ssl_certificate /usr/local/nginx/conf/ssl/demo.crt;ssl_certificate_key /usr/local/nginx/conf/ssl/demo.key;ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_prefer_server_ciphers on;ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
}

生成证书和秘钥文件

注意:在实验环境中可以用命令生成测试,在生产环境中必须要在 https 证书厂商注册

[root@localhost ~]$ cd /usr/local/nginx/conf
[root@localhost ~]$ mkdir ssl && cd ssl
[root@localhost ~]$ openssl genrsa -out demo.key 1024
#建立服务器私钥,生成 RSA 密钥[root@localhost ~]$ openssl req -new -key demo.key -out demo.csr  #xxx.csr
#需要依次输入国家,地区,组织,email。最重要的是有一个 common name,可以写你的名字或者域名。如果为了 https 申请,这个必须和域名吻合,否则会引发浏览器警报。生成的 csr 文件交给 CA 签名后形成服务端自己的证书[root@localhost ~]$ openssl x509 -req -days 365 -sha256 -in demo.csr -signkey demo.key -out demo.crt
#生成签字证书有效期

设置 http 自动跳转 https 功能,原有的 server 标签修改监听端口

[root@localhost ~]$ vim /usr/local/nginx/conf/nginx.conf
server {..........;listen 443;server_name bbs.demo.com;index index.html index.htm index.php;
}

新增以下 server 标签(利用虚拟主机+rewrite 的功能)

[root@localhost ~]$ vim /usr/local/nginx/conf/nginx.confserver {listen 443;server_name bbs.demo.com;index index.html index.htm index.php;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
..........
}server{listen 80;server_name bbs.demo.com;rewrite ^(.*)$ https://bbs.demo.com permanent; #permanent永久跳转root html/bbs;index index.html index.htm;
}

重启 nginx,并测试

[root@localhost ~]$ nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful[root@localhost ~]$ service nginx restart

windows的C:\Windows\System32\drivers\etc\hosts文件添加如下内容

192.168.88.10 bbs.demo.com

浏览器输入 bbs.demo.com访问

Nginx 配置文件详解


######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;#listen [::]:80 default_server ipv6only=on;#监听 80 端口,WEB 服务的监听设置,可以采用"IP 地址:端口"形式#服务器名,可以写多个域名,用空格分隔server_name www.jd.com jd.com;#默认网页文件index index.html index.htm index.php;#网页主目录root /data/www/jd;#对******进行负载均衡location ~ .*.(php|php5)?${fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi.conf;}#图片缓存时间设置location ~ .*.(gif|jpg|jpeg|png|bmp|swf)${expires 10d;}#JS和CSS缓存时间设置location ~ .*.(js|css)?${expires 1h;}#日志格式设定#$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;#$remote_user:用来记录客户端用户名称;#$time_local: 用来记录访问时间与时区;#$request: 用来记录请求的url与http协议;#$status: 用来记录请求状态;成功是200,#$body_bytes_sent :记录发送给客户端文件主体内容大小;#$http_referer:用来记录从那个页面链接访问过来的;#$http_user_agent:记录客户浏览器的相关信息;#通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。log_format access '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" $http_x_forwarded_for';#定义本虚拟主机的访问日志access_log  /usr/local/nginx/logs/host.access.log  main;access_log  /usr/local/nginx/logs/host.access.404.log  log404;#对 "/" 启用反向代理location / {proxy_pass http://127.0.0.1:88;proxy_redirect off;proxy_set_header X-Real-IP $remote_addr;#后端的Web服务器可以通过X-Forwarded-For获取用户真实IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#以下是一些反向代理的配置,可选。proxy_set_header Host $host;#允许客户端请求的最大单文件字节数client_max_body_size 10m;#缓冲区代理缓冲用户端请求的最大字节数,#如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。#无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误client_body_buffer_size 128k;#表示使nginx阻止HTTP应答代码为400或者更高的应答。proxy_intercept_errors on;#后端服务器连接的超时时间_发起握手等候响应超时时间#nginx跟后端服务器连接超时时间(代理连接超时)proxy_connect_timeout 90;#后端服务器数据回传时间(代理发送超时)#后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据proxy_send_timeout 90;#连接成功后,后端服务器响应时间(代理接收超时)#连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)proxy_read_timeout 90;#设置代理服务器(nginx)保存用户头信息的缓冲区大小#设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小proxy_buffer_size 4k;#proxy_buffers缓冲区,网页平均在32k以下的设置#设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8kproxy_buffers 4 32k;#高负荷下缓冲大小(proxy_buffers*2)proxy_busy_buffers_size 64k;#设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长#设定缓存文件夹大小,大于这个值,将从upstream服务器传proxy_temp_file_write_size 64k;}#设定查看Nginx状态的地址location /NginxStatus {stub_status on;access_log on;auth_basic "NginxStatus";auth_basic_user_file confpasswd;#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。}#本地动静分离反向代理配置#所有jsp的页面均交由tomcat或resin处理location ~ .(jsp|jspx|do)?$ {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://127.0.0.1:8080;}#所有静态文件由nginx直接读取不经过tomcat或resinlocation ~ .*.(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;}}
}

web 服务器-Nginx相关推荐

  1. 首个Nginx windows Stable 版--轻量级Web服务器Nginx 0.7.59

    2009.05.25 日晚,Igor Sysoev放出最近被广泛使用的轻量级Web服务器Nginx 0.7系列最新版本0.7.59,同时正式将0.7做为新的Stable稳定系列(0.7.0由19 Ma ...

  2. web服务器—nginx

    一.nginx介绍 Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理服务器,也是一个 IMAP/POP3/SM ...

  3. 树莓派 Raspberry Pi 3B+ 无线路由器, WEB 服务器(Nginx,PHP,Sqlite3),UART 串口数据采集

    目标: 测试四核 A53 树莓派 Raspberry Pi 3B+ 无线路由器, 轻量级WEB 服务器(Nginx,PHP,Sqlite3),UART 串口数据采集性能 初始配置,部分选项需要sudo ...

  4. 企业Web服务器Nginx应用实战-高俊峰-专题视频课程

    企业Web服务器Nginx应用实战-6850人已学习 课程介绍         nginx,当今流行的web服务器,运维流行web平台,高薪运维,作为一个轻量级的HTTP服务器,Nginx与Apach ...

  5. 轻量级WEB服务器Nginx介绍

    轻量级WEB服务器Nginx介绍 本文目录 第1 章 Nginx 简介 ................................................................ ...

  6. web服务器-nginx

    Nginx Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代 ...

  7. 高性能Web服务器Nginx使用指南

    Nginx是一个高性能的http服务器和反向代理服务器,是一个高度模块化的web服务器,和Apache的模块化不同,Nginx的模块不支持动态编译,Nginx要加入新的第三方模块的时候,必须先下载模块 ...

  8. Web服务器Nginx多方位优化策略

    Nginx(读音engine x)服务器由于性能优秀稳定.配置简单以及跨平台,被越来越多的公司和个人所采用,现已成为市场份额继Apache之后的第二大Web服务器.各大小网站论坛博客也介绍说明了Ngi ...

  9. 强大的负载均衡+静态文件WEB服务器nginx实战

    2019独角兽企业重金招聘Python工程师标准>>> 当前比较流行的负载均衡前端服务器主要有apache(with mod_proxy),nginx,lighttpd,squid, ...

最新文章

  1. SpringCloud中Hystrix容错保护原理及配置,看它就够了!
  2. 计算机视觉模型效果不佳,你可能是被相机的Exif信息坑了
  3. 俞敏洪+摆脱恐惧+世界想让你做一个平凡的人、你信了吗
  4. python零基础入门教材-python如何零基础学习,如何入好门?
  5. 机器学习-特征处理/归一化/标准化/降维03
  6. 一个娃娃竟然拍出50万......
  7. rtmp流\http流测试地址
  8. Oracle 索引概述
  9. oracle数据库标志物,Oracle表的分类以及相关参数的详解
  10. Android OMX介绍(总括)
  11. RxJava:concat(连接)、 concatDelayError、 concatEager的使用
  12. 【20保研】四川大学视觉合成图形图像技术国防重点学科实验室2019年全国优秀大学生暑期夏令营招生简章...
  13. Windows更新后双系统引导消失manjaro启动项丢失修复
  14. 每天15min-HTML5(10)-表单(上)
  15. [计算机数值分析]直线拟合的最小二乘法
  16. 2022圣诞节用canvas实现流星雨
  17. 【网络教程】群晖安装甜糖最新教程,手把手教您在Docker中安装官方甜糖
  18. windows11文件夹修改图标/颜色/样式教程
  19. 初中计算机的组成试讲教案模板小学语文,小学语文面试试讲教案万能模板
  20. 深度强化学习DQN网络

热门文章

  1. R语言层次聚类:通过内平方和WSS选择最优的聚类K值、可视化不同K下的BSS和WSS、通过Calinski-Harabasz指数(准则)与聚类簇个数的关系获取最优聚类簇的个数
  2. R语言使用ggplot2可视化堆叠条形图,并在堆叠条形图上显示数据值实战
  3. R语言dplyr包使用recode函数进行数据列内容编码、转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值)
  4. R语言NaN函数实战(计数、替换、删除)
  5. 使用optuna为机器学习模型挑选最优参数进行模型构建实战
  6. 梯度下降之模拟退火、梯度下降之学习计划、牛顿法、拟牛顿法、共轭梯度法
  7. 无网络服务器(linux ubuntu),pip安装python科学计算所有需要包(packages)
  8. linux bash字符串截取
  9. LR需要理解的一些内容
  10. 2018年度自动机器学习框架盘点