nginx源码目录结构:

.
├── auto            自动检测系统环境以及编译相关的脚本
│   ├── cc          关于编译器相关的编译选项的检测脚本
│   ├── lib         nginx编译所需要的一些库的检测脚本
│   ├── os          与平台相关的一些系统参数与系统调用相关的检测
│   └── types       与数据类型相关的一些辅助脚本
├── conf            存放默认配置文件,在make install后,会拷贝到安装目录中去
├── contrib         存放一些实用工具,如geo配置生成工具(geo2nginx.pl)
├── html            存放默认的网页文件,在make install后,会拷贝到安装目录中去
├── man             nginx的man手册
└── src             存放nginx的源代码├── core        nginx的核心源代码,包括常用数据结构的定义,以及nginx初始化运行的核心代码如main函数├── event       对系统事件处理机制的封装,以及定时器的实现相关代码│   └── modules 不同事件处理方式的模块化,如select、poll、epoll、kqueue等├── http        nginx作为http服务器相关的代码│   └── modules 包含http的各种功能模块├── mail        nginx作为邮件代理服务器相关的代码├── misc        一些辅助代码,测试c++头的兼容性,以及对google_perftools的支持└── os          主要是对各种不同体系统结构所提供的系统函数的封装,对外提供统一的系统调用接口

Nginx由内核和模块组成。

Nginx的模块从结构上分为核心模块、基础模块和第三方模块:

  • 核心模块:HTTP模块、EVENT模块和MAIL模块
  • 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,
  • 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

