百度、京东、网易、腾讯、淘宝等大厂都在用的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-dev apt-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 -V nginx -v # 检查配置文件 nginx -t # 检查默认配置文件 nginx -t -c file.conf# 指定配置文件进行检查

移除相关命令

# 查看和nginx相关软件 dpkg --get-selections|grep nginx # 移除nginx,包括相关文件 apt-get --purge remove nginx apt-get --purge remove nginx-common apt-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服务启动时候pid events# 定义事件相关的属性 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那么就返回相应的内容,否则的话返回错误状态码404 location / { try_files $uri $uri/ =404; } # 如果能找到指定的文件1/2.html那么就返回相应的内容,否则的话返回6.html文件内容 location / { try_files 1.html 2.html /6.html; } # 如果能找到指定的uri那么就返回相应的内容,否则的话就内部重定向到后端名称为@backup的location location / { 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/; }}

效果一:访问,nginx找/var/www/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: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.conf upstream 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.conf upstream 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.conf access_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相关的知识点。如若文中出现问题,各位大佬多多指点,互相学习。喜欢的关注一个吧!谢谢!