一文了解 Nginx 反向代理与 conf 原理「技术干货分享」
Nginx 主要功能
Webservice, 反向代理, 负载均衡。
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习
逻辑上,nginx 和 server 的关系是这样的:
Nginx 和路由器/交换机有什么区别?
路由器是物理网关,nginx 是应用层网关。
物理上,他们的关系是下图这样的。
Nginx、haproxy、lvs、F5,都可以做负载均衡,有什么区别?
他们处于 tcp/ip 协议不同层。
Nginx 安装
所需要的安装包 nginx、openssl、pcre、zlib
编辑切换为居中
添加图片注释,不超过 140 字(可选)
安装命令
./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-pcre=/root/nginx/pcre-8.39 --with-zlib=/root/nginx/zlib-1.2.11 --with-openssl=/root/nginx/openssl-1.1.1g
启动 nginx
cd /usr/local/nginx
./sbin/nginx -c ./conf/nginx.conf
使用默认配置启动 nginx
之后通过浏览器访问 nginx。
conf 文件使用
最基本的使用如下:
worker_processes 4;events {worker_connections 1024;
}http {server {listen 9001;location / {proxy_pass http://172.17.0.2:9004;}}server {listen 9002;}server {listen 9003;}server {listen 9004;location / {root /html;}}}
复制代码
配置 worker 进程数
worker_processes 4;
复制代码
master 进程 listen 端口,网络 io 由 worker 进程处理;对于浏览器发送的请求,会产生两个 tcp 连接,一个是 http 请求,一个是 keep-alive。
配置服务
nginx 支持 http,smtp,websocket 等多种应用层协议;也可以 listen 不同的端口;
http {server {listen 9100;}
}
复制代码
配置代理
http {server {listen 9001;location / {proxy_pass http://172.17.0.2:9004;}}
}
复制代码
重定向
http {server {listen 9001;location / {rewrite ^/(.*) https://github.com/congchp/Linux-server redirect;}}
}
复制代码
负载均衡
upstream backend {server 172.17.0.2:9000 weight=2;server 172.17.0.2:9001 weight=1;}location / {proxy_pass http://backend;}
复制代码
提供静态服务内容
图片
location /images/ {root /share/;}
复制代码
视频
location /vedio/ {root /share/;}
复制代码
支持 CGI
common gateway interface, 通用网关接口。nginx 通过 stdin、stdout 也 cgi 程序进行通信。
主要用在哪里?在线编译工具。
编写一个 cgi 程序
// gcc -o hello_cgi hello_cgi.h -lfcgi
#include <stdio.h>
#include <fcgi_stdio.h>int main() {while (FCGI_Accept() >= 0) {printf(" Content-type: text/html\r\n");printf("\r\n");printf("<title>Fast CGI Hello! </title>");printf("<h1>Congchp cgi</h1>");printf("Thank you cgi\n");}
}
复制代码
nginx 使用 cgi,需要安装 fastcgi 和 spawn-fcgi。cgi 是一请求一进程;fastcgi 是一个进程池,通过进行管理器对 cgi 进行管理。spawn-fcgi 是 fastcgi 进行管理器,管理 cgi。
spawn-fcgi 编译
./configure
make
#将编译后的spawn-fcgi程序copy到/usr/local/nginx目录下
cp ./src/spwan-fcgi /usr/local/nginx
复制代码
fastcgi 编译安装
./configure
make
make install
复制代码
通过 spawn-fcgi 启动 cgi 程序。
./spawn-fcgi -a 127.0.0.1 -p 9101 -f /share/hello_cgi
复制代码
nginx 配置
server {listen 9102;location / {fastcgi_pass 127.0.0.1:9101;fastcgi_index index.cgi;fastcgi_param SCRIPT_FILENAME cgi$fastcgi_script_name;include ../conf/fastcgi_params;}}
复制代码
什么是惊群?
惊群分为 3 种:
- accept
- epoll_wait
- pthead_cond_wait
accept 惊群和 pthead_cond_wait 的惊群,内核已经解决了。
nginx 是存在 epoll_wait 惊群的,为什么呢?
所有 workder 进程都是从 master 进程 fork 出来的,都对同一个端口进行 listen,如果在所有 worker 进程中使用 epoll 对 listenfd 进行检测,必然会出现 epoll_wait 的惊群。
惊群并不会导致业务问题,只会造成很多无效的唤醒,高性能的服务器是不能接受这一点的。
nginx 是如何解决 epoll_wait 惊群的?
通过加 accept 锁,通过 shmem 共享内存实现进程锁。
为保证只有一个 worker 进程对新连接进行处理,所有 worker 进程在向 epoll 注册 listenfd 读事件前抢 accept_mutex, 抢到互斥锁的那个进程注册 listenfd 读事件,在读事件里面调用 accept 接受该连接。当一个 worker 进程在 accept 这个连接之后,就开始读取请求,解析请求,处理请求,产生 response 后,再返回给客户端,最后才断开连接。一个请求,完全由一个 worker 进程来处理,而且只在一个 worker 进程中处理。
其他没有抢到 accept 锁的 worker 进程,可以处理其他 event。
while (1) {ret = try_lock(lock);if (ret == 0)epll_ctl(epfd, EPOLL_ADD, listenfd, EPOLL_IN);epoll_wait();if (events[i].data.fd == listenfd)unlock(lock);
}
复制代码
小伙伴们有兴趣想了解更多相关学习资料请点赞收藏+评论转发+关注我之后私信我,注意回复【666】即可获取更多免费资料!
一文了解 Nginx 反向代理与 conf 原理「技术干货分享」相关推荐
- Nginx反向代理与系统参数配置conf
文章目录 一. nginx介绍 二. nginx的安装和配置 使用nginx必备安装的库 1.PCRE库的安装和编译 2.zlib库的安装和编译 3.OpenSSL开发库的安装和编译 nginx的编译 ...
- 2022年4月10日记:Linux服务器开发,King,Nginx反向代理与系统参数配置conf原理
Nginx反向代理与系统参数配置conf原理 前言 nginx成功开源的原因: nginx三个可控入口: 惊群 总结 前言 今天学习Nginx反向代理,可以说是慕名而来.从整体上看,我对Nginx的了 ...
- nginx反向代理原理及配置详解
nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外 ...
- OSS在private权限下的无参数访问(Nginx反向代理实现)
本文主要介绍内容 oss默认权限策略是private,当修改到public-read或更高权限时会提示存在安全风险.如果需要访问oss资源需要在地址上添加签名内容,不利于地址的存储和使用.本文会介绍如 ...
- nignx的TCP和UDP调度(nginx反向代理)
1 案例1:Nginx反向代理 1.1 问题 使用Nginx实现Web反向代理功能,实现如下功能: 后端Web服务器两台,可以使用httpd实现 Nginx采用轮询的方式调用后端Web服务器 两台We ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解(1)
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
- 容器化单页面应用中Nginx反向代理与Kubernetes部署
在<容器化单页面应用中RESTful API的访问>一文中,我介绍了一个在容器化环境中单页面应用访问后端服务的完整案例.这里我将继续使用这个案例,介绍一下容器化单页面应用部署的另一个场景: ...
- Nginx反向代理与负载均衡等配置文件示例
Nginx反向代理于负载均衡等配置文件示例 Nginx.conf配置文件 worker_processes 8;events {worker_connections 1024; }http {incl ...
- 通过Nginx反向代理,实现远程调试本机代码
作者:mokeyWie segmentfault.com/a/1190000021453331 背景 现在公司项目都是前后端分离的方式开发,有些时候由于某些新需求开发或者 bug 修改,想要让前端直接 ...
最新文章
- 怎么设计计算机网络共享,如何设置网络共享 网络共享设置方法【详解】
- 常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可)
- 【tf.keras】tf.keras使用tensorflow中定义的optimizer
- MySQL row_format引发的案例一则
- mysql 远程连接
- Failed to start LSB: start and stop MariaDB
- CentOS 安装Sqlite3
- nodejs/pomelo 使用 mongodb 连接 mongo时 出现
- OSChina 周一乱弹 —— 这片城市都会属于你,而你属于我
- IOS 调用微信扫码二维码
- “企鹅号+时尚集团MCN”强强联手 打造19春夏时装周报道新模式
- 如何优雅的创建一个Java不可变对象类,JDK源码中也是这么干的!
- 【Python】列表 - 集大成篇
- 前端搜索引擎优化SEO优化之Title 和 Meta 标签
- win2019微软更新服务器,将 Windows Server 2016 升级到 Windows Server 2019
- 菜鸟学JAVA之——常用类(StringBuffer、StringBuilder、Comparable、Comparator等)
- linux命令英文单词
- UML类图关系(C++)
- 测试用例设计(等价类、边界值、因果图、判定表、正交实验)
- error: expected ‘}’ at end of input }问题处理
热门文章
- 什么是股票API交易?需要注意什么风险?
- 数字后端基本概念介绍——Track
- JAVA建行银企直连报文加解密
- 让别人快乐地捐钱:英国人的慈善教育
- Excel快速美化图表,瞬间高大上不再单调,老板都喜欢的图表
- Excel 2010编辑文档保存时“停止运行”解决办法(适用于特定问题)
- 傅里叶变换尺度变换性质_图像处理之傅里叶变换
- 正确选择电子邮件归档 不做重复投资
- 基于google升级版c++代码规范指南
- The located assembly’s manifest definition does not match the assembly reference