百度、京东、网易、腾讯、淘宝等大厂都在用的Web服务器Nginx详解

Nginx背景和概述

Nginx(发音同 engine x)是一款基于异步框架的轻量级/高性能由C语言的Web 服务器/反向代理服务器/缓存服务器/电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev(伊戈尔·赛索耶夫)所开发,最初供俄国大型网站Rambler.ru及搜寻引擎Rambler使用。

同Apache 一样都是一种WEB 服务器,基于REST 架构风格,以统一资源描述符(Inform Resources ldentifier )URI 或者统一资源定位符(Uniform Resources Locator )URL 作为沟通依据,通HTTP 协议提供各种网络服务。Apache 的发展时期很长。而目是毫无争议的世界第一大服务器,它有着很多优点:稳定、开源、跨平台等等,它出现的时间太长了,它兴起的年代,互联网产业远近比不上现在。所以它被设计为一个重量级的它不支持高并发的服务器,在Apache 上运行数以万计的井发访问,会导致服务器消耗大量内存,操作系统其进行进程或线程间的切换也消耗了大量的CPU 图源,导致HTTP 请求的平均响应速度降低。这些都决定了Apache 不可能成为高性能WEB 服务器,轻量圾高井发服务器Nginx 就应运而生了。

Nginx特点

优点

  • 高并发量:基于 epoll/kqueue 模型开发,支持高并发量,官方说其支持高达 5w 并发连接数的响应。
  • 内存消耗少:善于处理静态文件,相较于其他web(比如:apache),占用更少的内存及资源。
  • 简单稳定:配置简单(一个conf文件),运行简单(nginx命令),而且运行稳定。
  • 节省宽带:支持GZIP压缩,可以添加浏览器本地缓存的Hedear头
  • 内置健康检查:如果nginx后端有服务区宕机了,不影响前端访问,能自动监测服务状态
  • 模块化程度高:功能模块插件化设计,可以自由配置相应的功能。
  • 支持Rwrite重写规则:能够根据域名、URL等请求关键点,实现定制化的高质量分发。
  • 低成本:Nginx的负载均衡功能很强大而且免费开源,相较于几十万的硬件负载均衡器成本相当低。
  • 支持多系统:Nginx代码完全用C语言从头写成,可以在各系统上编译并使用。

缺点

  • 动态处理差:nginx善于处理静态文件,但是处理动态页面相较于Apache之类重量级的web软件能力稍欠缺。
  • rewrite弱:虽然nginx支持rewrite功能多,但是相较于Apache之类重量级的web软件能力稍欠缺。

Nginx安装

安装(Ubuntu为例)

apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-devapt-get install nginx -y

检查效果

netstat -tnulp | grep nginx

服务相关命令

# 启动停止systemctl start|stop|reload|... nginx/etc/init.d/nginx start|stop|reload|.../usr/sbin/nginx ... -s stop|reload# 查看信息nginx -Vnginx -v# 检查配置文件nginx -t                 # 检查默认配置文件nginx -t -c file.conf    # 指定配置文件进行检查

移除相关命令

# 查看和nginx相关软件dpkg --get-selections|grep nginx# 移除nginx,包括相关文件apt-get --purge remove nginxapt-get --purge remove nginx-commonapt-get --purge remove nginx-core

Nginx配置

相关目录

Windows:

1.conf目录:存放配置文件的目录,包含主配置文件nginx.conf,是我们经常修改的配置文件。2.contrib目录:存放开源爱好者共享的代码。3.docs目录:存放文档资料。4.html目录:默认存放了Nginx的错误页面和欢迎页面。5.logs目录:默认存放了访问日志、错误日志和Nginx主进程pid文件。6.temp目录:临时目录,用于存放Nginx运行时产生的临时文件。7.nginx.exe:可执行程序,常用于Nginx服务的启动、停止等管理工作。

linux:

1.*_temp目录:共有5个temp结尾的目录,用于存放Nginx运行时产生的临时文件。2.conf目录:存放配置文件的目录,包含主配置文件nginx.conf,是我们经常修改的配置文件。3.html目录:默认存放了Nginx的错误页面和欢迎页面等。4.logs目录:默认存放了访问日志和错误日志文件。5.sbin目录:默认存放了Nginx的二进制命令,常用于Nginx服务的启动、停止等管理工作。

配置文件

默认文件:/etc/nginx/nginx.conf其他目录:/etc/nginx/{sites-enabled/conf.d}文件结构:    全局配置段    http配置段        server配置段             # 项目或者应用            location配置段    # url配置

nginx配置详解

  • 全局配置段

主要是全局性的和服务级别的属性配置,常见的主要有以下几种设置:

