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

简介: Nginx反向代理与系统参数配置conf原理

需要学习nginx哪些内容?

  1. nginx使用,conf的配置
  2. nignx基础以及源码
  3. ngixn模块开发

nginx的优势

  1. 源码是c
  2. 文档齐全
  3. 开源社区活跃
  4. 性能高

一、nignx安装

1、安装步骤

安装pcre(用来正则表达式的)

下载地址 http://www.pcre.org/

安装zlib(用来压缩)

下载地址 http://www.zlib.net/

安装nginx(反向代理)

下载地址 http://www.nginx.net/

分别进入目录,执行以下命令就行

./configure
make 
sudo make install

2、查看

在/usr/local/nginx文件夹中,有4个文件

conf 存放配置文件

html 存放网页

logs 存放日志

sbin 运行时可执行程序

3、测试

./sbin/nginx -c conf/nginx.conf

在浏览器中,输入当前主机的ip地址即可

比如我的是192.168.192.128,输入到浏览器即可

在页面中可以看到下图内容(nginx中默认的)

如果出现错误,查看端口是否被占用,如果占用就kill -9 [pid]

netstat -ntlp|grep 80

补充:

查看运行的nginx进程

ps aux|grep nginx

停止nginx

./sbin/nginx -s stop

二、配置conf文件

conf文件中有两类数据,一种是单行的,另外一种是block块

配置

1、worker_processes和worker_connections

worker_processes 4 表示会在主进程中启动4个子进程,也就是说总共会有5个进程,1个master进程,4个worker进程

worker_connections 1024;表示连接池的最大数量为1024,每一个work进程都有一个连接池,每个连接池最大数量是1024,如果有4个work进程,那么总共最大连接数是4096

worker_processes 4;
events {
  worker_connections 1024;
}

测试

启动该配置

在浏览器访问服务器ip,会看到connect refuse

然后查看进程可以看到,1个主进程和4个子进程

查看网络状态,现在没有启动server,所以也就看不到东西

2、http server

在原来基础上,再增加http server相关配置,

表示意思:启动一个http server,监听在端口8888上,

worker_processes 4;
events {
  worker_connections 1024;
}
http {
  server {
    listen 8888;
  }
}

测试

这时候再启动,进入浏览器,输入 192.168.192.128:8888是可以进入相关界面的,是nginx默认的页面

查看网络状态

第一行中代表 主进程,36384就是主进程的pid

但是第二行、第三行分别对应2个子进程,其中一个子进程是进行http请求,第二个子进程是(keepalive

)发送心跳包的

3、http中多个server

有4个server都去处理http协议

worker_processes 4;
events {
  worker_connections 1024;
}
http {
  server {
    listen 8888;
  }
  server {
    listen 8889;
  }
  server {
    listen 8890;
  }
  server {
    listen 8891;
  }
}

测试

可以发现4个端口都在一个进程(主进程)上面。listen在master进程上面,后面的处理在work进程上面

这时候访问192.169.192.128:8888,还是192.169.192.128:8889,都是nginx默认的界面,因为缺省了html

4、proxy_pass(反向代理)

根据http请求头,找到对应的location

也是11个状态里面的一个 ,NGX_HTTP_POST_REWRITE_PHASE

/前面是ip、端口或者 域名,/后面对应的是资源

下图中,server 8891访问的 html文件是/home/king/share/html

在server 8888中proxy_pass http://192.168.232.137:8891;重定向到8891。因此访问8888和8891是一样的内容

worker_processes 4;
events {
  worker_connections 1024;
}
http {
  server {
    listen 8888;
    location / {
      proxy_pass http://192.168.232.137:8891;
    }
  }
  server {
    listen 8889;
  }
  server {
    listen 8890;
  }
  server {
    listen 8891;
    location / {
      root /home/king/share/html;
      proxy_pass http://backend;
    }
  }
}

5、加入负载均衡

假设已经有两个已启动的nginx

通过设置upstream(把这个流转发出去的意思),,通过当前的主机去访问这两个服务器

proxy_pass http://backend;

去访问当前服务器的时候,就重定向到了指定的网页(upstream中的设置的两个)

