Nginx

Nginx介绍

模块化设计

Nginx 的 worker 进程分为核心模块和功能性模块。

核心模块主要负责维持一个运行循环(run-loop),在其中执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。

Nginx 的代码采用了模块化设计,这使得我们可以根据需要选择和修改功能模块,然后编译成具有特定功能的服务器。

正向代理

反向代理

负载均衡

1、安装nginx

参考https://www.cnblogs.com/hanyinglong/p/5102141.html

如出现/bin/sh: ./configure: No such file or directory make[1]: *** [auto/lib/pcre/Makefile] Error 127

表示pcre安装目录不正确,需要重新按照教程安装pcre

cd /usr/local/nginx/sbin/
 
./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful


 
表示安装成功

 
./nginx -c /usr/local/nginx/conf/nginx.conf
启动nginx

2、配置log

配置文件存在 /usr/local/nginx/conf/nginx.conf

添加

log_format main '$remote_addr - $remote_user [$time_local] "$host:$server_port" "$request" '
'$status $body_bytes_sent "$request_body" "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_time"';


重启

./nginx -s stop

./nginx -s reload

3、反向代理

反向代理可以认为,能确认客户端(IP地址),通过常规途径访问服务,但在客户端配置Host域名解析,将流量导入代理服务地址。

请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。

在客户端/etc/hosts配置域名解析对应关系

127.0.0.1 8080.test.com

代理服务器需监听:80端口(TCP 默认端口80)

1.模拟2个http服务器作为目标服务器

用作测试,使用2个tomcat实例模拟http后端服务,分别为8081和8082

2.配置IP域名

127.0.0.1 8081 8081.test.com

127.0.0.1 8082 8082.test.com

3.配置nginx.conf

upstream tomcatserver1 (

    server 127.0.0.1:8081;

}


upstream tomcatserver2 (

    server 127.0.0.1:8082;

}

server (

    listen 88;

    server_name 8081.test.com;


    #charset koi8-r;

    #access_log logs/host.access.log main;



    location / {

        proxy_pass http://tomcatserver1;

        index index.html index.htm;

    }
}

server (

    listen 80;

    server_name 8082.test.com;


    #charset koi8-r;


    #access_log logs/host.access.log main;

    location / {
        proxy_pass http://tomcatserver2;

        index index.html index.htm;

    }
}

流程:

1)浏览器访问8080.test.com,通过本地host文件域名解析,找到192.168.72.49服务器(安装nginx)

2)nginx反向代理接受客户机请求,找到server_name为8080.test.com的server节点,根据proxy_pass对应的http路径,将请求转发到upstream tomcatserver1上,即端口号为8081的tomcat服务器。

4、常用命令
sbin/nginx 必须所属为 root ,启动才会以 root 身份启动

nginx -s reload :修改配置后重新加载生效,master进程不重启,worker进程都要重启

nginx -s reopen :重新打开日志文件

nginx -t 测试nginx配置文件是否正确

关闭nginx:

nginx -s stop :快速停止nginx,master进程和worker进程均停止

quit :完整有序的停止nginx

启动nginx: nginx -c /path/to/nginx.conf

平滑重启nginx:kill -HUP 主进程号

5、Nginx出现403 forbidden (13: Permission denied)

查看Nginx进程用户,是否是nobody。在conf/nginx.conf 中设置 user root/work 等对文件有可读或可写权限的用户。

6、Nginx支持域名泛解析

修改nginx.conf中server_name为泛域名

sever{
    listen 80;
    server_name *.test.com;
    access_log /home/work/nginx/access.log main;
    
    location /{
        proxy_pass http://127.0.0.1:8080;
    }
}

7、请求限速性转发limit_req_zone

limit_req_zone
 
限速,每秒10个,内存区域10m,大概16万个session
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server
{
 
listen 80;
server_name xxx.xxx.xxx;
location / {
 
#缓存区队列burst=100个,不延期,即每秒最多可处理rate+burst个.同时处理rate个。
limit_req zone=one burst=100 nodelay;
proxy_pass http://service;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_intercept_errors on;
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 120; #长时操作的设置
 
}
 
}

zone:one:10m 表示一个内存区域大小为10m,并且设定了名称为one.

rate=5r/s 表示请求的速率是1秒5个请求,当单位设置成60r/m时,并不能达到限速1分钟60次的效果,它等同于1r/s。

$binary_remote_addr 表示远程的ip地址,当此nginx前方还存在代理时,需进行处理

2.2 limit_req的参数

zone=one 表示这个参数对应的全局设置就是one的那个内存区域

burst=100 表示请求队列的长度。