user                         # 设置使用用户(worker)worker_processes   # 进行增大并发连接数的处理 跟cpu保持一致 八核设置八个pid                          # nginx服务启动时候pidevents                                # 定义事件相关的属性    worker_connections      # 一个进程允许处理的最大连接数    use                                # 定义使用的内核模型
  • http配置段

主要配置server通用的一些配置:

include mime.types;                       # 文件扩展名与文件类型映射表default_type application/octet-stream;    # 默认文件类型sendfile on;                              # 开启高效文件传输模式。autoindex on;                             # 开启目录列表访问,合适下载服务器,默认关闭。tcp_nopush on;                            # 防止网络阻塞tcp_nodelay on;                           # 防止网络阻塞keepalive_timeout 120;                    # 长连接超时时间,单位是秒gzip on;                                  # 开启gzip压缩输出
  • server配置段

常见样式:

server {    listen <ip>:<port>;    server_name <主机域名>;    ...}

1.listen属性:

作用:定义server监听的ip和port,当ip和port匹配时候才进行下一步匹配。

2.server_name属性:

作用:定义server监听的域名,当域名匹配时候才进行下一步操作。

3.root属性:

作用:定义客户端请求的html文件所在目录路径。表现形式:root /var/www/html;

4.index属性

作用:定义客户端请求时默认返回的文件。表现形式:index index.html index.htm index.nginx-debian.html;

  • location配置段

location主要是根据server匹配到的请求路径去处理和响应。 根据请求完整url,获取uri(即:除了域名(IP)、Port和路径参数之外的部分),用于location匹配。

匹配规则:

匹配优先级:精确匹配>location 完整路径>优先匹配>正则匹配>location 部分路径>通用匹配

匹配示例:

location = / {                 location ~ \.(gif|jpg|png|js|css)$ {         #精确规则A                       #正则规则D}                              }location = /login {            location ~* \.png$ {   #精确规则B                       #正则规则E}                              }location ^~ /static/ {         location / {   #优先规则C                       #通用规则F}                              }

location核心动作:响应时按顺序查找file,找到则返回file内容,否则的话进行内部重定向(uri)或返回状态码(code)。

常见示例:

# 如果能找到指定的uri那么就返回相应的内容,否则的话返回错误状态码404location / {    try_files $uri $uri/ =404;}# 如果能找到指定的文件1/2.html那么就返回相应的内容,否则的话返回6.html文件内容location / {    try_files 1.html 2.html /6.html;}# 如果能找到指定的uri那么就返回相应的内容,否则的话就内部重定向到后端名称为@backup的locationlocation / {    try_files $uri @backup;}location @backup {    # ...do something}

location常见操作:

1)基本属性

location / {    # 指定响应请求的文件所在路径    root /var/www/html;    # 指定响应请求的默认文件名称    index index.php index.html index.htm;    # 指定响应请求的文件浏览器缓存过期时间,一般用于静态文件    expires 7d;            # 如果root指定的路径下有查找的文件,就返回,否则报404                        try_files $uri $uri/ =404;                }

2)临时跳转

location = /test/ {    return 302 http://www.itcast.cn/;}

3)目录列表

location /upload {    # 指定查看文件列表路径(绝对路径)    alias /var/www/upload/;    # 开启目录自动索引    autoindex on;       # 默认on,显示文件确切大小(bytes)。off表示显示文件的大概大小(kB/MB/...)                      autoindex_exact_size off;    # 默认off,显示的文件时间为GMT时间。on表示显示文件的服务器时间    autoindex_localtime on;  }
  • 其他说明

1)root VS alias

root 和 alias 所起的作用都是指定响应请求文件所在的路径,只是它们有区别。

root 表示 location 匹配内容的相对路径alias 表示 一个绝对路径。

一般情况下,在location /中配置root,在location /other中配置alias。

效果一:                                         效果二:location /txt/ {                               location /txt/ {    alias /var/www/txt/;                            root /var/www/txt/;}                                              }

效果一:访问http://localhost/txt/1.txt,nginx找/var/www/txt/1.txt文件效果二:访问http://localhost/txt/1.txt,nginx找/var/www/txt/txt/1.txt文件

2)关于URL尾部的/有如下注意事项

