nginx(1):原理

学习自:Nginx教程(小白必看,看了必会,不看血亏),-CSDN博客

深入理解 http 反向代理(nginx) - 知乎

《nginx经典教程》

0、nginx指令

执行nginx命令,要先进入到nginx的sbin目录下。

或者将该目录加入到PATH中:export PATH=$PATH:/usr/local/nginx/sbin

nginx -s stop:快速关闭ng,并终止web服务,可能不会保存相关信息。

nginx -s quit:优雅关闭ng,有安排地结束web服务(先等待Worker进程处理完毕当前的连接请求)。

nginx -s reload:重载配置文件

nginx -s reopen:重启日志文件

nginx -c filename:为ng指定一个新conf文件,而非使用默认conf。

nginx -t:不运行ng,只是检测conf文件(语法正确性、某些文件能否打开)。

nginx -v:ng版本

nginx -V:ng版本、编译器版本、配置参数

1、nginx基本概念

1)简介

nginx是一个反向代理服务器,具有强并发、少内存占用的优点。

2)代理:C端和S端中间的一个服务器,可以代表任何一端去获取另一端的网络信息,避免该端直接访问另一端。

①正向代理

C端通过代理访问某个具体的S端,此时S端不知道真实的C端地址

常见应用:VPN

②反向代理

S端通过代理接收C端请求,再将请求转发到内网中的具体服务器上,再将该服务器上的得到的结果返回给C端。此时C端不知道哪台S是真正提供服务的S端,而是由代理服务器根据路由规则转发到相应的原始服务器。

反向代理中,用户访问的是代理IP(nginx服务器),而非最终的S端IP

常见应用:nginx。

不论正向代理还是反向代理,后端的服务器一般都看不到初始请求发起的IP,通常该项会通过一定策略保存在HTTP请求头中。 

③区别

用户设置

  • 正向代理需要我们主动设置服务器IP域名进行访问,返回的访问内容也是这些服务器上的;

反向代理对用户没有任何设置要求,也是访问服务器的IP或域名,但是服务器会自动根据访问内容进行跳转+内容返回最终访问的服务器是未知的。

代理对象

  • 正向代理——为C端做代理,帮助C端访问其无法访问的S端资源;
  • 反向代理——为S端做代理,帮助S端做负载均衡、安全防护。

可见性

  • 正向代理——为C端做代理,为C端收发请求,使S端看不到真实的C端;
  • 反向代理——为S端做代理,为S端收发请求,使C端看不到真实的S端;

网段

  • 正向代理——Proxy和C端位于同一个LAN,对S端透明;
  • 反向代理——Proxy与S端位于同一个LAN,对C端透明。

3)nginx功能

①反向代理

②负载均衡

nginx通过它的http块下的upstream块实现负载均衡。

 

单个Web服务器不能承载日益增长的并发请求量,因此我们需要不断扩张Web应用服务器来支持更高的并发请求,并将请求均匀分配到各个应用服务器上,此为负载均衡

nginx提供的负载均衡策略有2种:内置、扩展

内置:一些内置的负载均衡策略——轮询、加权轮询、IP hash。

扩展:根据需要自己写负载均衡算法并实现。

③动静分离

为了加快网站解析速度,将动态页面、静态页面交给不同服务器来解析,加快解析速度,降低单个服务器的压力。

Nginx的静态处理能力很强,但是动态处理能力不足,因此实际应用中常用动静分离技术。对于静态资源图片、JS、CSS等文件,可以放在nginx服务器中缓存。这样浏览器在请求一个静态资源时,nginx就可以直接处理,无需将请求转发给后端服务器tomcat。

对于动态资源,比如servlet,jsp则转发给Tomcat服务器处理,从而实现动静分离

例如,将静态文件放在一个单独的Web服务器上。

 

2、nginx源码结构

从nginx官网下载的nginx.tar.gz压缩包,解压后(此时还未编译安装)的nginx目录下有如下文件目录:

 布局是从上往下、从左往右、先大写后小写的形式。

部分常用文件及目录的功能(nginx经典教程 12页):

  • auto:安装过程中配置环境所用到的自动化脚本
  • CHANGES:版本历史及更新纪要
  • CHANGES.ru:俄文版版本历史
  • conf:配置目录
  • configure编译过程的总驱动
  • contrib:必要的功能脚本或可导入配置
  • html默认页面(index.html)和错误页面(50x.html)所在目录
  • logs:日志目录
  • sbin:nginx命令目录(启停nginx)
  • src:源码目录

一些常用目录及文件的具体说明

auto