nodelay 表示不延时,比如rate=5r/s,burst=10 那么来了15个请求,能一次搞定,否则,就是此秒只能搞定5个请求。一般都是不延期的设置。

8、Nginx使用Stream实现DB流量转发

下载1.9以上版本只有1.9以上版本才支持,安装过程略

注意编译的时候加上--with-stream

./configure --with-stream --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf

nginx stream conf
 
stream{
 
    upstream db {
        server 127.0.0.1:3306;
    }
# test-db
 
    server {
        listen 13006;
        proxy_timeout 525600m;
        proxy_pass db;
    }
}

9、Nginx模块加载

nginx按照模块类型的先后顺序加载:

核心模块 > 事件模块 > 线程池模块 > http模块 > 邮件模块 > stream模块 > 其他模块

核心模块
ngx_core_module

ngx_errlog_module

ngx_conf_module

ngx_openssl_module

ngx_regex_module

事件模块
ngx_events_module

ngx_event_core_module

ngx_epoll_module

ngx_selet_module

ngx_poll_module

其他事件模块

http模块
参考ngx_modules.c 中定义的ngx_modules 数组中http类模块顺序

邮件模块
需要在configure时制定 --with-mail,具体模块参考 ngx_modules 数组中mail类型模块顺序

stream模块
需要在configure时制定 --with-stream,具体模块参考 ngx_modules 数组中stream类型模块顺序

其他模块
具体模块参考 ngx_modules 数组中其他类型模块顺序

10、Nginx Master和Worker工作模式
master进程
1.接收外界的信号,例如:kill -QUIT,kill -HUP

kill -HUP 重新加载配置文件,然后重新启动新的worker进程,老的还在运行,同时,向老的worker进程发送退休命令,老的worker进程将原有的请求处理完之后,就退休,不会接收新的请求,自毁,新的worker进程处理新的请求。

2.向各个worker进程发送信号

3.监控worker进程

4.当worker进程因异常退出,会自动启动新的worker进程。kill -9 worker后,master会立即拉起worker

5.master进程被kill,worker进程仍在,客户端请求依旧可以继续处理

6.如果listen port被占用,master、worker进程整体会启动失败

woker进程
处理客户端的请求

接收客户端的连接,完成服务端和后端的数据交互,各个worker之间的进程是相互独立的并且平等的,对请求的处理机会是相等的。

工作原理
当启动nginx时,maste进程启动的时候,会创建好Listener的一个socket监听,然后会fork出多个worker进程(根据配置文件),当有请求来临时,worker进程会通过共享锁来保证在同一时刻只有一个worker进程来处理同一个连接,当worker进程接收到请求的时候,就开始做数据的响应和处理,哪一个进程抢到锁,哪一个进程就会处理请求。

nginx是一个壳,由内核和模块组成,主要是核心、基础、第三方模块。其中,核心模块:http模块,event模块、mail模块。

相关推荐

  1. <span style='color:red;'>Nginx</span>

    Nginx

    2024-05-10 12:08:02      35 阅读
  2. <span style='color:red;'>nginx</span>

    nginx

    2024-05-10 12:08:02      28 阅读
  3. Nginx

    2024-05-10 12:08:02       30 阅读
  4. <span style='color:red;'>Nginx</span>

    Nginx

    2024-05-10 12:08:02      33 阅读
  5. <span style='color:red;'>Nginx</span>

    Nginx

    2024-05-10 12:08:02      23 阅读
  6. <span style='color:red;'>Nginx</span>

    Nginx

    2024-05-10 12:08:02      26 阅读
  7. <span style='color:red;'>nginx</span>

    nginx

    2024-05-10 12:08:02      31 阅读
  8. Nginx

    2024-05-10 12:08:02       28 阅读
  9. <span style='color:red;'>Nginx</span>

    Nginx

    2024-05-10 12:08:02      24 阅读
  10. <span style='color:red;'>nginx</span>

    nginx

    2024-05-10 12:08:02      19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-10 12:08:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-10 12:08:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-10 12:08:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-10 12:08:02       18 阅读

热门阅读

  1. 连接到 SQLite 数据库

    2024-05-10 12:08:02       7 阅读
  2. AIGC文生图 flask base64传递多张图片api

    2024-05-10 12:08:02       8 阅读
  3. C++ 62. 不同路径

    2024-05-10 12:08:02       10 阅读
  4. 文件上传前端处理

    2024-05-10 12:08:02       10 阅读
  5. C++ QT设计模式:备忘录模式

    2024-05-10 12:08:02       9 阅读
  6. Visual Studio和Visual Studio Code适用于哪些编程语言

    2024-05-10 12:08:02       10 阅读