深入浅出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怎么样安装?
过去我写了不少文章,可供大家参考:
七、Nginx常用的配置包含哪些?以及是怎么配置的?
1.Nginx怎样配置HTTPS?
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)第一种方法
server {
listen 80;
server_name localhost;
return 301 https://127.0.0.1$request_uri;
}
(2)第二种方法
server {
listen 80;
server_name localhost;
rewrite ^(.*)$ https://$host$1 permanent;
}
(3)Nginx如何配置静态资源映射?
location /img/ {
alias /home/tech/img/;
autoindex on;
}
(4)Nginx如何代理内部服务器某个中间件(如MySQL)?
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如何配置跨域?
#允许跨域请求的域,* 代表所有
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如何配置限制连接?
location / {
root /var/www/test;
index index.php index.html index.htm;
limit_conn addr 5; #是限制每个IP只能发起5个连接
}
(7)Nginx如何配置限制下载速度?
location /download {
limit_rate_after 10m;
limit_rate 128k;
}
(8)Nginx如何限制IP访问?
# 允许部分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认证?
location /
{
auth_basic "网站名称";
auth_basic_user_file conf.d/passwd;
autoindex on;
}
详情可阅读这篇文章为 Nginx 添加 HTTP 基本认证(HTTP Basic Authentication)
(10)Nginx如何配置超时时间?
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
(11)Nginx请求体过大怎么办?
这种场景通常出现在Nginx代理后端服务中。问题的报错信息如下:
413 Request Entity Too Large
解决办法配置如下即可:
client_max_body_size 20m;
(12)Nginx如何配置负载均衡?
Nginx负载均衡有六种策略,分别是轮询、权重、ip_hash、最少连接、fair、url_hash等)。
(1)轮询策略
upstream backup-server {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
(2)权重策略
upstream backup-server {
server 192.168.1.101:8080 weigh=5;
server 192.168.1.102:8080 weigh=6;
}
(3)ip_hash策略
upstream backup-server {
ip_hash;
server 192.168.1.101:8080 weigh=5;
server 192.168.1.102:8080 weigh=6;
}
(4)最少连接策略
upstream backup-server {
least_conn;
server 192.168.1.101:8080 weigh=5;
server 192.168.1.102:8080 weigh=6;
}
(5)fair策略
upstream backup-server {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
fair;
}
(6)url_hash策略
upstream backup-server {
hash $request_uri;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
八、Nginx的安全策略需要从哪些方面考虑?
1.隐藏Nginx版本信息,防止对应的攻击者通过版本漏洞来攻击
server_tokens off;
2.限制HTTP请求方式
HTTP请求一共有九种,分别为GET、POST、Head、OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT等。
这里我仅仅只允许GET与POST:
if ($request_method !~ ^(GET|POST)$ ) {
return 404;
}
3.自定义Nginx缓存
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)
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
location ~* \.(bak|save|sh|sql|mdb|svn|git|old)$ {
rewrite ^/(.*)$ $host permanent;
}
6.强制域名访问(必须开启SSL保护)
if ( $host !~* 'youcongtech.com' ) {
return 403;
}
7.用户降低权限
user nginx www;
8.禁止目录浏览
autoindex off;
9.限制文件上传大小
client_max_body_size 18m
10.关注Nginx所使用版本的漏洞情况,并适时更新
关于Nginx相关版本信息可访问如下网址获取(Nginx下载地址):
https://nginx.org/en/download.html
当然了,这仅仅是从Nginx的安全角度出发,光从Nginx出发只能在一定程度上保障Nginx本身的安全,还是得从服务器层面乃至制度层面入手。服务器层面我曾写过一些文章,可供读者朋友参考:
服务器安全策略之思考与实践
九、Nginx架构是怎样的?
1.Nginx架构设计的核心主要包含哪些方面?

由图可知,架构设计的核心主要体现如下:
- (1)模块化设计。
- (2)代理设计。
- (3)事件驱动模型。
- (4)主进程模型。
- (5)工作进程模型。
2.Nginx启动流程是怎样的?

3.Nginx源代码对应的目录是什么意思?
Nginx源代码目录为如下:
- 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架构,明确架构核心、启动流程、源代码目录的含义等(读者朋友可根据自己需要进行查阅相关资料并深入学习实践等)。
深入浅出Nginx实战与架构的更多相关文章
- 升级版:深入浅出Hadoop实战开发(云存储、MapReduce、HBase实战微博、Hive应用、Storm应用)
Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系 ...
- 深入浅出Nginx
深入浅出Nginx 文章源自zfz_linux_boy 前言 Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 上图基 ...
- Java 18套JAVA企业级大型项目实战分布式架构高并发高可用微服务电商项目实战架构
Java 开发环境:idea https://www.jianshu.com/p/7a824fea1ce7 从无到有构建大型电商微服务架构三个阶段SpringBoot+SpringCloud+Solr ...
- Nginx高性能服务器安装、配置、运维 (4) —— Nginx服务、架构及其信号
五.Nginx服务.架构及其信号 (1)Nginx服务的查看 1.netstat -antp 查看Nginx是否在80端口运行: 2.ps aux|grep nginx 查看nginx相关进程: 发现 ...
- nginx实战
原文:http://www.cnblogs.com/yucongblog/p/6289628.html nginx实战 (一) nginx环境的搭建安装流程: 1 通过ftp将nginx-1.11 ...
- Nginx详解二十九:基于Nginx的中间件架构设计
基于Nginx的中间件架构 一:了解需求 1.定义Nginx在服务体系中的角色 1.静态资源服务 2.代理服务 3.动静分离 2.静态资源服务的功能设计 3.代理服务 二:设计评估 三:配置注意事项
- Nginx实战之让用户通过用户名密码认证访问web站点
1.Nginx实战之让用户通过用户名密码认证访问web站点 [root@master ~]# vim /usr/local/nginx/conf/extra/www.conf server { lis ...
- (转)linux route命令深入浅出与实战案例精讲
linux route命令深入浅出与实战案例精讲 http://blog.51cto.com/oldboy/1119453 深入浅出之-route命令实战使用指南 http://blog.51cto. ...
- 想成长为一名年薪50万+的实战型架构师?必掌握这7大实战技能经验--阿里mike
想成为一名架构师,但是架构师对应的技能,我应该掌握哪些啊?以及掌握的程度是什么样的?如何成为一名真正的实战性架构师? 我简要分为以下7点来谈谈,从技能的角度抛砖引玉,希望你对你架构师之路有一定的参考. ...
随机推荐
- react 实用项目分享-mock server
使用react16+router4+mobx+koa2+mongodb做的mock平台 moapi-cli 本地工具版,一行命令 ,方便个人使用 安装 npm i moapi-cli -g 使用 mo ...
- Initialization failed for 'https://start.spring.io
本文精华(没空的小伙伴,直接看精华部分即可) 1.精华1: 开发/下载项目的时候考虑系统必备的版本兼容性 2.精华2: 通过火狐浏览器访问官网的旧版本,下载到任意需要的项目版本,然后通过项目导入ide ...
- ccf201912-1 报数 C++代码实现
代码实现: #include<iostream> using namespace std; /*题目限制为三位数*/ /*思路: 1.用一个长度为4的数组(初值为0)保存每个人分别跳过了几 ...
- nginx之配置文件公用抽取
nginx之配置文件公用抽取 因为某些原因,需要同时部署同一应用两个不同分支的代码,而配置文件存在较大重复,因此有此篇. 最近构建的过程中遇到了一些跟nginx配置相关的问题,记录下. 简单说下构建的 ...
- mint-ui中messagebox的使用
效果图: 代码: // 安装 # Vue 1.x npm install mint-ui@1 -S # Vue 2.0 npm install mint-ui -S // 引入全部组件 import ...
- ABP源码分析 - 约定注册(3)
入口 //ConfigureServices foreach (var module in Modules) { if (module.Instance is AbpModule abpModule) ...
- Typora原生态的图片格式快速转化为HTML格式
Typora更改图片样式 前言 在Typora中插入的图片,默认是居中且显示原图大小的,如果想要缩小显示,可以右击图片选择缩放图片. 但是,当我上传到博客园中时,并没有保留 居中.缩放 的样式 ...
- CF #781 (Div. 2), (C) Tree Infection
Problem - C - Codeforces Example input 5 7 1 1 1 2 2 4 5 5 5 1 4 2 1 3 3 1 6 1 1 1 1 1 output 4 4 2 ...
- JavaScript学习高级2
## DOM: * 概念: Document Object Model 文档对象模型 * 将标记语言文档的各个组成部分,封装为对象.可以使用这些对象,对标记语言文档进行CRUD ...
- 【MQ】java 从零开始实现消息队列 mq-02-如何实现生产者调用消费者?
前景回顾 上一节我们学习了如何实现基于 netty 客服端和服务端的启动. [mq]从零开始实现 mq-01-生产者.消费者启动 [mq]java 从零开始实现消息队列 mq-02-如何实现生产者调用 ...