weigth为权重,通过这种方式来实现负载均衡,weight可以自己调节

upstream backend {
    server 192.168.232.128 weight=2;
    server 192.168.232.132:8888 weight=1;
  }
server {
    listen 8891;
    location / {
      root /home/king/share/html;
      proxy_pass http://backend;
    }
  }

完整配置

#进程数量
worker_processes 4;
events {
  worker_connections 1024;
}
http {
  server {
    listen 8888;
    location / {
      proxy_pass http://192.168.232.137:8891;
    }
  }
  server {
    listen 8889;
  }
  server {
    listen 8890;
  }
  upstream backend {
    server 192.168.232.128 weight=2;
    server 192.168.232.132:8888 weight=1;
  }
  server {
    listen 8891;
    location / {
      root /home/king/share/html;
      proxy_pass http://backend;
    }
  }
}

测试

访问192.168.192.128:8891,可以发现,每3次就有2次进入192.168.232.128的页面,每3次就有1次进入192.168.232.132:8888

三、源码阅读

1、worker_processes设置

在nginx.conf中有

ngx_core_commands中的命令如果找到nignx.conf配置中有话,那么就会执行相应的部分,比如下面"worker_processes"如果在conf文件中找到,那么就会执行ngx_set_worker_processes

static ngx_command_t  ngx_core_commands[] = {
  ...
    { ngx_string("worker_processes"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_set_worker_processes,
      0,
      0,
      NULL },
  ...
};

ngx_set_worker_processes

将解析的参数通过变量ccf->worker_processes赋值就行了

通过后续设置值,内容就存储到核心配置文件的变量里ngx_core_conf_t *ccf

static char *
ngx_set_worker_processes(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    ngx_str_t        *value;
    ngx_core_conf_t  *ccf;
    ccf = (ngx_core_conf_t *) conf;
    if (ccf->worker_processes != NGX_CONF_UNSET) {
        return "is duplicate";
    }
    value = cf->args->elts;
    if (ngx_strcmp(value[1].data, "auto") == 0) {
        ccf->worker_processes = ngx_ncpu;
        return NGX_CONF_OK;
    }
  //value[0].data就是 命令本身,value[1].data是命令参数  value[1]这里指的是线程数,是字符串形式,要转成int
    ccf->worker_processes = ngx_atoi(value[1].data, value[1].len);
    if (ccf->worker_processes == NGX_ERROR) {
        return "invalid value";
    }
    return NGX_CONF_OK;
}

2、http

同样也有http的命令,这是一个块NGX_CONF_BLOCK,也就是上图用花括号括起来,称为BLOCK。

通过读取conf中的http配置来启动http server,执行ngx_http_block

static ngx_command_t  ngx_http_commands[] = {
    { ngx_string("http"),
      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
      ngx_http_block,
      0,
      0,
      NULL },
      ngx_null_command
};

ngx_http_block

ngx_http_block这个启动过程中,包含着tcp server和http协议的处理

ngx_http_init_phase_handlers是http状态机启动,phase就是状态的意思,里面有很多枚举状态,如NGX_HTTP_SERVER_REWRITE_PHASE

ngx_http_block中,有ngx_http_optimize_servers就是启动tcp server,其中cmcf->ports是包含端口号的数组。

static char *
ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
  ...
  //http状态机启动
  if (ngx_http_init_phase_handlers(cf, cmcf) != NGX_OK) {
          return NGX_CONF_ERROR;
      }
  //启动tcp server
  if (ngx_http_optimize_servers(cf, cmcf, cmcf->ports) != NGX_OK) {
          return NGX_CONF_ERROR;
      }
  ...
}

如何添加黑白名单?

方法1:tcp连接后:可以在建立连接(三次握手)之后,看它的ip地址,根据黑白名单,来看要不要执行后面的步骤

方法2:处理http头阶段:不对ip作限制,比如对pos或get请求作处理,在处理http头的阶段

方法3:对具体body 表单部分,进行处理,确定该部分是否要发送