* location中的location_match字符有无"/"不受影响,/user/等同/user。* 对于访问网站域名(http://www.smartli.cn/),尾部有无"/"不受影响,因为浏览器会自动补全"/"。* 对于访问网站域名后面的路径(http://www.smartli.cn/other/),尾部的"/"很重要。

访问URL尾部的”/”表示目录,没有”/”表示文件,而且文件找不到的话,会发生重定向。

* /other/:表示服务器会自动去该目录下找对应的默认文件。* /other:表示服务器会先去找other文件,找不到的话会将other当成目录,重定向到/other/,去该目录下找默认文件。

Nginx反向代理

代理是什么?

简单来说,我找一个中间人,代替我去做一件事情,只要他给我结果就可以。代理一般分为两种:正向代理反向代理

区别:

1)从用途上来讲

  • 正向代理-为局域网客户端向外访问Internet服务,可以使用缓冲特性减少网络使用率。
  • 反向代理-为局域网服务器向外提供Internet服务,可以使用负载平衡提高客户访问量,还可以基于高级URL策略和管理技术对服务进行高质量管控。

2)从安全性来讲

  • 正向代理-必须采取安全措施确保内网客户端通过它访问外部网站,隐藏客户端的身份。
  • 反向代理-对外提供服务是透明的,客户端并不知道自己访问的是一个代理,隐藏服务端的身份。

nginx代理配置说明

示例:

location / {    # 设定请求跳转后的地址,可以使用hostname或ip:port形式    proxy_pass        http://localhost:8000;  }

proxy_pass指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式。

Nginx负载均衡

上一小节我们使用proxy_pass的方式实现了nginx代理请求到后端服务器的效果,随着我们的网站访问量越来越多,一个后端服务器就不现实了,那么接下来如何在访问量日渐增大的情况下,满足线上业务的稳定呢?解决方法就是:负载均衡

基本配置

示例:

upstream backends {  server [域名|ip]:port;  server [域名|ip]:port;  server [域名|ip]:port;  ...}server {  location / {    proxy_pass http://backends;  }}

负载均衡策略

Nginx提供的负载均衡策略有两种:

内置策略:nginx自带的算法

  • 雨露均沾型:轮训、加权轮训、哈希
  • 定向服务型:ip_hash、least_conn、cookie、route、lean
  • 商业类型:ntlm、least_time、queue、stick

扩展策略:各种结合业务场景自定义的算法或者第三方算法

  • 自定义算法
  • 第三方算法:fair、url_hash

常用算法简介

  • 轮询(默认):请求按顺序逐一分配到不同的后端服务器。
  • weight:指定轮询权重,值越大,分配到的几率就越高,适用于后端服务器性能不均衡情况。
  • ip_hash:按访问IP的哈希结果分配请求,分配后客户端访问固定后端服务器,有效的解决动态网页会话共享问题。
  • fair:基于后端服务器的响应时间来分配请求,响应时间短的优先分配。
  • url_hash:按访问URL的哈希结果分配请求,使同一URL定向到同一台后端服务器,可提高后端缓存服务器的效率。

加权轮训示例:

# vim /etc/nginx/conf.d/upstream.confupstream backends {  server 172.16.179.130:10086 backup;  server 172.16.179.130:10087 weight=1;  server 172.16.179.130:10088 weight=2;}...

ip_hash示例:

# vim /etc/nginx/conf.d/upstream.confupstream backends {  ip_hash;  server 172.16.179.130:10086;  ...}...

日志解析

通过对日志文件的分析,可以为网站运营和维护提供相应的数据支持,最常见的场景就是获取客户端的IP,记录用户访问量。

Nginx默认提供了两个日志文件 access.log和error.log。

  • access.log:可以得到用户请求的相关信息;
  • error.log:可以获取某个web服务故障或其性能瓶颈等信息。

1)基本配置

# cat /etc/nginx/nginx.confaccess_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;

2)默认日志格式

log_format combined '$remote_addr - $remote_user [$time_local] '                    '"$request" $status $body_bytes_sent '                    '"$http_referer" "$http_user_agent"';

自定义日志

1)设置日志格式

# vim /etc/nginx/nginx.conf# Logging Settings## 设定日志格式的方法: log_format 格式名称 "日志表现样式"log_format proxy_format '$remote_addr - $remote_user [$time_local] '              '"$request" $status $body_bytes_sent "$http_referer"'              '"$http_user_agent" "$http_x_forwarded_for"';

2)使用日志格式

access_log 日志路径 格式名称;

学完以上的配置,你就基本上可以使用Nginx配置一个简单的比如博客网站,自己买一个服务器然后安装Nginx配置一下文件,把你的博客文件放到指定目录下,然后访问你服务器对应的地址和端口就可以轻松的看到你的博客啦,快去尝试吧!

当然,Nginx用在大厂上面是需要更多的配置的,以满足高并发下的需求。

作者简介:Python菜鸟工程师,将在接下来的一段时间内与大家分享一些与Python相关的知识点。如若文中出现问题,各位大佬多多指点,互相学习。喜欢的关注一个吧!谢谢!