写点什么

【技术干货分享】一文了解 Nginx 反向代理与 conf 原理

  • 2022 年 3 月 30 日
  • 本文字数:2478 字

    阅读完需:约 8 分钟

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。

现在 C++程序员面临的竞争压力越来越大。那么,作为一名 C++程序员,怎样努力才能快速成长为一名高级的程序员或者架构师,或者说一名优秀的高级工程师或架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员,也是工作三五年之后开始迷茫的老程序员,都必须要面对和想明白的问题。为了帮助大家少走弯路,技术要做到知其然还要知其所以然。以下视频获取点击:C++架构师学习资料

配置服务

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 编译

./configuremake#将编译后的spawn-fcgi程序copy到/usr/local/nginx目录下cp ./src/spwan-fcgi /usr/local/nginx
复制代码

fastcgi 编译安装

./configuremakemake 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);}
复制代码


用户头像

Linux服务器开发qun720209036,欢迎来交流 2020.11.26 加入

专注C/C++ Linux后台服务器开发。

评论

发布
暂无评论
【技术干货分享】一文了解Nginx反向代理与conf原理_nginx_Linux服务器开发_InfoQ写作平台