本文主要内容如下(让读者朋友们深入浅出地理解Nginx,有代码有示例有图):
1.Nginx是什么?
2.Nginx具有哪些功能?
3.Nginx的应用场景有哪些?
4.Nginx的衍生生态有哪些?
5.Nginx开源相关资料有哪些?
6.Nginx怎么样安装?
7.Nginx常用的配置包含哪些?以及是怎么配置的?
8.Nginx的安全策略需要从哪些方面考虑?
9.Nginx架构是怎样的?
10.总结
Nginx是一款免费开源的高性能HTTP服务器及反向代理服务器产品。
1.正向代理与反向代理。
2.负载均衡。
3.Web缓存。
4.动静分离。
从我个人的实践经验出发,我用Nginx做了这么几件事情,如下所示:
1.个人网站(如YC-Framework官网就是放在Nginx对应的目录下)或者是公司官网。
2.外部网关代理(内部网关用SpringCloud Gateway,外部网关用Nginx)。
3.基于Nginx+FTP的文件服务搭建。
4.Nginx代理后端服务集群(负载均衡机制的体现)。
5.基于Nginx Basic认证控制系统访问权限。
6.内网映射代理。
7.配置https。
8.黑白名单。
衍生生态比较出名的一个叫Openresty。Openresty是一款基于 Nginx和LuaJIT的Web平台,它既具有Nginx拥有的功能,同时由于大量精良的Lua库,使其更加灵活,能构造出很多玩法。一句话概括,功能更强大了。
关于Openresty安装可以阅读我的这篇文章: OpenResty源码编译安装
Nginx官方网站: nginx
Nginx官方文档: Contributing Changes
Nginx源代码: GitHub - nginx/nginx: An official read-only mirror of http://hg.nginx.org/nginx/ which is updated hourly. Pull requests on GitHub cannot be accepted and will be automatically closed. The proper way to submit changes to nginx is via the nginx development mailing list, see http://nginx.org/en/docs/contributing_changes.html
如果大家觉得英文方面阅读方面有一些困难,不用担心。一方面可以借助Google翻译或其它翻译工具降低阅读困难,另外一方面可借助国内内容网站所包含的丰富内容(如博客园、知乎、掘金、51CTO、思否、CSDN等这样的)。
除此之外,Nginx的商业化解决方案可供一些朋友参考,Nginx的商业网站: Advanced Load Balancer, Web Server, & Reverse Proxy - NGINX
过去我写了不少文章,可供大家参考:
Windows安装Nginx
Centos7之Java开发环境构建(包含Nginx安装)
Ubuntu16.04之开发环境构建(包含Nginx安装)
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官网查看效果。
YC-Framework官网采用的是第二种方法。
server {
listen 80;
server_name localhost;
return 301 https://127.0.0.1$request_uri;
}
server {
listen 80;
server_name localhost;
rewrite ^(.*)$ https://$host$1 permanent;
}
location /img/ {
alias /home/tech/img/;
autoindex on;
}
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;
}
}
#允许跨域请求的域,* 代表所有
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' *;
location / {
root /var/www/test;
index index.php index.html index.htm;
limit_conn addr 5; #是限制每个IP只能发起5个连接
}
location /download {
limit_rate_after 10m;
limit_rate 128k;
}
# 允许部分ip访问
allow 123.45.25.6;
allow 123.68.52.125;
allow 123.125.25.106;
# 禁止其余ip访问
deny all;
该配置可放server和location中。
location /
{
auth_basic "网站名称";
auth_basic_user_file conf.d/passwd;
autoindex on;
}
详情可阅读这篇文章为 Nginx 添加 HTTP 基本认证(HTTP Basic Authentication)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
这种场景通常出现在Nginx代理后端服务中。问题的报错信息如下:
413 Request Entity Too Large
解决办法配置如下即可:
client_max_body_size 20m;
Nginx负载均衡有六种策略,分别是轮询、权重、ip_hash、最少连接、fair、url_hash等)。
upstream backup-server {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
upstream backup-server {
server 192.168.1.101:8080 weigh=5;
server 192.168.1.102:8080 weigh=6;
}
upstream backup-server {
ip_hash;
server 192.168.1.101:8080 weigh=5;
server 192.168.1.102:8080 weigh=6;
}
upstream backup-server {
least_conn;
server 192.168.1.101:8080 weigh=5;
server 192.168.1.102:8080 weigh=6;
}
upstream backup-server {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
fair;
}
upstream backup-server {
hash $request_uri;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
server_tokens off;
HTTP请求一共有九种,分别为GET、POST、Head、OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT等。
这里我仅仅只允许GET与POST:
if ($request_method !~ ^(GET|POST)$ ) {
return 404;
}
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服务器传
if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) {
return 403;
}
location ~* \.(bak|save|sh|sql|mdb|svn|git|old)$ {
rewrite ^/(.*)$ $host permanent;
}
if ( $host !~* 'youcongtech.com' ) {
return 403;
}
user nginx www;
autoindex off;
client_max_body_size 18m
关于Nginx相关版本信息可访问如下网址获取(Nginx下载地址): nginx: download
当然了,这仅仅是从Nginx的安全角度出发,光从Nginx出发只能在一定程度上保障Nginx本身的安全,还是得从服务器层面乃至制度层面入手。
由图可知,架构设计的核心主要体现如下:
(1)模块化设计。
(2)代理设计。
(3)事件驱动模型。
(4)主进程模型。
(5)工作进程模型。
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架构,明确架构核心、启动流程、源代码目录的含义等(读者朋友可根据自己需要进行查阅相关资料并深入学习实践等)。
推荐一个零声教育C/C++后台开发的免费公开课程,个人觉得老师讲得不错,分享给大家:C/C++后台开发高级架构师,内容包括Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习
原文:深入浅出Nginx实战与架构 - 挑战者V - 博客园