nginx(1):原理
学习自:Nginx教程(小白必看,看了必会,不看血亏),-CSDN博客
《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成功启动
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性