Nginx的模块从功能上分为如下三类:

  • Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。
  • Filters (过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
  • Proxies (代理类模块)。此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

Nginx进程模型:

  Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程。其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求。

worker工作原理:

在创建 Worker 进程的时候,是通过 fork 系统调用让 Worker 进程完全复制自己的资源,包括 listen 状态的 socket 句柄。

在 Worker 进程中,创建了一个 epoll 内核对象,通过 epoll_ctl 将其想监听的事件注册上去,然后调用 epoll_wait 进入事件循环。

 

客户端与epllo交互观过程:

Nginx配置详解:

#配置用户或者组,默认为nobody
user  nginx;#允许生成的进程数,默认为1,一般配置为cpu核数
worker_processes  auto;
#错误日志
error_log  /var/log/nginx/error.log notice;#进程ID
pid        /var/run/nginx.pid;events {accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为onmulti_accept off;  #设置一个进程是否同时接受多个网络连接,默认为off# epoll 模型对事件处理进行优化use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport#允许最大连接数worker_connections  65535;
}http {#隐藏nginx版本信息server_tokens off;#文件扩展名与文件类型映射表include       /etc/nginx/mime.types;#默认文件类型,默认为text/plaindefault_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;#连接超时时间,默认为75s,可以在http,server,location块。keepalive_timeout  65;#gzip  on;client_max_body_size 1024m;#包含的自定义配置文件块include /etc/nginx/conf.d/*.conf;#是否传递4xx和5xx错误信息到客户端,或者允许nginx使用error_page处理错误信息。fastcgi_intercept_errors on;
}

子文件:

#8561端口服务器
server {#监听端口listen 8561;#域名配置项server_name _;location  /h5 {root  /usr/share/nginx/html/;try_files $uri $uri/ /h5/index.html;} location  /mhyr-project {root  /usr/share/nginx/html/mhyr-project/;try_files $uri $uri/ /index.html;} #静态资源配置项location /resource/ {proxy_pass https://tenc.cos.ap-beij.myqcloud.com/;}#静态资源location /icon/ {root /usr/share/nginx/html/mhyr-project-plat;try_files $uri $uri/ /index.html;}      #反向代理location /mhyrproject/ {proxy_set_header Host $host;client_max_body_size 10m;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://localhost:8100/;}#错误页面配置项  error_page   403 404  /404.html;location = /404.html {root  error;}# redirect server error pages to the static page /50x.html# error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}#443端口服务器
server {listen 443 ssl http2;#域名配置项server_name t-project.mhyr.cn;#证书配置项ssl_certificate /etc/nginx/cert/mhyr.cn2022.txt;#证书秘钥配置项ssl_certificate_key /etc/nginx/cert/private2022_unsecure.key;ssl_prefer_server_ciphers on;#SSL协议配置项ssl_protocols TLSv1.2;location  /h5 {root  /usr/share/nginx/html/;try_files $uri $uri/ /h5/index.html;} location /mhyrproject/ {proxy_set_header Host $host;client_max_body_size 10m;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#反向代理proxy_pass http://apisSrvice;}location /resource/ {proxy_pass https://jt-mbr-uat-1301587776.cos.ap-beijing.myqcloud.com/;}location /icon/ {root /usr/share/nginx/html/mhyr-project-plat;try_files $uri $uri/ /index.html;}proxy_intercept_errors on;error_page  500 502 503 504 404 403   /404.html;#error_page 500 502 503 504 404 403 = https://project-test.mangocity.com/mhyr-project/#/error;location =  /404.html {root   /usr/share/nginx/html;}# redirect server error pages to the static page /50x.html# error_page   500 502 503 504  /50x.html;#location = /50x.html {#    root   html;#}
}upstream apisSrvice { server  20.11.1.26:9100 max_fails=2  fail_timeout=5s;server  20.11.1.45:9100 max_fails=2  fail_timeout=5s;server  20.11.1.46:9100 max_fails=2  fail_timeout=5s;server  20.11.1.30:9100 max_fails=2  fail_timeout=5s;server  20.11.1.21:9100 max_fails=2  fail_timeout=5s;
}

JAVA开发运维(nginx工作原理)相关推荐

  1. JAVA开发运维(扁鹊见齐桓公之系统运维之痛)

    引言: 扁鹊见蔡桓公,立有间,扁鹊曰:"君有疾在腠理,不治将恐深."桓侯曰:"寡人无疾."扁鹊出,桓侯曰:"医之好治不病以为功!" 居十日, ...

  2. 为什么数据科学家需要承担开发运维的工作?

    作者 | Caleb Kaiser 译者 | 弯月,责编 | 夕颜 头图 | CSDN下载自视觉中国 出品 | CSDN(ID:CSDNnews) 以下为译文: 如果你需要创建一个生产环境下的机器学习 ...

  3. JAVA开发运维(DevOps过程)

    DevOps开发运维的一套方法论.这边文章主要借鉴万达的DevOps的建设过程.谈谈DevOps主要解决那些问题和怎么解决. DevOps的是一种IT项目开发管理方法论,它旨在提供全面的持续集成.持续 ...

  4. JAVA开发运维(CI/CD)

    CI :持续性集成 CD:持续性部署 SIT:系统集成测试 UAT:用户验收测试 研发流程的变化,因为用户永远一开始不知道自己想要什么样的东西,导致了软件无法从一而终的进行设计,用户需要能立刻运行的软 ...

  5. JAVA开发运维(云基础设备监控)

    在大型的商用系统中,经常需要监控云设备的健康状态,性能情况,流量数据等.及时发现系统问题,及时修复,以确保系统的高可用.检查云资源的工作内容主要包括基础监控.主动拨测.用户体验.APM监控.指标体系. ...

  6. JAVA开发运维(关于渗透测试与漏洞修复)

    对于C端的网站,H5,小程序或者app都需要进行渗透测试. 渗透测试是模拟真实黑客的攻击手段,对目标网站或主机进行全面的安全评估. 与黑客攻击不同,渗透测试的目的是尽可能多地发现安全漏洞,而真正的黑客 ...

  7. JAVA开发运维(基于腾讯云的运维资源)

    序号 资源 描述 1 ECS服务器 前端服务器 2 前端服务器 3 前端服务器 4 后端服务器 5 后端服务器 6 后端服务器 7 redis 数据库,缓存 8 mysql 数据库 9 clb 数据库 ...

  8. JAVA开发运维(Jenkins中踩的坑)

    最近尝试通过Jenkins来自动化部署项目,没想到还踩了很多坑.Jenkins部署的基本原理: 通过Jenkins服务器拉取gitlab上的代码进行打包,推送到目标服务器上,并运行启动脚本. 那么Je ...

  9. python自动化部署nginx_扣丁学堂Python开发运维自动化之nginx配置文件对比操作

    扣丁学堂Python开发运维自动化之nginx配置文件对比操作 2018-08-30 09:51:29 646浏览 今天扣丁学堂Python培训老师给大家介绍一下关于Python运维自动化之nginx ...

最新文章

  1. iOS 实现点击微信头像效果
  2. ACMNO.50 完美的代价(主要是不同情况下面的讨论)
  3. 定时器 线程池\进程池
  4. Linux as4开启telnet,linux as4 虚拟机 上开启 telnet 和ssh 和 ftp 服务
  5. js中window.onload 与 jquery中$(document.ready()) 测试
  6. 2019-5-15求职笔试题
  7. HMM学习最佳范例一:介绍
  8. libhv网络库源码剖析
  9. Spring cloud oauth2搭建OAuth2.0授权服务
  10. H5开发html文件转换pdf,将HTML页面转换为PDF文件并导出
  11. HR模块-组织信息类型创建-PP01
  12. banner 图片自动轮播
  13. python汽车租赁程序_python数据分析实例:共享单车租用影响因素探索
  14. mysql用update方法更改用户密码
  15. LeetCode:838. 推多米诺————中等
  16. 打开用友总账时提示“该产品没有安装,无法使用”
  17. 训练赛1_E_Lawnmower
  18. mysql连接的特性及拖库姿势
  19. oracle 会话数上不去_程序员笔记|全面解析Oracle等待事件的分类、发现及优化
  20. Linux文件存储(1)什么是格式化

热门文章

  1. 网络基础-IP、端口等
  2. 1323:【例6.5】活动选择
  3. 伦敦旅游必玩的密室逃脱体验——《神探夏洛克:官方现场游戏》
  4. 小程序兼容苹果底部安全距离
  5. 2022电大国家开放大学网上形考任务-人体解剖生理学(本)非免费(非答案)
  6. 2017国家集训队作业[agc016e]Poor Turkey
  7. 12.15有一种数叫回文数,正读和反读都一样,如12321便是一个回文数。编写一个程序,从命令行得到一个整数,判断该数是不是回文数
  8. GK Summay算法(ϵ−approximate ϕ−quantile)
  9. dgi数据治理_银行数据治理方法浅析
  10. 设计一个靠谱的监控告警平台