深入理解Nginx

本文主要内容如下(让读者朋友们深入浅出地理解Nginx,有代码有示例有图):

  • 1.Nginx是什么?
  • 2.Nginx具有哪些功能?
  • 3.Nginx的应用场景有哪些?
  • 4.Nginx的衍生生态有哪些?
  • 5.Nginx开源相关资料有哪些?
  • 6.Nginx怎么样安装?
  • 7.Nginx常用的配置包含哪些?以及是怎么配置的?
  • 8.Nginx的安全策略需要从哪些方面考虑?
  • 9.Nginx架构是怎样的?
  • 10.总结

一、Nginx是什么?

Nginx是一款免费开源的高性能HTTP服务器及反向代理服务器产品。

二、Nginx具有哪些功能?

  • 1.正向代理与反向代理。
  • 2.负载均衡。
  • 3.Web缓存。
  • 4.动静分离。

三、Nginx的应用场景有哪些?

从我个人的实践经验出发,我用Nginx做了这么几件事情,如下所示:

  • 1.个人网站(如YC-Framework官网就是放在Nginx对应的目录下)或者是公司官网。
  • 2.外部网关代理(内部网关用SpringCloud Gateway,外部网关用Nginx)。
  • 3.基于Nginx+FTP的文件服务搭建。
  • 4.Nginx代理后端服务集群(负载均衡机制的体现)。
  • 5.基于Nginx Basic认证控制系统访问权限。
  • 6.内网映射代理。
  • 7.配置https。
  • 8.黑白名单。

四、Nginx的衍生生态有哪些?

衍生生态比较出名的一个叫Openresty。Openresty是一款基于 Nginx和LuaJIT的Web平台,它既具有Nginx拥有的功能,同时由于大量精良的Lua库,使其更加灵活,能构造出很多玩法。一句话概括,功能更强大了。

关于Openresty安装可以阅读我的这篇文章:
OpenResty源码编译安装

五、Nginx开源相关资料有哪些?

Nginx官方网站:
https://nginx.org/en/

Nginx官方文档:
http://nginx.org/en/docs/contributing_changes.html

Nginx源代码:
https://github.com/nginx/nginx

如果大家觉得英文方面阅读方面有一些困难,不用担心。一方面可以借助Google翻译或其它翻译工具降低阅读困难,另外一方面可借助国内内容网站所包含的丰富内容(如博客园、知乎、掘金、51CTO、思否、CSDN等这样的)。

除此之外,Nginx的商业化解决方案可供一些朋友参考,Nginx的商业网站:
https://www.nginx.com/

六、Nginx怎么样安装?

过去我写了不少文章,可供大家参考:

Windows安装Nginx

Centos7之Java开发环境构建(包含Nginx安装)

Ubuntu16.04之开发环境构建(包含Nginx安装)

七、Nginx常用的配置包含哪些?以及是怎么配置的?

1.Nginx怎样配置HTTPS?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 443 ssl;

server_name framework.youcongtech.com;

ssl_certificate /home/tech/7788450_framework.youcongtech.com.pem;
ssl_certificate_key /home/tech/7788450_framework.youcongtech.com.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
try_files $uri $uri/ /index.html;
root /home/tech/project/yc-framework-docs;
index index.html index.htm;
# root html;
# index index.html index.htm;
}
}

这个是我官网的证书配置,大家可访问分布式微服务框架:YC-Framework官网查看效果。

2.Nginx开启SSL以后如何将HTTP重定向到HTTPS呢?

YC-Framework官网采用的是第二种方法。

(1)第一种方法

1
2
3
4
5
server {
listen 80;
server_name localhost;
return 301 https://127.0.0.1$request_uri;
}

(2)第二种方法

1
2
3
4
5
server {
listen 80;
server_name localhost;
rewrite ^(.*)$ https://$host$1 permanent;
}

(3)Nginx如何配置静态资源映射?

1
2
3
4
location /img/ {
alias /home/tech/img/;
autoindex on;
}

(4)Nginx如何代理内部服务器某个中间件(如MySQL)?