相关文章
|
1月前
|
编解码 应用服务中间件 Linux
centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
165 1
|
28天前
|
Ubuntu 安全 应用服务中间件
详细指南:配置Nginx服务器在Ubuntu平台上
以上步骤涵盖了基本流程:从软件包管理器获取 Ngnix, 设置系统服务, 调整UFW规则, 创建并激活服务器块(也称作虚拟主机), 并进行了初步优化与加固措施。这些操作都是建立在命令行界面上,并假设用户具有必要权限(通常是root用户)来执行这些命令。每个操作都有其特定原因:例如,设置开机启动确保了即使重启后也能自动运行 Ngnix;而编辑server block则定义了如何处理进入特定域名请求等等。
189 18
|
1月前
|
Ubuntu 安全 应用服务中间件
详细指南:配置Nginx服务器在Ubuntu平台上
以上步骤涵盖了基本流程:从软件包管理器获取 Ngnix, 设置系统服务, 调整UFW规则, 创建并激活服务器块(也称作虚拟主机), 并进行了初步优化与加固措施。这些操作都是建立在命令行界面上,并假设用户具有必要权限(通常是root用户)来执行这些命令。每个操作都有其特定原因:例如,设置开机启动确保了即使重启后也能自动运行 Ngnix;而编辑server block则定义了如何处理进入特定域名请求等等。
197 17
|
2月前
|
数据建模 应用服务中间件 PHP
配置nginx容器和php容器协同工作成功,使用ip加端口的方式进行通信
本示例演示如何通过Docker挂载同一宿主目录至Nginx与PHP容器,实现PHP项目运行环境配置。需注意PHP容器中监听地址修改为0.0.0.0:9000,并调整Nginx配置中fastcgi_pass指向正确的IP与端口。同时确保Nginx容器中/var/www/html权限正确,以避免访问问题。
配置nginx容器和php容器协同工作成功,使用ip加端口的方式进行通信
|
5月前
|
应用服务中间件 Linux 网络安全
Centos 8.0中Nginx配置文件和https正书添加配置
这是一份Nginx配置文件,包含HTTP与HTTPS服务设置。主要功能如下:1) 将HTTP(80端口)请求重定向至HTTPS(443端口),增强安全性;2) 配置SSL证书,支持TLSv1.1至TLSv1.3协议;3) 使用uWSGI与后端应用通信(如Django);4) 静态文件托管路径设为`/root/code/static/`;5) 定制错误页面(404、50x)。适用于Web应用部署场景。
655 87
|
5月前
|
负载均衡 应用服务中间件 nginx
Nginx配置与命令
Nginx 是一款高性能的 HTTP 和反向代理服务器,其配置文件灵活且功能强大。本文介绍了 Nginx 配置的基础结构和常用指令,包括全局块、Events 块、HTTP 块及 Server 块的配置方法,以及静态资源服务、反向代理、负载均衡、HTTPS 和 URL 重写等功能实现。此外,还提供了常用的 Nginx 命令操作,如启动、停止、重载配置和日志管理等,帮助用户高效管理和优化服务器性能。
|
3月前
|
应用服务中间件 网络安全 nginx
配置Nginx以支持Websocket连接的方法。
通过上述配置,Nginx将能够理解WebSocket协议的特殊要求,代理Websocket流量到合适的后端服务器。注意,Websocket并不是HTTP,尽管它最初是通过HTTP请求启动的连接升级,因此保证Nginx了解并能够妥善处理这种升级流程是关键。
668 10
|
2月前
|
Ubuntu 应用服务中间件 Linux
在Ubuntu上配置Nginx实现开机自启功能
至此,Nginx应该已经被正确地设置为开机自启。在Ubuntu中利用 `systemd`对服务进行管理是一种高效的方式,为系统管理员提供了强大的服务管理能力,包括但不限于启动、停止、重启服务,以及配置服务的开机自启动。通过这些简洁的命令,即使是对Linux不太熟悉的用户也能轻松地进行配置。
126 0
|
4月前
|
安全 应用服务中间件 网络安全
Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
272 0
Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
|
4月前
|
JSON 前端开发 应用服务中间件
配置Nginx根据IP地址进行流量限制以及返回JSON格式数据的方案
最后,记得在任何生产环境部署之前,进行透彻测试以确保一切运转如预期。遵循这些战术,守卫你的网络城堡不再是难题。
208 3