nginx简介
Posted 寂寞的槟榔丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx简介相关的知识,希望对你有一定的参考价值。
1. nginx简介
文章目录
- 1. nginx简介
- 2. nginx的特性与优点
- 3. nginx的功能及应用类别
- 4. nginx的模块与工作原理
- 5. Nginx的应用环境
- 6. Nginx的安装
- 6.1 nginx安装后配置
- 7 nginx的配置文件详解
nginx
(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。
nginx
由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler使用。
nginx
的特点是占有内存少,并发能力强,事实上nginx
的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx
网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx
是一款自由的、开源的、高性能的HTTP服务器和 反向代理 服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。
Nginx
使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接
高度的模块化和自由软件许可证使得第三方模块层出不穷(开源)
Nginx
是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操作系统上
2. nginx的特性与优点
2.1 nginx的特性
nginx
是一个很牛的高性能Web和反向代理服务器,它具有很多非常优越的特性:
- 在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应
- 使用epoll and kqueue作为开发模型
- nginx作为负载均衡服务器:nginx既可在内部直接支持和php程序对外进行服务,也可支持作为HTTP代理服务器对外进行服务
- nginx采用C进行编写,不论系统资源开销还是CPU使用效率都比Perlbal要好很多
2.2 nginx的优点
- 高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
- 内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)
- 配置文件非常简单:风格跟程序一样通俗易懂
- 成本低廉:nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
- 支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组
- 内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问
- 节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头
- 稳定性高:用于反向代理,宕机的概率微乎其微
- 模块化设计:模块可以动态编译
- 外围支持好:文档全,二次开发和模块较多
- 支持热部署:可以不停机重载配置文件
- 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化
3. nginx的功能及应用类别
3.1 nginx的基本功能
- 静态资源的web服务器,能缓存打开的文件描述符
- http、smtp、pop3协议的反向代理服务器
- 缓存加速、负载均衡
- 支持FastCGI(fpm,LNMP),uWSGI(Python)等
- 模块化(非DSO机制),过滤器zip、SSI及图像的大小调整
- 支持SSL
3.2 nginx的扩展功能
- 基于名称和IP的虚拟主机
- 支持keepalive
- 支持平滑升级
- 定制访问日志、支持使用日志缓冲区提高日志存储性能
- 支持URL重写
- 支持路径别名
- 支持基于IP及用户的访问控制
- 支持速率限制,支持并发数限制
3.3 nginx的应用类别
- 使用nginx结合FastCGI运行PHP、JSP、Perl等程序
- 使用nginx作反向代理、负载均衡、规则过滤
- 使用nginx运行静态html网页、图片
- nginx与其他新技术的结合应用
4. nginx的模块与工作原理
nginx
由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
因此模块可以看做Nginx真正的劳动工作者。通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。
4.1 nginx的模块分类
nginx的模块从结构上分为核心模块、基础模块和第三方模块
- HTTP模块、EVENT模块和MAIL模块等属于核心模块
- HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块属于基本模块
- HTTP Upstream模块、Request Hash模块、Notice模块和HTTP Access Key模块属于第三方模块
用户根据自己的需要开发的模块都属于第三方模块。正是有了如此多模块的支撑,nginx的功能才会如此强大
ginx模块从功能上分为三类,分别是:
- Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handlers处理器模块一般只能有一个
- Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由nginx输出
- Proxies(代理器模块)。就是nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如fastcgi等操作交互,实现服务代理和负载均衡等功能
nginx模块分为:核心模块、事件模块、标准Http模块、可选Http模块、邮件模块、第三方模块和补丁等
- nginx基本模块:所谓基本模块,指的是nginx默认的功能模块,它们提供的指令,允许你使用定义nginx基本功能的变量,在编译时不能被禁用,包括:
- 核心模块:基本功能和指令,如进程管理和安全。常见的核心模块指令,大部分是放置在配置文件的顶部
- 事件模块:在Nginx内配置网络使用的能力。常见的events(事件)模块指令,大部分是放置在配置文件的顶部
- 配置模块:提供包含机制
具体的指令,可参考nginx
的官方文档
4.2 nginx的工作原理
nginx
的模块直接被编译进nginx
,因此属于静态编译方式。
启动nginx
后,nginx
的模块被自动加载,与Apache
不一样,首先将模块编译为一个so文件,然后在配置文件中指定是否进行加载。
在解析配置文件时,nginx
的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。
nginx的进程架构:
启动nginx
时,会启动一个Master
进程,这个进程不处理任何客户端的请求,主要用来产生worker
线程,一个worker
线程用来处理n个request
。
Nginx主要由一个master主进程和多个worker进程
-
master主进程主要是管理worker进程,对网络事件进行收集和分发:
-
接收来自外界的信号
-
向各worker进程发送信号
-
监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程
-
-
nginx用一个独立的worker进程来处理一个请求,一个worker进程可以处理多个请求:
-
当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。
-
一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。采用这种方式的好处
-
节省锁带来的开销。对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查上时,也会方便很多
-
独立进程,减少风险。
-
采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。
-
在一次请求里无需进程切换
-
每个worker进程都有一个独立的连接池,连接池的大小是worker_connections。这里的连接池里面保存的其实不是真实的连接,它只是一个worker_connections大小的一个ngx_connection_t结构的数组。并且,nginx会通过一个链表free_connections来保存所有的空闲ngx_connection_t,每次获取一个连接时,就从空闲连接链表中获取一个,用完后,再放回空闲连接链表里面。一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes,而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
下图展示了基本的WEB服务请求步骤
网页访问流程
利用DNS协议进行域名解析 --> 建立tcp协议三次握手过程 --> 客户端发出访问网站相应页面请求(发出http协议请求报文) --> 服务端发出相应访问页面的请求信息(发出http) --> 断开tcp协议四次挥手过程
5. Nginx的应用环境
-
Nginx 代理
说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道此时就涉及到两个角色,一个是被代理角色 (A_),一个是目标角色 (B_),A_ 通过这个代理访问 B_ 完成一些任务的过程称为代理 (C_) 操作过程;比如客人去买双鞋,这个店铺就是 (C_),(A_) 就是厂家,(B_) 就是用户。代理呢又分为正向代理和反向代理 -
反向代理
反向代理应该是Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
如下图:
- 负载均衡
负载均衡也是Nginx常用的一个功能,简单而言就是当有2台或2台以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略
如下图:
-
WEB服务器
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,首先看看Nginx做静态资源服务器 -
静态分离
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。
如下图:
6. Nginx的安装
环境说明
系统 | IP |
---|---|
centos8 | 192.168.25.144 |
//关闭防火墙
[root@nginx ~]# systemctl disable --now firewalld
[root@nginx ~]# sed -ri 's/^(SELINUX=).*/\\1disabled/g' /etc/selinux/config
[root@nginx ~]# setenforce 0
//安装依赖包
[root@nginx ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ make
[root@nginx ~]# yum -y groups mark install 'Development Tools'
//创建系统用户Nginx
[root@nginx ~]# useradd -r -M -s /sbin/nologin nginx
//创建日志存放目录
[root@nginx ~]# mkdir -p /var/log/nginx
[root@nginx ~]# chown -R nginx.nginx /var/log/nginx/
//下载Nginx源码包
[root@nginx ~]# cd /usr/local/src/
[root@nginx src]# wget http://nginx.org/download/nginx-1.20.1.tar.gz
//编译安装
[root@nginx src]# tar xf nginx-1.20.1.tar.gz
[root@nginx src]# cd nginx-1.20.1
[root@nginx nginx-1.20.1]# ./configure \\
--prefix=/usr/local/nginx \\
--user=nginx \\
--group=nginx \\
--with-debug \\
--with-http_ssl_module \\
--with-http_realip_module \\
--with-http_image_filter_module \\
--with-http_gunzip_module \\
--with-http_gzip_static_module \\
--with-http_stub_status_module \\
--http-log-path=/var/log/nginx/access.log \\
--error-log-path=/var/log/nginx/error.log
[root@nginx nginx-1.20.1]# make && make install
// 启动nginx
[root@nginx ~]# /usr/local/nginx/sbin/nginx
[root@Nginx ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
6.1 nginx安装后配置
//配置环境变量
[root@nginx ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@nginx ~]# source /etc/profile.d/nginx.sh
//服务控制方式,使用nginx命令
-t //检查配置文件语法
-v //输出nginx的版本
-c //指定配置文件的路径
-s //发送服务控制信号,可选值有{stop|quit|reopen|reload}
[root@nginx ~]# 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
[root@nginx ~]# nginx -v //查看nginx的版本
nginx version: nginx/1.20.1
[root@nginx ~]# nginx -V // 查看更加详细的信息
nginx version: nginx/1.20.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-3) (GCC)
built with OpenSSL 1.1.1k FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log
[root@nginx ~]# nginx -h //查看帮助
nginx version: nginx/1.20.1
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
[-e filename] [-c filename] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: /usr/local/nginx/)
-e filename : set error log file (default: /var/log/nginx/error.log)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
// 修改配置文件的方法
[root@nginx conf]# cp nginx.conf /opt/
[root@nginx conf]# cp mime.types /opt/
[root@nginx opt]# ls
mime.types nginx.conf
[root@nginx opt]# vim nginx.conf
#user nobody;
worker_processes 1;
[root@nginx ~]# nginx -s stop;nginx -c /opt/nginx.conf //指定配置文件的路径
root@Nginx ~]# ps -ef | grep nginx
root 1817 1 0 04:42 ? 00:00:00 nginx: master process nginx -c /opt/nginx.conf
nginx 1818 1817 0 04:42 ? 00:00:00 nginx: worker process
root 1821 1734 0 04:42 pts/0 00:00:00 grep --color=auto nginx
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 4; //修改nginx的worker进程数量,默认为1
[root@nginx ~]# nginx -s reload //发送服务控制信号,重新加载配置文件
[root@nginx ~]# ps -ef | grep nginx
root 1725 1 0 04:10 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 1769 1725 0 04:22 ? 00:00:00 nginx: worker process
nginx 1770 1725 0 04:22 ? 00:00:00 nginx: worker process
nginx 1771 1725 0 04:22 ? 00:00:00 nginx: worker process
nginx 1772 1725 0 04:22 ? 00:00:00 nginx: worker process
root 1779 1734 0 04:22 pts/0 00:00:00 grep --color=auto nginx
7 nginx的配置文件详解
主配置文件:安装路径/conf/nginx.conf
- 默认启动nginx时,使用的配置文件是:安装路径/conf/nginx.conf文件
- 可以在启动nginx时通过-c选项来指定要读取的配置文件
nginx常见的配置文件及其作用
配置文件 | 作用 |
---|---|
nginx.conf | nginx的基本配置文件 |
mime.types | MIME类型关联的扩展文件 |
fastcgi.conf | 与fastcgi相关的配置 |
proxy.conf | 与proxy相关的配置 |
sites.conf | 配置nginx提供的网站,包括虚拟主机 |
7.1 nginx.conf配置详解
nginx.conf的内容分为以下几段
- main配置段:全局配置段。其中main配置段中可能包含event配置段
- event {}:定义event模型工作特性
- http {}:定义http协议相关的配置
配置指令:要以分号结尾,语法格式如下
derective value1 [value2 ...];
支持使用变量
- 内置变量:模块会提供内建变量定义
- 自定义变量:set var_name value
7.2 用于调试、定位问题的配置参数
daemon {on|off}; //是否以守护进程方式运行nginx,调试时应设置为off
//用法
Syntax: daemon on | off; #语法
Default: daemon on; #默认值
Context: main #可以配置在那个字段中
[root@Nginx ~]# vim /opt/nginx.conf
#user nobody;
worker_processes 1;
daemon off;
//重启nginx
[root@Nginx ~]# nginx -s stop;nginx -c /opt/nginx.conf
[root@Nginx ~]# nginx -s stop
[root@Nginx ~]# nginx
//此时nginx将不会以守护进程的方式运行,会一直占据着前台屏幕
m aster_process {on|off}; //是否以master/worker模型来运行nginx,调试时可以设置为off
master_process {on|off}; //是否以master/worker模型来运行nginx,调试时可以设置为off
//用法
Syntax: master_process on | off;
Default: master_process on;
Context: main
//nginx默认是以master/worker模型来运行
[root@nginx ~]# ps -ef | grep nginx
root 1777 1 0 08:01 ? 00:00:00 nginx: master process nginx
nginx 1778 1777 0 08:01 ? 00:00:00 nginx: worker process
root 1800 1779 0 08:02 pts/0 00:00:00 grep --color=auto nginx
[root@nginx ~]# vim /opt/nginx.conf
#user nobody;
worker_processes 1;
master_process off;
//重读nginx配置文件
[root@nginx ~]# nginx -s stop;nginx -c /opt/nginx.conf
[root@nginx ~]# ps -ef | grep nginx
root 1804 1 0 08:04 ? 00:00:00 nginx -c /opt/nginx.conf
root 1806 1779 0 08:04 pts/0 00:00:00 grep --color=auto nginx
error_log 位置 级别; //配置错误日志
//用法,在不同的字段有不同的含义,比如在main字段写就会对整个nginx产生影响,在http字段写就会对某个网站产生影响
Syntax: error_log file [level];
Default: error_log logs/error.log error;
Context: main, http, mail, stream, server, location
[root@nginx ~]# vim /opt/nginx.conf
#user nobody;
worker_processes 1;
error_log logs/error.log; //没有写记录日志的级别,表示默认记录error级别的日志
//重读nginx配置文件
[root@nginx ~]# vim /opt/nginx.conf
[root@nginx ~]# nginx -s stop;nginx -c /opt/nginx.conf
[root@nginx ~]# ls /usr/local/nginx/logs/
error.log nginx.pid
//访问一个不存在的资源
[root@nginx ~]# curl http://192.168.25.147/tt.txt
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@nginx ~]# tail -f /usr/local/nginx/logs/error.log
2021/10/25 09:24:45 [error] 1817#0: *1 open() "/usr/local/nginx/html/tt.txt" failed (2: No such file or directory), client: 192.168.200.144, server: localhost, request: "GET /tt.txt HTTP/1.1", host: "192.168.200.144"
error_log里的位置和级别能有以下可选项
位置 | 含义 |
---|---|
file | 记录到某个文件中 |
stdree | 记录到标准错误中(不推荐) |
syslog:server=address[,parameter=value] | 记录到某台日志服务器中 |
memory:size | 记录到内存中(不推荐) |
日志级别 | 含义 |
---|---|
debug | 若要使用debug级别,需要在编译nginx时使用–with-debug选项 |
info | 一般信息 |
notice | 不影响正常功能,需要注意的消息 |
warn | 可能影响系统功能,需要提醒用户的重要事件 |
error | 错误信息(常用的) |
crit | 紧急,比较严重的 |
alert | 必须马上处理的 |
emerg | 会导致系统不可用的 |
7.3 正常运行必备的配置参数
user USERNAME [GROUPNAME]; //指定运行worker进程的用户和组
//用法
Syntax: user [group]; #语法
Default: user nobody nobody; #默认值
Context: main #可以配置在那个字段中
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
user nginx; #建议手动指定用户
worker_processes 1;
pid /path/to/pid_file; //指定nginx守护进程的pid(守护进程),使用时需要把前面的注释取消掉
//用法
Syntax: pid file;
Default: pid logs/nginx.pid;
Context: main
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
worker_rlimit_nofile number; //设置所有worker进程最大可以打开的文件数,默认为1024,最大值为655350
//用法
Syntax: worker_rlimit_nofile number;
Default: 1024
Context: main
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 1;
worker_rlimit_nofile 1024;
worker_rlimit_core size; //指明所有worker进程所能够使用的总体的最大核心文件大小,保持默认即可
//用法
Syntax: worker_rlimit_core size;
Default: —
Context: main
7.4 优化性能的配置参数
worker_processes n; //启动n个worker进程,这里的n为了避免上下文切换,通常设置为cpu总核心数-1或等于总核心数
worker_cpu_affinity cpumask ...; //将进程绑定到某cpu中,避免频繁刷新缓存
//cpumask:使用8位二进制表示cpu核心,如:
0000 0001 //第一颗cpu核心
0000 0010 //第二颗cpu核心
0000 0100 //第三颗cpu核心
0000 1000 //第四颗cpu核心
0001 0000 //第五颗cpu核心
0010 0000 //第六颗cpu核心
0100 0000 //第七颗cpu核心
1000 0000 //第八颗cpu核心
示例:
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
user nginx;
worker_processes 3; //设置cpu核心数
worker_rlimit_nofile 1024;
worker_cpu_affinity cpumask 0001 0010 0100; //收到将进程绑定到某cpu核心
timer_resolution interval; //计时器解析度。降低此值,可减少gettimeofday()系统调用的次数
worker_priority number; //指明worker进程的nice值
示例:
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
user nginx;
worker_processes 2;
worker_rlimit_nofile 1024;
worker_cpu_affinity 0001 0010;
worker_priority -20;
[root@nginx ~]# nginx -s stop;nginx
[root@nginx ~]# ps -elf|grep nginx //原先的80现在设置成了60
1 S root 109329 1 0 80 0 - 20408 - 16:36 ? 00:00:00 nginx: master process nginx
5 S nginx 109330 109329 0 60 -20 - 28556 do_epo 16:36 ? 00:00:00 nginx: worker process
5 S nginx 109331 109329 0 60 -20 - 28556 do_epo 16:36 ? 00:00:00 nginx: worker process
0 S root 109836 1605 0 80 0 - 3087 - 16:36 pts/0 00:00:00 grep --color=auto nginx
7.5 事件相关的配置:event{}段中的配置参数
accept_mutex {off|on}; //master调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化地去响应新请求
lock_file file; //accept_mutex用到的互斥锁锁文件路径
use [epoll | rtsig | select | poll]; //指明使用的事件模型,建议让nginx自行选择
worker_connections number; //每个进程能够接受的最大连接数
示例:
user nginx;
worker_processes 2;
worker_rlimit_nofile 1024;
worker_cpu_affinity 0001 0010;
worker_priority -20;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 10240; //再此设置每个进程最大连接数
}
7.6 网络连接相关的配置参数
keepalive_timeout number; //长连接的超时时长,默认为65s
keepalive_requests number; //在一个长连接上所能够允许请求的最大资源数
keepalive_disable [msie6|safari|none]; //为指定类型的UserAgent禁用长连接
tcp_nodelay on|off; //是否对长连接使用TCP_NODELAY选项,为了提升用户体验,通常设为on
client_header_timeout number; //读取http请求报文首部的超时时长
client_body_timeout number; //读取http请求报文body部分的超时时长
send_timeout number; //发送响应报文的超时时长
7.7 fastcgi的相关配置参数
LNMP:php要启用fpm模型
配置示例如下:
location ~ \\.php$ {
root html;
fastcgi_pass 127.0.0.1:9000; //定义反向代理
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
7.8 常需要进行调整的参数
- worker_processes
- worker_connections
- worker_cpu_affinity
- worker_priority
7.9 nginx作为web服务器时使用的配置:http{}段的配置参数
http{…}:配置http相关,由ngx_http_core_module模块引入。nginx的HTTP配置主要包括四个区块,结构如下:
7.9.1http 协议
http {//协议级别
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
gzip on;
upstream {//负载均衡配置
...
}
server {//服务器级别,每个server类似于httpd中的一个<VirtualHost>(也就是相当于一个网站)
listen 80;
server_name localhost;
location / {//请求级别,类似于httpd中的<Location>,用于定义URL与本地文件系统的映射关系
root html;
index index.html index.htm;
}
}
}
我们自己编写一个网站
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
#gzip on;
server { //我们自己编写的网站
listen 88;
server_name www.caiccc.com;
location / {
root html/test;
index index.html;
}
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
[root@nginx ~]# cd /usr/local/nginx/html/
[root@nginx html]# ls
50x.html index.html
[root@nginx html]# mkdir test
[root@nginx html]# echo 'xiedezhenshuai!!!' > test/index.html
[root@nginx ~]# nginx -s stop;nginx
[root@nginx ~]# ss -antl
\\State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:88 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
[root@nginx ~]#
原网页
我们增加端口后访问网页
7.9.2 http{}段配置指令:
//listen:指定监听的地址和端口
listen address[:port];
listen port;
//server_name NAME`[...]; 后面可跟多个主机,名称可使用正则表达式或通配符
当有多个server时,匹配顺序如下:
1. 先做精确匹配检查
2. 左侧通配符匹配检查,如*.example.com
3. 右侧通配符匹配检查,如web.*
4. 正则表达式匹配检查,如~ ^.*\\.example\\.com$
5. default_server
- root path; 设置资源路径映射,用于指明请求的URL所对应的资源所在的文件系统上的起始路径
location / {
root html;
index index.html index.htm;
}
- alias path; 用于location配置段,定义路径别名
[root@nginx ~]# mkdir -p /var/www/html
[root@nginx ~]# chown -R nginx.nginx /var/www/html/
[root@nginx ~]# echo "hahahhh" > /var/www/html/index.html
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
alias /var/www/html/; //这里路径写绝对路径
index index.html index.htm;
}
}
root path;和alias path;设置的区别
root path方式设置location表示最终访问的资源地址是root path指定的位置+location后面的URI
alias方式设置表示最终访问的资源地址是alias后面跟的路径
- index file; 默认主页面
location / {
root html;
index index.html index.htm; //网页默认访问主页面
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index test index.html index.htm; //自定义网页默认访问页面
}
}
7.9.3错误页面
error_page code [...] [=code] URI | @name
根据http响应状态码来指明特用的错误页面,例如 error_page 404 /404_customed.html
[=code]
:以指定的响应码进行响应,而不是默认的原来的响应,默认表示以新资源的响应码为其响应码,例如 error_page 404 =200 /404_customed.html
[root@lamp ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.php index.html index.htm;
}
error_page 404 /404.html; //状态码如果是404就用404.html页面来响应
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
[root@lamp ~]# cd /usr/local/nginx/html/
[root@lamp html]# ls
50x.html index.html index.php
[root@lamp html]# vi 404.html
<html>
<head>
<title>test page</title>
</head>
<body>
<a href="http://www.baidu.com">baidu</a>
</body>
</html>
[root@lamp html]# nginx -s stop;nginx
访问一个不存在的页面
- log_format 定义日志格式
- access_log logs 访问日志
- logs/access.log 访问日志文件
- main 格式名称
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 logs/access.log main;
//注意:此处可用变量为nginx各模块内建变量
[root@lamp ~]# vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
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 logs/access.log main;
[root@nginx ~]# nginx -s reload //去重新访问一下nginx网站
[root@nginx ~]# tail -f /usr/local/nginx/logs/access.log
Last login: Wed Oct 27 14:23:46 2021 from 192.168.200.1
[root@nginx ~]# tail -f /usr/local/nginx/logs/access.log
192.168.200.1(代表本机) -(代表本身) -(代表用户) [27/Oct/2021:15:02:22 +0800](访问时间) "GET / HTTP/1.1"(用get方法获取根下面的资源,用的http1.1版本号) 304(状态码) 0 "-" (代表访问网站时没用跳转)"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"(所使用的浏览器) "-"(是否是跳转过来访问的,不是用 - 代表,是就表示跳转的路径)
7.9.4平滑升级
- 获取现有的程序编译的参数 -V
[root@nginx html]# nginx -V
nginx version: nginx/1.20.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-3) (GCC)
built with OpenSSL 1.1.1k FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log
[root@nginx html]#
- 获取新版本的软件包或功能包
[root@nginx ~]# ls
echo-nginx-module-master.zip
anaconda-ks.cfg nginx-1.20.1
echo-nginx-module-master nginx-1.20.1.tar.gz
- 将新功能或新版版进行编译
[root@nginx ~]# ./configure \\
--prefix=/usr/local/nginx \\
--user=nginx \\
--group=nginx \\
--with-debug \\
--with-http_ssl_module \\
--with-http_realip_module \\
--with-http_image_filter_module \\
--with-http_gunzip_module \\
--with-http_gzip_static_module \\
--with-http_stub_status_module \\
--http-log-path=/var/log/nginx/access.log \\
--error-log-path=/var/log/nginx/error.log --add-module=../echo-nginx-module-master //添加新的模块
[root@nginx ~]# make
- 备份原程序
[root@nginx nginx-1.20.1]# ls objs/
addon nginx ngx_auto_headers.h src
autoconf.err nginx.8 ngx_modules.c
Makefile ngx_auto_config.h ngx_modules.o
[root@nginx nginx-1.20.1]# ll objs/nginx /usr/local/nginx/sbin/nginx
-rwxr-xr-x. 1 root root 6831056 10月 27 15:38 objs/nginx
-rwxr-xr-x. 1 root root 6308640 10月 25 11:35 /usr/local/nginx/sbin/nginx
[root@nginx nginx-1.20.1]# cp /usr/local/nginx/sbin/nginx /opt/
[root@nginx nginx-1.20.1]# ls /opt/
nginx
[root@nginx nginx-1.20.1]# nginx -s stop;objs/nginx -c /usr/local/nginx/conf/nginx.conf
[root@nginx nginx-1.20.1]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
[root@nginx nginx-1.20.1]# ps -ef|grep nginx
root 220850 1 0 15:40 ? 00:00:00 nginx: master process objs/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 220851 220850 0 15:40 ? 00:00:00 nginx: worker proces以上是关于nginx简介的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段
nginx.conf 忽略了 nginx-ingress 配置映射片段
SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介创建消息生产者创建消息消费者自定义消息通道分组与持久化设置 RoutingKey)(代码片段
C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段