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; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_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/plain
default_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;
}