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 种:

  1. accept
  2. epoll_wait
  3. 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 原理「技术干货分享」相关推荐

  1. Nginx反向代理与系统参数配置conf

    文章目录 一. nginx介绍 二. nginx的安装和配置 使用nginx必备安装的库 1.PCRE库的安装和编译 2.zlib库的安装和编译 3.OpenSSL开发库的安装和编译 nginx的编译 ...

  2. 2022年4月10日记:Linux服务器开发,King,Nginx反向代理与系统参数配置conf原理

    Nginx反向代理与系统参数配置conf原理 前言 nginx成功开源的原因: nginx三个可控入口: 惊群 总结 前言 今天学习Nginx反向代理,可以说是慕名而来.从整体上看,我对Nginx的了 ...

  3. nginx反向代理原理及配置详解

    nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外 ...

  4. OSS在private权限下的无参数访问(Nginx反向代理实现)

    本文主要介绍内容 oss默认权限策略是private,当修改到public-read或更高权限时会提示存在安全风险.如果需要访问oss资源需要在地址上添加签名内容,不利于地址的存储和使用.本文会介绍如 ...

  5. nignx的TCP和UDP调度(nginx反向代理)

    1 案例1:Nginx反向代理 1.1 问题 使用Nginx实现Web反向代理功能,实现如下功能: 后端Web服务器两台,可以使用httpd实现 Nginx采用轮询的方式调用后端Web服务器 两台We ...

  6. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解(1)

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  7. 容器化单页面应用中Nginx反向代理与Kubernetes部署

    在<容器化单页面应用中RESTful API的访问>一文中,我介绍了一个在容器化环境中单页面应用访问后端服务的完整案例.这里我将继续使用这个案例,介绍一下容器化单页面应用部署的另一个场景: ...

  8. Nginx反向代理与负载均衡等配置文件示例

    Nginx反向代理于负载均衡等配置文件示例 Nginx.conf配置文件 worker_processes 8;events {worker_connections 1024; }http {incl ...

  9. 通过Nginx反向代理,实现远程调试本机代码

    作者:mokeyWie segmentfault.com/a/1190000021453331 背景 现在公司项目都是前后端分离的方式开发,有些时候由于某些新需求开发或者 bug 修改,想要让前端直接 ...

最新文章

  1. 怎么设计计算机网络共享,如何设置网络共享 网络共享设置方法【详解】
  2. 常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可)
  3. 【tf.keras】tf.keras使用tensorflow中定义的optimizer
  4. MySQL row_format引发的案例一则
  5. mysql 远程连接
  6. Failed to start LSB: start and stop MariaDB
  7. CentOS 安装Sqlite3
  8. nodejs/pomelo 使用 mongodb 连接 mongo时 出现
  9. OSChina 周一乱弹 —— 这片城市都会属于你,而你属于我
  10. IOS 调用微信扫码二维码
  11. “企鹅号+时尚集团MCN”强强联手 打造19春夏时装周报道新模式
  12. 如何优雅的创建一个Java不可变对象类,JDK源码中也是这么干的!
  13. 【Python】列表 - 集大成篇
  14. 前端搜索引擎优化SEO优化之Title 和 Meta 标签
  15. win2019微软更新服务器,将 Windows Server 2016 升级到 Windows Server 2019
  16. 菜鸟学JAVA之——常用类(StringBuffer、StringBuilder、Comparable、Comparator等)
  17. linux命令英文单词
  18. UML类图关系(C++)
  19. 测试用例设计(等价类、边界值、因果图、判定表、正交实验)
  20. error: expected ‘}’ at end of input }问题处理

热门文章

  1. 什么是股票API交易?需要注意什么风险?
  2. 数字后端基本概念介绍——Track
  3. JAVA建行银企直连报文加解密
  4. 让别人快乐地捐钱:英国人的慈善教育
  5. Excel快速美化图表,瞬间高大上不再单调,老板都喜欢的图表
  6. Excel 2010编辑文档保存时“停止运行”解决办法(适用于特定问题)
  7. 傅里叶变换尺度变换性质_图像处理之傅里叶变换
  8. 正确选择电子邮件归档 不做重复投资
  9. 基于google升级版c++代码规范指南
  10. The located assembly’s manifest definition does not match the assembly reference