1
2
3
4
5
6
7
8
9
10
11
12
stream {
upstream inner_mysql {
hash $remote_addr consistent;
server 192.168.1.188:3389 weight=5 max_fails=3 fail_timeout=30s;
}
server {
listen 17865; # 数据库服务器监听端口
proxy_connect_timeout 60s;
proxy_timeout 300s; # 设置客户端和代理服务之间的超时时间,如果5分钟内没操作将自动断开。
proxy_pass inner_mysql;
}
}

(5)Nginx如何配置跨域?

1
2
3
4
5
6
7
8
#允许跨域请求的域,* 代表所有
add_header 'Access-Control-Allow-Origin' *;
#允许请求的header
add_header 'Access-Control-Allow-Headers' *;
#允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
#允许请求的方法,比如 GET,POST,PUT,DELETE
add_header 'Access-Control-Allow-Methods' *;

(6)Nginx如何配置限制连接?

1
2
3
4
5
location / {
root /var/www/test;
index index.php index.html index.htm;
limit_conn addr 5; #是限制每个IP只能发起5个连接
}

(7)Nginx如何配置限制下载速度?

1
2
3
4
location /download { 
limit_rate_after 10m;
limit_rate 128k;
}

(8)Nginx如何限制IP访问?

1
2
3
4
5
6
# 允许部分ip访问
allow 123.45.25.6;
allow 123.68.52.125;
allow 123.125.25.106;
# 禁止其余ip访问
deny all;

该配置可放server和location中。

(9)Nginx如何配置HTTP Basic认证?

1
2
3
4
5
6
location /
{
auth_basic "网站名称";
auth_basic_user_file conf.d/passwd;
autoindex on;
}

详情可阅读这篇文章为 Nginx 添加 HTTP 基本认证(HTTP Basic Authentication)

(10)Nginx如何配置超时时间?

1
2
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)

(11)Nginx请求体过大怎么办?

这种场景通常出现在Nginx代理后端服务中。问题的报错信息如下:

1
413 Request Entity Too Large

解决办法配置如下即可:

1
client_max_body_size 20m;

(12)Nginx如何配置负载均衡?

Nginx负载均衡有六种策略,分别是轮询、权重、ip_hash、最少连接、fair、url_hash等)。

(1)轮询策略

1
2
3
4
upstream  backup-server {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}

(2)权重策略

1
2
3
4
upstream  backup-server {
server 192.168.1.101:8080 weigh=5;
server 192.168.1.102:8080 weigh=6;
}

(3)ip_hash策略

1
2
3
4
5
upstream  backup-server {
ip_hash;
server 192.168.1.101:8080 weigh=5;
server 192.168.1.102:8080 weigh=6;
}

(4)最少连接策略

1
2
3
4
5
upstream  backup-server {
least_conn;
server 192.168.1.101:8080 weigh=5;
server 192.168.1.102:8080 weigh=6;
}

(5)fair策略

1
2
3
4
5
upstream  backup-server {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
fair;
}

(6)url_hash策略

1
2
3
4
5
upstream  backup-server {
hash $request_uri;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}

八、Nginx的安全策略需要从哪些方面考虑?

1.隐藏Nginx版本信息,防止对应的攻击者通过版本漏洞来攻击

1
server_tokens off;

2.限制HTTP请求方式

HTTP请求一共有九种,分别为GET、POST、Head、OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT等。

这里我仅仅只允许GET与POST:

1
2
3
if ($request_method !~ ^(GET|POST)$ ) {
return 404;
}

3.自定义Nginx缓存

1
2
3
4
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服务器传

4.过滤非法USER-AGENT(简称UA)

1
2
3
if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) {
return 403;
}

5.过滤不支持URL

1
2
3
location ~* \.(bak|save|sh|sql|mdb|svn|git|old)$ {
rewrite ^/(.*)$ $host permanent;
}

6.强制域名访问(必须开启SSL保护)

1
2
3
if ( $host !~* 'youcongtech.com' ) {
return 403;
}

7.用户降低权限

1
user nginx www;

8.禁止目录浏览

1
autoindex off;

9.限制文件上传大小

1
client_max_body_size 18m