存放一些自动化脚本,用于实现nginx自动化安装、环境配置

configure

编译nginx的自动化配置脚本,是编译过程的总驱动,该脚本运行完毕会生成部分C代码同时生成Makefile文件

conf

存放nginx的配置文件,这些文件在安装之后会被复制到目录/usr/local/nginx/conf目录下。

配置文件以conf结尾,有的文件以.default结尾,代表备份,方便恢复初始状态

该目录下的文件有5种类型:

fastcgi*:包含FastCGI相关参数的配置;

mime.types:媒体类型的文件;

nginx.conf:NGINX默认主配置文件;

scgi_params:包含SCGI相关参数的配置;

uwsgi_params:包含uWSGI相关参数的配置。

其中FastCGI、SCGI、uWSGI具有结合外部应用的能力

关于nginx.conf的详细说明,见nginx:配置文件(nginx.conf)各项说明 - ShineLe - 博客园

conf文件中以default为后缀的文件代表备份文件,方便恢复刚安装好nginx时这些文件的初始配置

html:默认的站点目录——首页、错误页面

logs:日志

sbin:nginx服务命令——重启、关闭、启动、状态

src:NGINX的源码目录

3、nginx安装

第2步只是实现了从官网安装nginx.tar.gz压缩包文件,要想使用nginx还要安装,安装过程见:

Linux:安装部署Tomcat和Nginx - ShineLe - 博客园

4、nginx进程结构

nginx进程空间由一个Master进程和多个Worker进程组成。

M负责读取、评估配置,并维护W进程。

W负责实际工作,处理具体的请求。

nginx采用的是事件驱动机制,会给每个Worker进程有效地分配请求。

W进程的数量可以在配置文件中自定义(worker_processes),也可以用默认值,即可用的CPU内核数

5、nginx指令的作用机制

第0节:指令中,给出了一些常用的nginx指令:

nginx -s quit,优雅关闭ng。之所以称为优雅,是因为此时quit不会导致M立即退出,而是会等待Worker进程处理完毕当前的连接请求之后再退出。

nginx -s reload,系统会给M进程发送reload信号。当M收到了reload之后,会检查新配置文件的语法有效性并尝试送新配置。顺利的话,M会启动新的W,并向旧W发送消息,请求它们关闭。失败的话,M会回滚更新并继续用旧配置。

W在收到关闭命令之后,会停止就收新连接并继续服务当前请求,直到所有当前请求都得到服务,此时旧W退出。

有时我们也会用kill命令给进程发信号,这个命令中会直接写明进程ID,信号会被发给这个ID对应的进程(M或W),而非统一发给M。

kill -s QUIT 28622

如果28622对应W进程,那么该W会直接退出。但由于M会自动检测并保证W状态,所以新的W会被拉起。

如果28622对应M进程,那么相当于执行nginx -s quit,nginx会优雅终止所有W,之后nginx自身也会终止。

 

第0节:指令中,nginx后跟的参数有-s -c -t,但其实可用的不止这些,具体可以通过nginx -h查看。

-s代表signal,表明会向M节点发一个指令。

-c代表configuration,代表指定配置文件。

-g代表global,允许我们以命令行的方式自定义conf文件中的global块,如worker_processes、user、error_log。

 

6、例子

Web服务器的一个重要任务是提供静态文件Web服务(HTML页面、图像)

本例通过修改conf文件实现,不同请求从不同的本地目录获取文件内容:从/data/www获取HTML静态页面从data/images目录获取图像。

1)创建/data/www,放入index.html文件,创建/data/images:

1
2
3
mkdir -p /data/www
mkdir /data/images
cp /usr/local/nginx/html/index.html /data/www

2)新建配置文件/root/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
user root;
worker_processes 1;
events {
        worker_connections 1024;
}
http {
        server {
                location / {
                    root /data/www;
                }
                location /images/{
                    root /data;
                }
        }
}

一个conf可以有多个server块,它们通过listen和server_name进行区分。

NGINX会根据请求的host、URL来决定由哪个server块下的哪个location块来处理。

上文用location /和location /images/来让nginx服务器分别匹配URI中以//images/开头的匹配项。

nginx匹配时会选择具有最长前缀的location块。因此location /只有当其他所有location都无法匹配到时会使用。

3)启动nginx

去nginx的sbin目录下,依次执行以下命令:

1
2
./nginx -c /root/nginx.conf #使用我们刚刚建立的这个nginx conf文件
./nginx -s reload

4)测试

打开本地浏览器,输入http://192.168.10.11:80,出现如下nginx提示页面,代表nginx成功启动

 

posted @   ShineLe  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示