目录
c.HTTP/1.1(1997-1999年):标准化与性能优化
一.故事剧情
今天开始新的模块,讲解Nginx服务,这个是非常常用的服务,它以其稳定性、丰富的特性集和低资源消耗而闻名,很关键
二.HTTP简单介绍
1.URI与URL
-
URI(Uniform Resource Identifier)
- 定义:用于唯一标识互联网资源的字符串,可以是资源的名称、位置或两者结合。
- 范围:涵盖所有资源标识形式,包括URL(定位资源)和URN(通过名称标识资源,如
urn:isbn:0451450523
)。 - 功能:仅标识资源,不涉及访问方式(例如员工工号仅标识身份,不说明部门位置)。
-
URL(Uniform Resource Locator)
- 定义:URI的子集,专门通过位置和访问协议定位资源。
- 功能:既标识资源,又提供获取方法(如协议、路径等)。
- 示例:
https://www.example.com/index.html
指定了HTTP协议、服务器地址和文件路径。
URI格式:
URI的通用格式为:scheme:[//authority]path[?query][#fragment]
,具体分解如下:
- Scheme(协议):访问资源的协议(如
http
、ftp
、mailto
) - Authority(权限):包括主机名(域名/IP)、端口号(默认可省略,如HTTP默认为80)
- Path(路径):资源在服务器上的位置(如
/path/to/resource
) - Query(查询):附加参数,以
?
开头,键值对形式(如?id=123&lang=en
) - Fragment(片段):指向资源内部锚点,以
#
开头(如#section1
)
区别:
特性 | URI | URL |
定义范围 | 广义资源标识符(含URL和URN) | URI的子集,仅定位资源 |
功能 | 仅标识资源(如URN) | 标识+定位+提供访问方式 |
是否可访问 | 不一定(如mailto:仅标识邮箱) | 总是可访问 |
示例 | urn:isbn:9780132350884(URN) | http://example.com/about |
关键结论:
- 所有URL都是URI,但URI不一定是URL(如URN是URI但不是URL)。
- URL是“资源地址”,URI是“资源身份证”(可能包含地址或其他标识)
2.http的成长
a.HTTP/0.9(1991年):雏形初现
- 设计目标:仅支持超文本(HTML)传输,功能极简。
- 核心特性:
- 单行协议:仅支持
GET
方法,如GET /page.html
- 无状态码/头部:响应直接返回HTML内容,无元数据
- 短连接:每次请求后立即断开TCP连接
- 单行协议:仅支持
- 局限性:无法传输图片等非文本资源,无错误处理机制
b.HTTP/1.0(1996年):基础框架成型
- 核心改进:
- 引入报文头(Header):添加状态码(如
200 OK
)、内容类型(Content-Type
)等元数据,支持多种文件传输(如脚本、图片) - 扩展方法:新增
HEAD
、POST
方法
- 引入报文头(Header):添加状态码(如
- 未解决问题:
- 连接效率低:默认每个请求需新建TCP连接(可通过
Connection: Keep-Alive
启用短时复用,但非标准) - 队头阻塞(Head-of-Line Blocking):响应顺序必须严格匹配请求顺序
- 连接效率低:默认每个请求需新建TCP连接(可通过
c.HTTP/1.1(1997-1999年):标准化与性能优化
- 里程碑特性:
- 持久连接(Persistent Connection):默认复用TCP连接,减少握手开销
- 管道化(Pipelining):允许连续发送多个请求(但响应仍需按序返回,未根治队头阻塞)
- 分块传输(Chunked Encoding):支持动态生成内容的分段传输
- 虚拟主机(Host头):单IP支持多域名托管
- 影响:成为此后15年的主流标准,奠定REST架构基础
d.HTTP/2(2015年):性能飞跃
- 突破性创新:
- 二进制分帧:替代文本协议,提升解析效率
- 多路复用(Multiplexing):单连接并行处理请求/响应,彻底解决队头阻塞
- 头部压缩(HPACK):减少冗余头部数据传输
- 服务器推送(Server Push):主动向客户端发送预测资源
- 局限:仍依赖TCP,丢包时所有流被阻塞
e.HTTP/3(2022年标准化):QUIC革命
- 底层变革:
- 弃用TCP,改用QUIC协议:基于UDP实现可靠传输,减少延迟
- 解决TCP队头阻塞:丢包仅影响单个流(Stream),而非整个连接
- 0-RTT握手:对已连接的服务端可跳过握手,加速首次请求
- 内置加密(TLS 1.3):默认强制加密,提升安全性
3.网站的组成
一个完整的网站是由多个相互协作的技术模块和功能要素组成的复杂系统,其结构可分为以下核心组成部分:
1. 基础设施层
- 域名(Domain Name)
网站的访问入口,如example.com
。需满足易记性、相关性(与品牌或业务关联)和唯一性 - 主机(Web Hosting)
存储网站文件的服务器空间,根据需求选择类型:- 共享主机:多网站共享资源,适合小型站点
- VPS:虚拟独立服务器,平衡性能与成本
- 独立服务器:独占硬件资源,适合高流量网站
- 服务器配置
包括操作系统(Linux/Windows)、网络设置(域名解析、HTTPS证书)、负载均衡等,确保稳定与安全
2. 前端(用户界面层)
负责用户直接交互的视觉与交互设计,核心技术包括:
- HTML:定义网页结构(如文本、图片布局)
- CSS:控制样式(颜色、字体、响应式布局),适配不同设备
- JavaScript:实现动态交互(如表单验证、动画)
- 框架与工具:
- Vue.js、React:构建复杂交互界面。
- Bootstrap:快速实现响应式设计
- 设计原则:
注重用户体验(UX)一致性、易用性,以及视觉设计(UI)的配色、排版与图像质量
3. 后端(业务逻辑层)
处理用户请求、数据运算与存储,用户不可见但为核心引擎:
- 编程语言:
- Python(Django/Flask):简洁高效,适合快速开发
- Java(Spring):企业级应用,稳定性强
- PHP(Laravel):传统Web开发主流
· 数据库:
类型 | 代表 | 适用场景 |
---|---|---|
关系型数据库 | MySQL、PostgreSQL | 需复杂查询(如电商订单) |
非关系型数据库 | MongoDB、Redis | 高频读写(如实时日志) |
- API开发:
通过RESTful接口连接前后端,支持数据交换与第三方集成 - 安全性:
防SQL注入、XSS攻击,采用HTTPS加密及JWT/OAuth认证
4.http状态码类别
详细类别
状态码 | 分类 | 英文名称 | 中文描述 | 备注 |
---|---|---|---|---|
100 | 1xx(信息) | Continue | 继续请求(客户端应继续发送请求体) | 用于分块传输 |
200 | 2xx(成功) | OK | 请求成功 | 最常见状态码 |
201 | 2xx(成功) | Created | 资源创建成功 | 常用于POST请求 |
204 | 2xx(成功) | No Content | 请求成功但无内容返回 | 常用于DELETE操作 |
301 | 3xx(重定向) | Moved Permanently | 资源永久重定向 | 需更新书签 |
302 | 3xx(重定向) | Found | 资源临时重定向 | 不修改书签 |
304 | 3xx(重定向) | Not Modified | 资源未修改(利用缓存) | 需配合Last-Modified头使用 |
400 | 4xx(客户端) | Bad Request | 请求语法错误 | 如JSON格式错误 |
401 | 4xx(客户端) | Unauthorized | 未授权(需身份验证) | 与403的区别见备注 |
403 | 4xx(客户端) | Forbidden | 禁止访问 | 权限不足导致 |
404 | 4xx(客户端) | Not Found | 资源不存在 | 最常见错误码 |
405 | 4xx(客户端) | Method Not Allowed | 请求方法不被允许 | 如对GET接口使用POST |
408 | 4xx(客户端) | Request Timeout | 请求超时 | 客户端未及时响应 |
429 | 4xx(客户端) | Too Many Requests | 请求过多 | 需实现限流策略 |
500 | 5xx(服务器) | Internal Server Error | 服务器内部错误 | 需检查日志 |
502 | 5xx(服务器) | Bad Gateway | 网关错误 | 上游服务无响应 |
503 | 5xx(服务器) | Service Unavailable | 服务不可用 | 临时过载或维护 |
504 | 5xx(服务器) | Gateway Timeout | 网关超时 | 上游服务响应超时 |
5.cookie相关
a.概念
Cookie 是服务器发送到用户浏览器的小型文本文件(通常 ≤4KB),以键值对(key=value
)形式存储
b.核心作用
- 会话管理:保持用户登录状态(如存储 Session ID)
- 个性化设置:记忆语言偏好、主题等
- 行为跟踪:记录用户浏览路径、购物车商品等
c.简单工作原理
客户端->>服务器: 首次请求(无 Cookie)
服务器->>客户端: 响应头 Set-Cookie: id=xxx
客户端->>服务器: 后续请求头 Cookie: id=xxx
服务器->>客户端: 识别身份,返回个性化内容
三.Nginx服务部署与配置
1.概述
Nginx 是开源、高性能、高可靠的 Web服务器 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是, Nginx 是免费的并可以商业化,配置使用也比较简单。
1.1 Nginx 特点
-
高并发、高性能;
-
模块化架构使得它的扩展性非常好;
-
异步非阻塞的事件驱动模型(epoll)这点和 Node.js 相似;
-
相对于其它服务器来说它可以连续几个月甚至更长而不需要重启服务器使得它具有高可靠性;
-
热部署、平滑升级;
-
完全开源,生态繁荣。
1.2 Nginx 作用
-
http服务器。Nginx可以独立提供http服务。可做网页静态服务器。
-
虚拟主机。可以实现在一台服务器虚拟出多个虚拟服务器。
-
反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
-
nginx 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。
静态服务 | 代理服务 | 安全服务 | 流行架构 |
浏览器缓存 | 协议类型 | 访问控制 | Nginx+PHP(Fastcgi_pass)LNMP |
防资源盗用 | 正向代理 | 访问限制 | Nginx+Java(Proxy_Pass)LNMT |
资源分类 | 反向代理 | 流量限制 | Nginx+Python(uwsgi_pass) |
资源压缩 | 负载均衡 | 拦截攻击 | / |
资源缓存 | 代理缓存 | 拦截异常请求 | / |
跨域访问 | 动静分离 | 拦截SQL注入 | / |
1.3 Nginx工作原理
Nginx 的核心工作流程是:接收请求 → 映射配置 → 调用模块处理。其内核仅负责请求的初步路由,实际功能由模块实现
- 处理器模块(Handlers)
直接处理请求,生成响应内容(如返回静态文件或转发动态请求) - 过滤器模块(Filters)
对处理器输出的内容进行修改(如压缩、重写HTML) - 代理类模块(Proxies)
与后端服务(如FastCGI、上游服务器)交互,实现负载均衡和反向代理
Nginx 采用 Master 进程 + Worker 进程的双层结构
- Master 进程
- 不处理请求,仅管理 Worker 进程(启动、监控、重启)。
- 响应外部信号(如
nginx -s reload
重载配置)
- Worker 进程
- 实际处理网络请求(默认为单线程,可配置多线程)。
- 各 Worker 独立且平等,通过共享锁(
accept_mutex
)避免“惊群效应”(多个进程争抢同一连接)
2.Nginx服务搭建
2.1 Ningx安装
2.2 编译安装
正常如果失败,因为依赖没有安装,需要安装以下两个
yum install -y pcre-devel
yum install -y zlib-devel
2.3 核心配置文件
配置文件名称 | 配置文件作用 |
---|---|
fastcgi.conf | 此文件包含了FastCGI相关的配置,用于与FastCGI进程通信 |
fastcgi.conf.default | 此文件是fastcgi.conf的备份副本 |
fastcgi_params | 此文件包含了用于FastCGI的参数配置,包括fastcgi的传输协议、请求超时时间等 |
fastcgi_params.default | 此文件是fastcgi_params的备份副本 |
koi-utf | 此文件包含了UTF-8编码与KOI8-R编码之间的字符转换规则,用于处理中文文件名等问题 |
koi-win | 此文件包含了Windows系统的字符转换规则,用于处理Windows系统的文件名问题 |
mime.types | 此文件包含了Nginx支持的MIME类型配置,用于设置相应的Content-Type头 |
mime.types.default | 此文件是mime.types的备份副本 |
nginx.conf | Nginx的主要配置文件,其中包含了所有全局配置和访问控制规则,作为Nginx服务器的入口文件 |
nginx.conf.default | 此文件是nginx.conf的备份副本 |
scgi_params | 此文件包含了用于SCGI协议的参数配置 |
scgi_params.default | 此文件是scgi_params的备份副本 |
uwsgi_params | 此文件包含了用于uWSGI协议的参数配置 |
uwsgi_params.default | 此文件是uwsgi_params的备份副本 |
win-utf | 此文件包含了Windows系统的字符转换规则,用于处理Windows系统的文件名问题 |
nginx.conf配置文件详解
##全局配置,对全局生效##
user nobody nobody; # 指定运行 Nginx 进程的用户为 nobody,组为nobody
pid /var/run/nginx.pid # master主进程的的pid存放在nginx.pid的文件
worker_processes 1; # 指定 Nginx 启动的 worker 子进程数量。
#worker_processes auto; # 与当前cpu物理核心数一致
worker_rlimit_nofile 20480; # 指定 worker 子进程可以打开的最大文件句柄数。
worker_rlimit_core 50M; # 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
working_directory /opt/nginx/tmp; # 存放目录
worker_priority -10; # 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx。
#Linux 默认进程的优先级值是120,值越小越优先;nice 定范围为 -20 到 +19 。
#应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
worker_shutdown_timeout 5s; #指定 worker 子进程优雅退出时的超时时间。
timer_resolution 100ms; #worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
daemon on; # 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。默认是on,后台运行模式。
error_log logs/error.log; # 错误日志文件路径
##events:配置影响 Nginx 服务器与用户的网络连接;##
events {
use epoll; # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
worker_connections 1024; # 允许的最大并发连接数
accept_mutex on; # 是否打开负载均衡互斥锁,默认是off关闭的,这里推荐打开
}
##http:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;##
http {
include mime.types; # 包含 MIME 类型的定义,文件扩展名与类型映射表
default_type application/octet-stream; # 默认文件类型
default_type application/octet-stream; # 默认的 MIME 类型
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; # 访问日志文件及使用的日志格式
sendfile on; # 启用零拷贝传输,高效传输模式
tcp_nopush on; # 启用 TCP nopush 选项,减少网络报文段的数量
keepalive_timeout 0; # 禁用持久连接的超时时间
keepalive_timeout 65; # 保持存活连接的超时时间
gzip on; # 开启 Gzip 压缩
include /etc/nginx/conf.d/*.conf; # 加载自定义配置项
##upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。##
upstream back_end_server{
server 192.168.71.152:8081 #定义后端web服务器节点
}
##server:配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;每个nginx相当于一个虚拟服务器的地位。##
server {
listen 80; # 监听端口 80
server_name localhost; # 服务器名为 localhost
charset koi8-r; # 字符集设置为 koi8-r
access_log logs/host.access.log main; # 主机访问日志文件及使用的日志格式
##location:用于配置匹配的 uri ;##
location / {
root html; # 指定静态资源目录位置,它可以写在 http 、 server 、 location 等配置中。
index index.html index.htm; # 默认的索引文件
deny 172.168.22.11; # 禁止访问的ip地址,可以为all
allow 172.168.33.44;# 允许访问的ip地址,可以为all
}
location /image {
alias /opt/nginx/static/image/;#它也是指定静态资源目录位置,使用alias末尾一定要添加 / ,只能写在 location 中。
}
#当用户访问 www.jx.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png
error_page 404 /404.html; # 设置 404 错误页面的位置为 /404.html
error_page 500 502 503 504 /50x.html; # 将服务器错误页面重定向到 /50x.html
location = /50x.html {
root html;
}
location ~ \.php$ {
proxy_pass http://127.0.0.1; # 将 PHP 脚本代理到监听在 127.0.0.1:80 上的 Apache 服务器
}
location ~ \.php$ {
root html; # PHP 脚本位置
fastcgi_pass 127.0.0.1:9000; # 向 FastCGI 服务器传递 PHP 脚本
fastcgi_index index.php; # 指定 FastCGI 服务器默认的脚本文件名
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # FastCGI 参数配置
include fastcgi_params; # 包含 FastCGI 相关的参数配置
}
location ~ /\.ht {
deny all; # 阻止访问 .htaccess 文件
}
}
server {
listen 8000; # 监听端口 8000
listen somename:8080; # 监听 somename:8080
server_name somename alias another.alias; # 服务器名设置
location / {
root html; # 根目录位置为 html 文件夹
index index.html index.htm; # 默认的索引文件
}
}
server {
listen 443 ssl; # 启动在 443 端口,并开启 SSL
server_name localhost; # 服务器名为 localhost
ssl_certificate cert.pem; # SSL 证书文件
ssl_certificate_key cert.key; # SSL 证书的私钥文件
ssl_session_cache shared:SSL:1m; # 配置 SSL 会话缓存
ssl_session_timeout 5m; # SSL 会话缓存的超时时间设置为 5 分钟
ssl_ciphers HIGH:!aNULL:!MD5; # 配置 SSL 加密算法
ssl_prefer_server_ciphers on; # 优先使用服务器端的加密套件
location / {
root html; # 根目录位置为 html 文件夹
index index.html index.htm; # 默认的索引文件
}
}
}
将配置文件的一些注释删除后
之后进行软连接后,就可以使用nginx命令了
2.4nginx用法
选项 (Options):
- -?, h : 显示此帮助信息
- -v : 显示版本信息并退出
- -V : 显示版本信息及编译配置选项,然后退出
- -t : 测试配置文件语法并退出
- -T : 测试配置文件语法,转储配置内容并退出
- -q : 在测试配置时禁止显示非错误信息
- -s signal : 向主进程发送信号:
stop
(快速停止),quit
(优雅退出),reopen
(重新打开日志文件),reload
(重载配置) - -p prefix : 设置路径前缀 (默认值:
/usr/local/nginx/
) - -e filename : 设置错误日志文件 (默认值:
logs/error.log
) - -c filename : 设置配置文件 (默认值:
conf/nginx.conf
) - -g directives : 在配置文件之外设置全局指令
Nginx的所有编译选项及其功能说明
选项类别 | 选项 | 参数 | 说明 |
---|---|---|---|
帮助信息 | --help | 无 | 打印帮助信息 |
安装路径 | --prefix=PATH | 路径 | 设置安装前缀目录 |
--sbin-path=PATH | 路径 | 设置nginx二进制文件路径 | |
--modules-path=PATH | 路径 | 设置模块路径 | |
--conf-path=PATH | 路径 | 设置nginx.conf路径 | |
--error-log-path=PATH | 路径 | 设置错误日志路径 | |
--pid-path=PATH | 路径 | 设置nginx.pid路径 | |
--lock-path=PATH | 路径 | 设置nginx.lock路径 | |
运行用户 | --user=USER | 用户名 | 设置worker进程的非特权用户 |
--group=GROUP | 组名 | 设置worker进程的非特权组 | |
构建选项 | --build=NAME | 名称 | 设置构建名称 |
--builddir=DIR | 目录 | 设置构建目录 | |
事件模块 | --with-select_module | 无 | 启用select模块 |
--without-select_module | 无 | 禁用select模块 | |
--with-poll_module | 无 | 启用poll模块 | |
--without-poll_module | 无 | 禁用poll模块 | |
--with-threads | 无 | 启用线程池支持 | |
--with-file-aio | 无 | 启用文件AIO支持 | |
--without-quic_bpf_module | 无 | 禁用ngx_quic_bpf_module | |
HTTP模块 | --with-http_ssl_module | 无 | 启用HTTP SSL模块 |
--with-http_v2_module | 无 | 启用HTTP/2模块 | |
--with-http_v3_module | 无 | 启用HTTP/3模块 | |
--with-http_realip_module | 无 | 启用HTTP真实IP模块 | |
--with-http_addition_module | 无 | 启用HTTP附加模块 | |
--with-http_xslt_module | 无 | 启用HTTP XSLT模块 | |
--with-http_xslt_module=dynamic | 无 | 启用动态HTTP XSLT模块 | |
--with-http_image_filter_module | 无 | 启用HTTP图像过滤模块 | |
--with-http_image_filter_module=dynamic | 无 | 启用动态HTTP图像过滤模块 | |
--with-http_geoip_module | 无 | 启用HTTP GeoIP模块 | |
--with-http_geoip_module=dynamic | 无 | 启用动态HTTP GeoIP模块 | |
--with-http_sub_module | 无 | 启用HTTP替换模块 | |
--with-http_dav_module | 无 | 启用HTTP WebDAV模块 | |
--with-http_flv_module | 无 | 启用HTTP FLV模块 | |
--with-http_mp4_module | 无 | 启用HTTP MP4模块 | |
--with-http_gunzip_module | 无 | 启用HTTP解压缩模块 | |
--with-http_gzip_static_module | 无 | 启用HTTP Gzip静态模块 | |
--with-http_auth_request_module | 无 | 启用HTTP认证请求模块 | |
--with-http_random_index_module | 无 | 启用HTTP随机索引模块 | |
--with-http_secure_link_module | 无 | 启用HTTP安全链接模块 | |
--with-http_degradation_module | 无 | 启用HTTP降级模块 | |
--with-http_slice_module | 无 | 启用HTTP切片模块 | |
--with-http_stub_status_module | 无 | 启用HTTP状态模块 | |
禁用HTTP模块 | --without-http_charset_module | 无 | 禁用HTTP字符集模块 |
--without-http_gzip_module | 无 | 禁用HTTP Gzip模块 | |
--without-http_ssi_module | 无 | 禁用HTTP SSI模块 | |
--without-http_userid_module | 无 | 禁用HTTP用户ID模块 | |
--without-http_access_module | 无 | 禁用HTTP访问模块 | |
--without-http_auth_basic_module | 无 | 禁用HTTP基本认证模块 | |
--without-http_mirror_module | 无 | 禁用HTTP镜像模块 | |
--without-http_autoindex_module | 无 | 禁用HTTP自动索引模块 | |
--without-http_geo_module | 无 | 禁用HTTP地理模块 | |
--without-http_map_module | 无 | 禁用HTTP映射模块 | |
--without-http_split_clients_module | 无 | 禁用HTTP分割客户端模块 | |
--without-http_referer_module | 无 | 禁用HTTP引用模块 | |
--without-http_rewrite_module | 无 | 禁用HTTP重写模块 | |
--without-http_proxy_module | 无 | 禁用HTTP代理模块 | |
--without-http_fastcgi_module | 无 | 禁用HTTP FastCGI模块 | |
--without-http_uwsgi_module | 无 | 禁用HTTP uWSGI模块 | |
--without-http_scgi_module | 无 | 禁用HTTP SCGI模块 | |
--without-http_grpc_module | 无 | 禁用HTTP gRPC模块 | |
--without-http_memcached_module | 无 | 禁用HTTP Memcached模块 | |
--without-http_limit_conn_module | 无 | 禁用HTTP连接限制模块 | |
--without-http_limit_req_module | 无 | 禁用HTTP请求限制模块 | |
--without-http_empty_gif_module | 无 | 禁用HTTP空GIF模块 | |
--without-http_browser_module | 无 | 禁用HTTP浏览器模块 | |
--without-http_upstream_hash_module | 无 | 禁用HTTP上游哈希模块 | |
--without-http_upstream_ip_hash_module | 无 | 禁用HTTP上游IP哈希模块 | |
--without-http_upstream_least_conn_module | 无 | 禁用HTTP上游最少连接模块 | |
--without-http_upstream_random_module | 无 | 禁用HTTP上游随机模块 | |
--without-http_upstream_keepalive_module | 无 | 禁用HTTP上游保活模块 | |
--without-http_upstream_zone_module | 无 | 禁用HTTP上游区域模块 | |
Perl模块 | --with-http_perl_module | 无 | 启用HTTP Perl模块 |
--with-http_perl_module=dynamic | 无 | 启用动态HTTP Perl模块 | |
--with-perl_modules_path=PATH | 路径 | 设置Perl模块路径 | |
--with-perl=PATH | 路径 | 设置Perl二进制文件路径 | |
HTTP临时文件 | --http-log-path=PATH | 路径 | 设置HTTP访问日志路径 |
--http-client-body-temp-path=PATH | 路径 | 设置HTTP客户端请求体临时文件路径 | |
--http-proxy-temp-path=PATH | 路径 | 设置HTTP代理临时文件路径 | |
--http-fastcgi-temp-path=PATH | 路径 | 设置HTTP FastCGI临时文件路径 | |
--http-uwsgi-temp-path=PATH | 路径 | 设置HTTP uWSGI临时文件路径 | |
--http-scgi-temp-path=PATH | 路径 | 设置HTTP SCGI临时文件路径 | |
HTTP功能 | --without-http | 无 | 禁用HTTP服务器 |
--without-http-cache | 无 | 禁用HTTP缓存 | |
邮件模块 | --with-mail | 无 | 启用邮件代理模块 |
--with-mail=dynamic | 无 | 启用动态邮件代理模块 | |
--with-mail_ssl_module | 无 | 启用邮件SSL模块 | |
--without-mail_pop3_module | 无 | 禁用邮件POP3模块 | |
--without-mail_imap_module | 无 | 禁用邮件IMAP模块 | |
--without-mail_smtp_module | 无 | 禁用邮件SMTP模块 | |
流模块 | --with-stream | 无 | 启用TCP/UDP代理模块 |
--with-stream=dynamic | 无 | 启用动态TCP/UDP代理模块 | |
--with-stream_ssl_module | 无 | 启用流SSL模块 | |
--with-stream_realip_module | 无 | 启用流真实IP模块 | |
--with-stream_geoip_module | 无 | 启用流GeoIP模块 | |
--with-stream_geoip_module=dynamic | 无 | 启用动态流GeoIP模块 | |
--with-stream_ssl_preread_module | 无 | 启用流SSL预读模块 | |
--without-stream_limit_conn_module | 无 | 禁用流连接限制模块 | |
--without-stream_access_module | 无 | 禁用流访问模块 | |
--without-stream_geo_module | 无 | 禁用流地理模块 | |
--without-stream_map_module | 无 | 禁用流映射模块 | |
--without-stream_split_clients_module | 无 | 禁用流分割客户端模块 | |
--without-stream_return_module | 无 | 禁用流返回模块 | |
--without-stream_pass_module | 无 | 禁用流转发模块 | |
--without-stream_set_module | 无 | 禁用流设置模块 | |
--without-stream_upstream_hash_module | 无 | 禁用流上游哈希模块 | |
--without-stream_upstream_least_conn_module | 无 | 禁用流上游最少连接模块 | |
--without-stream_upstream_random_module | 无 | 禁用流上游随机模块 | |
--without-stream_upstream_zone_module | 无 | 禁用流上游区域模块 | |
其他模块 | --with-google_perftools_module | 无 | 启用Google性能工具模块 |
--with-cpp_test_module | 无 | 启用C++测试模块 | |
外部模块 | --add-module=PATH | 路径 | 启用外部模块 |
--add-dynamic-module=PATH | 路径 | 启用动态外部模块 | |
兼容性 | --with-compat | 无 | 动态模块兼容性 |
编译器选项 | --with-cc=PATH | 路径 | 设置C编译器路径 |
--with-cpp=PATH | 路径 | 设置C预处理器路径 | |
--with-cc-opt=OPTIONS | 选项 | 设置额外的C编译器选项 | |
--with-ld-opt=OPTIONS | 选项 | 设置额外的链接器选项 | |
--with-cpu-opt=CPU | CPU类型 | 为指定CPU构建(值: pentium, pentiumpro等) | |
PCRE库 | --without-pcre | 无 | 禁用PCRE库 |
--with-pcre | 无 | 强制使用PCRE库 | |
--with-pcre=DIR | 路径 | 设置PCRE库源码路径 | |
--with-pcre-opt=OPTIONS | 选项 | 设置PCRE额外的构建选项 | |
--with-pcre-jit | 无 | 使用PCRE JIT编译支持 | |
--without-pcre2 | 无 | 不使用PCRE2库 | |
zlib库 | --with-zlib=DIR | 路径 | 设置zlib库源码路径 |
--with-zlib-opt=OPTIONS | 选项 | 设置zlib额外的构建选项 | |
--with-zlib-asm=CPU | CPU类型 | 使用指定CPU优化的zlib汇编源码(值: pentium等) | |
原子操作库 | --with-libatomic | 无 | 强制使用libatomic_ops库 |
--with-libatomic=DIR | 路径 | 设置libatomic_ops库源码路径 | |
OpenSSL | --with-openssl=DIR | 路径 | 设置OpenSSL库源码路径 |
--with-openssl-opt=OPTIONS | 选项 | 设置OpenSSL额外的构建选项 | |
调试 | --with-debug | 无 | 启用调试日志 |
2.5 核心命令
命令 | 作用 |
---|---|
systemctl enable nginx | 开机自动启动 |
systemctl disable nginx | 关闭开机自动启动 |
systemctl start nginx | 启动Nginx |
systemctl stop nginx | 停止Nginx |
systemctl restart nginx | 重启Nginx |
systemctl reload nginx | 重新加载Nginx |
systemctl status nginx | 查看 Nginx 运行状态 |
ps -elf | grep [n]ginx | 查看Nginx进程,但是不会显示grep本身的进程 |
kill -9 pid | 根据上面查看到的Nginx进程号,杀死Nginx进程,-9 表示强制结束进程 |
nginx -s reload | 向主进程发送信号,重新加载配置文件,热重启 |
nginx -s reopen | 重启 Nginx |
nginx -s stop | 快速关闭 |
nginx -s quit | 等待工作进程处理完成后关闭 |
nginx -T | 查看当前 Nginx 最终的配置 |
nginx -t | 检查配置是否有问题 |
nginx -c configfilePath | 指定配置文件启动nginx |
2.6 Nginx信号
信号名 | 含义 |
---|---|
stop | 直接停止 |
quit | 优雅的退出:有人在访问不会结束进程 |
reopen | 分割日志 |
reload | 重新加载配置文件 |
term | 快速停止nginx进程,可能会中断现有连接,与stop信号类似。 |
usr1 | 重新打开日志文件,用于日志切割或日志重定向,与reopen信号类似。 |
usr2 | 平滑地升级nginx可执行文件。 |
hup | 重新加载配置文件,优雅地应用新配置,与reload信号类似。 |
winch | 当nginx以master/worker工作模式运行时,重新生成worker进程以适应新的配置。 |
usr3 | 向worker进程发送自定义信号。 |
3.启用nginx(单站点配置)
在网页输入网址得到如下界面
此时查看错误日志发现有两个报错,是因为没找到favicon.ico导致的,去那个文件中创建一个即可
此时再次进入网址就没有报错提示了
切换浏览器进入网址会有不同信息
在网址上输入不存在的路径会显示404界面
将配置文件nginx.conf中的404选项打开,然后可以对404界面进行编写
此时刷新404界面就会变成自己写入的图片(被下架了)
4.虚拟机主机头配置
基于端口号
先创建一个文件夹conf.d,并在nginx.conf中增加一句
创建web.conf文件,从nginx.conf中复制server那一段到这个文件中并修改
此时进入803端口就会显示
基于IP地址
再为网卡配置子接口
修改文件将端口号改为子网址
重启服务后,此时输入网址进入
基于域名
将文件中的域名修改
在把源文件中的localhost修改
在另一台主机中,修改/etc/hosts文件
然后访问
四、HTTPS访问配置[自签名]
4.1 SSL简介
SSL (Secure Sockets Layer)安全套接层。是由Netscape(网景)公司于1990年开发,用于保障Word Wide Web(WWW)通讯的安全。主要任务是提供私密性,信息完整性和身份认证。1994年改版为SSLv2,1995年改版为SSLv3.
TLS(Transport Layer Security)安全传输层协议,)用于在两个通信应用程序之间提供保密性和数据完整性。该标准协议是由IETF于1999年颁布,整体来说TLS非常类似SSLv3,只是对SSLv3做了些增加和修改。
4.2 SSL协议介绍
SSL是一个不依赖于平台和应用程序的协议,位于TCP/IP协议与各种应用层协议之间,为数据通信提高安全支持。
4.3 传输过程
-
首先发送数字证书,获取到可信的public key。
-
通过public key发送对称秘钥,接收方用私钥解密。
-
通信双方使用仅仅对方可知的对称秘钥进行加密传输。
4.5 OpenSSL介绍
OpenSSL是一个实现安全套接字层的加密工具包,openssl程序是一个命令行工具,用于使用OpenSSL加密库的加密函数。它可以用于:
-
创建和管理私钥、公钥和参数
-
公钥密码操作
-
创建X.509证书、CSR和CRT
-
消息摘要的计算
-
密码加密和解密
-
SSL/TLS客户端和服务器测试
-
处理S/MIME签名或加密邮件
-
时间戳请求、生成和验证
4.6 HTTPS 工作流程
-
客户端(浏览器)访问 www.baidu.com 百度网站;
-
百度服务器返回 HTTPS 使用的 CA 证书;
-
浏览器验证 CA 证书是否为合法证书;
-
验证通过,证书合法,生成一串随机数并使用公钥(证书中提供的)进行加密;
-
发送公钥加密后的随机数给百度服务器;
-
百度服务器拿到密文,通过私钥进行解密,获取到随机数(公钥加密,私钥解密,反之也可以);
-
百度服务器把要发送给浏览器的内容,使用随机数进行加密后传输给浏览器;(对称加密)
-
此时浏览器可以使用随机数进行解密,获取到服务器的真实传输内容。
4.7 自签名证书
生成私钥文件(包含公钥和私钥)
生成证书请求文件
生成证书
查看证书
再将生成的证书移动到/etc/pki/nginx(自己创建)
4.8 nginx配置SSL
去/etc/nginx/nginx.conf中最下边修改
测试登录
修改/usr/share/nginx/html/index.html
最上面修改标题
最下边可以修改网页内容
此时使用https登录会提示
此时点击高级,继续访问
安装需要的功能(需要自己下载依赖关系)make && make install,
进行软连接
再去/usr/local/nginx/conf/nginx.conf中最下方取消注释
创建pki,并将之前的证书文件移动过来
此时启动nginx后,登录网址,https也可以登录
五、 location配置
5.1 作用
配置路径
location [ = | ~ | ~* | ^~ ] uri {
...
}
##在浏览器中输入的:http://www.jx.com/s?id=1&test=123,称作URL,即:统一资源定位符
##在WEB服务器中,对资源进行标识,URI,即统一资源标识符
写在server字段中。
5.2 匹配规则
-
= 精确匹配;
-
~ 正则匹配,区分大小写;
-
~* 正则匹配,不区分大小写;
-
^~ 匹配到即停止搜索;
5.3 匹配优先级
= > ^~ > ~ > ~* > 不带任何字符 “/”。
5.4 配置案例
在location下新加一个文件a.html,当没有这个文件时访问会出现
此时创建该文件并输入hello,刷新后再次访问
再使用正则匹配图片格式,创建images文件夹并放入图片
此时访问即可得到文件中的图片
第三种访问bbs时会去匹配路径上的index文件,若bbs中没有,则会403
此时加入内容
1、location 中的反斜线,代表后面的名字是一个文件夹名
location /test {
...
}
##以上写法会优先查找目录,若目录不存在则查找同名文件location /test/ {
...
}##这个写法则只会寻找目录
2、return
停止处理请求,直接返回响应码或重定向到其他 URL ;执行 return 指令后, location 中后续指令将不会被执行。
location / {
return 404; # 直接返回状态码
}
location / {
return 404 "pages not found"; # 返回状态码 + 一段文本
}
location / {
return 302 http://192.168.71.152/bbs ; # 返回状态码 + 重定向地址
}
location / {
return https://www.baidu.com ; # 返回重定向地址
}
此时进入就进入输入的网址
六、rewrite配置
根据指定正则表达式匹配规则,重写 URL 。应用场景: 新老域名的更替!!!
6.1 语法
rewrite 正则表达式 要替换的内容 [flag];
6.2 可写入字段
server、location、if
rewirte /images/(.*\.jpg)$ /pic/$1; # $1是前面括号(.*\.jpg)的反向引用
flag 可选值的含义:
-
last: 重写后的 URL 发起新请求,再次进入 server 段,重试 location 的中的匹配;
-
break :直接使用重写后的 URL ,不再匹配其它 location 中语句;
-
redirect :返回 302 临时重定向;
-
permanent :返回 301 永久重定向。
6.3 配置案例
此时输入images未找到图片
加上文件名后,他先找到pics,然后到photos里,找到目标文件
###生产环境不能使用.*,表示匹配任意!!!
#解析:
#当访问 /s 时,会自动帮我们重定向到 https://www.baidu.com;
#当访问 192.168.71.149/images/1.jpg 时,第一步重写 URL 为 192.168.71.149/pics/kati.jpg ,找到 pics 的 location ,继续重写 URL 为 192.168.71.149/photos/kati.jpg ,找到 /photos 的 location 后,去 html/photos 目录下寻找 kati.jpg 静态资源。
6.4 if 指令
语法:if (condition) {...}
可写字段:server、location
此时使用火狐浏览器登录则看到Firefox,用谷歌浏览器则是Chrome
set $var value; #设置变量
condition 判断条件:
-
$variable 仅为变量时,值为空或以0开头字符串都会被当做 false 处理;
-
= 或 != 相等或不等;
-
~ 正则匹配;
-
! ~ 非正则匹配;
-
~* 正则匹配,不区分大小写;
-
-f 或 ! -f 检测文件存在或不存在;
-
-d 或 ! -d 检测目录存在或不存在;
-
-e 或 ! -e 检测文件、目录、符号链接等存在或不存在;
-
-x 或 ! -x 检测文件可以执行或不可执行;
server {
listen 8080;
server_name www.britz.com;
root /usr/share/nginx/html;
location / {
if ( $uri = "/images/" ){
rewrite (.*) /pics/ break;
}
}
}
#当访问 www.britz.com/images/ 时,会进入 if 判断里面执行 rewrite 命令。
6.5 autoindex
当访问192.168.71.149/download/ 时,会把服务器 /usr/local/nginx/html/download/ 路径下的文件展示出来.
注意:不能在有混合业务的站点开启该功能,容易被攻击!
6.6 nginx配置中的常用变量
变量名 | 含义 |
---|---|
remote_add | 客户端IP地址 |
remote_port | 客户端端口 |
server_addr | 服务端IP地址 |
Server_port | 服务端端口 |
server_protocol | 服务端协议 |
binary_remote_addr | 二进制格式的客户端IP地址 |
connection | TCP连接的序号,递增 |
connection_request | TCP连接当前的请求数量 |
uri | 请求的URL,不包含参数 |
request ur | 请求的URL,包含参数 |
scheme | 协议名,http或https |
request metho | 请求方法 |
request_length | 全部请求的长度,包含请求行、请求头、请求体 |
args | 全部参数字符串 |
arg_参数名 | 获取特定参数值 |
is_args | URL中是否有参数,有的话返回?,否则返回空 |
query_string | 与args相同 |
host | 请求信息中的Host,如果请求中没有Host行,则在请求头中找,最后 使用nginx中设置的server_name。 |
http_user_agent | 用户访问方式 |
http_referer | 从哪些链接过来的请求 |
http_via | 每经过一层代理服务器,都会添加相应的信息 |
http_cookie | 获取用户cookie |
request time | 处理请求已消耗的时间 |
https | 是否开启了https,是则返回on,否则返回空 |
request_filename | 磁盘文件系统待访问文件的完整路径 |
document_root | 由URI和root/alias规则生成的文件夹路径 |
limit_rate | 返回响应时的速度上限值 |
四.总结
本节主要是对nginx的安装部署和简单的使用,对于nginx的更多用法还在后面,尽情期待。
这次更新了https访问和location配置,rewrite配置的相关知识,通过对nginx.conf内容的增加来对网址的内容进行修改,熟练掌握流程