10.关注Nginx所使用版本的漏洞情况,并适时更新

关于Nginx相关版本信息可访问如下网址获取(Nginx下载地址):
https://nginx.org/en/download.html

当然了,这仅仅是从Nginx的安全角度出发,光从Nginx出发只能在一定程度上保障Nginx本身的安全,还是得从服务器层面乃至制度层面入手。服务器层面我曾写过一些文章,可供读者朋友参考:
服务器安全策略之思考与实践

九、Nginx架构是怎样的?

1.Nginx架构设计的核心主要包含哪些方面?

Nginx架构图

由图可知,架构设计的核心主要体现如下:

  • (1)模块化设计。
  • (2)代理设计。
  • (3)事件驱动模型。
  • (4)主进程模型。
  • (5)工作进程模型。

2.Nginx启动流程是怎样的?

Nginx启动流程图

3.Nginx源代码对应的目录是什么意思?

Nginx源代码目录为如下:

1
2
3
4
5
6
7
- core (该目录存放core module的代码,也是nginx服务的入口)
- event (nginx 自身对事件处理逻辑的封装)
- http (http core module 的代码,nginx作为web/http proxy server运行时的核心模块)
- mail (mail core module 的代码,nginx作为pop3/imap/smtp proxy server运行时的核心模块)
- misc (nginx 的一些utils,定义了test和profiler的一些外围模块的逻辑)
- os (nginx对各个平台抽象逻辑的封装)
- stream (nginx用来实现四层协议的转发、代理和负载均衡)

十、总结

光凭这一篇文章很难深入到Nginx的各种细节当中,不过此文章着重体现两个方面,第一个方面是Nginx各种配置示例(基本来源于我个人架构生涯中的Nginx实战),第二个方面总览Nginx架构,明确架构核心、启动流程、源代码目录的含义等(读者朋友可根据自己需要进行查阅相关资料并深入学习实践等)。

文章目录
  1. 一、Nginx是什么?
  2. 二、Nginx具有哪些功能?
  3. 三、Nginx的应用场景有哪些?
  4. 四、Nginx的衍生生态有哪些?
  5. 五、Nginx开源相关资料有哪些?
  6. 六、Nginx怎么样安装?
  7. 七、Nginx常用的配置包含哪些?以及是怎么配置的?
    1. 1.Nginx怎样配置HTTPS?
    2. 2.Nginx开启SSL以后如何将HTTP重定向到HTTPS呢?
      1. (1)第一种方法
      2. (2)第二种方法
    3. (3)Nginx如何配置静态资源映射?
    4. (4)Nginx如何代理内部服务器某个中间件(如MySQL)?
    5. (5)Nginx如何配置跨域?
    6. (6)Nginx如何配置限制连接?
    7. (7)Nginx如何配置限制下载速度?
    8. (8)Nginx如何限制IP访问?
    9. (9)Nginx如何配置HTTP Basic认证?
    10. (10)Nginx如何配置超时时间?
    11. (11)Nginx请求体过大怎么办?
    12. (12)Nginx如何配置负载均衡?
      1. (1)轮询策略
      2. (2)权重策略
      3. (3)ip_hash策略
      4. (4)最少连接策略
      5. (5)fair策略
      6. (6)url_hash策略
  8. 八、Nginx的安全策略需要从哪些方面考虑?
    1. 1.隐藏Nginx版本信息,防止对应的攻击者通过版本漏洞来攻击
    2. 2.限制HTTP请求方式
    3. 3.自定义Nginx缓存
    4. 4.过滤非法USER-AGENT(简称UA)
    5. 5.过滤不支持URL
    6. 6.强制域名访问(必须开启SSL保护)
    7. 7.用户降低权限
    8. 8.禁止目录浏览
    9. 9.限制文件上传大小
    10. 10.关注Nginx所使用版本的漏洞情况,并适时更新
  9. 九、Nginx架构是怎样的?
    1. 1.Nginx架构设计的核心主要包含哪些方面?
    2. 2.Nginx启动流程是怎样的?
    3. 3.Nginx源代码对应的目录是什么意思?
  10. 十、总结