目录
一 web服务介绍
Web 服务,即网络服务,是一种基于互联网的软件系统,它通过标准的网络协议和数据格式,为不同的应用程序或设备之间提供交互和数据共享的能力。
一、HTTP 简介
HTTP 是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是互联网上最常用的协议之一,用于在客户端(如浏览器)和服务器之间传输超文本数据,如网页、图像、视频等。
工作原理
- 客户端向服务器发送一个 HTTP 请求,请求中包含了要访问的资源的 URL(Uniform Resource Locator,统一资源定位符)以及一些请求头信息,如用户代理、接受的内容类型等。
- 服务器接收到请求后,根据请求的 URL 找到相应的资源,并生成一个 HTTP 响应返回给客户端。响应中包含了资源的内容以及一些响应头信息,如内容类型、响应状态码等。
- 客户端接收到响应后,根据响应头信息解析资源的内容,并在浏览器中显示出来。
主要特点
- 无状态:HTTP 是一种无状态协议,即服务器不会记住客户端的请求历史。这意味着每次客户端向服务器发送请求时,都需要包含完整的请求信息,服务器无法根据之前的请求来推断当前请求的上下文。
- 支持多种请求方法:HTTP 支持多种请求方法,如 GET、POST、PUT、DELETE 等。不同的请求方法用于不同的目的,如 GET 用于获取资源,POST 用于提交数据等。
- 可扩展性:HTTP 是一种可扩展的协议,可以通过添加新的请求头和响应头来支持新的功能。例如,通过添加 Accept-Ranges 请求头和 Content-Range 响应头,可以实现断点续传功能。
二、Nginx 简介
Nginx 是一款高性能的 Web 服务器、反向代理服务器和负载均衡器。它以其高并发处理能力、低内存消耗和稳定性而闻名。
主要功能
- Web 服务器:Nginx 可以作为一个独立的 Web 服务器,直接处理客户端的 HTTP 请求,并返回相应的资源。它支持静态文件服务、动态内容生成(如 PHP、Python 等)以及反向代理等功能。
- 反向代理:Nginx 可以作为反向代理服务器,将客户端的请求转发到后端的服务器上,并将后端服务器的响应返回给客户端。反向代理可以提高系统的安全性、性能和可扩展性。
- 负载均衡:Nginx 可以作为负载均衡器,将客户端的请求分发到多个后端服务器上,以实现负载均衡和高可用性。负载均衡可以提高系统的吞吐量和可靠性。
工作原理
- 当客户端向 Nginx 发送一个 HTTP 请求时,Nginx 首先根据配置文件中的规则,确定请求应该被转发到哪个后端服务器上。
- 如果请求是静态文件请求,Nginx 可以直接从本地文件系统中读取文件,并返回给客户端。如果请求是动态内容请求,Nginx 将请求转发到后端的应用服务器上,应用服务器处理请求并生成响应,Nginx 将响应返回给客户端。
- 在反向代理和负载均衡的情况下,Nginx 可以根据配置文件中的策略,选择一个合适的后端服务器,并将请求转发到该服务器上。后端服务器处理请求并生成响应,Nginx 将响应返回给客户端。
二 Nginx介绍与源码安装
Nginx(Engine X)是一款高性能的开源 Web 服务器、反向代理服务器和负载均衡器。它以其出色的性能、稳定性和低资源消耗而备受赞誉,在互联网领域得到了广泛的应用。
一、主要特点
高性能
- Nginx 采用事件驱动的异步非阻塞架构,能够高效地处理大量并发连接。与传统的多线程或多进程服务器相比,它在高并发场景下表现出更低的内存占用和更高的吞吐量。
- 例如,在处理静态文件请求时,Nginx 可以快速地从磁盘读取文件并将其发送给客户端,而不会因为大量并发请求而导致性能下降。
稳定性
- Nginx 具有高度的稳定性,能够在长时间运行中保持可靠的服务。它经过了广泛的测试和实际应用的验证,能够应对各种复杂的网络环境和负载情况。
- 许多大型网站和互联网服务提供商都选择 Nginx 作为其核心的 Web 服务器或负载均衡器,以确保服务的高可用性和稳定性。
低资源消耗
- Nginx 对系统资源的消耗非常低,能够在资源有限的环境下高效运行。它可以在普通的服务器硬件上处理大量的并发连接,而不会对服务器的性能产生明显的影响。
- 这使得 Nginx 特别适合于云计算、容器化等场景,能够在资源受限的环境中为应用提供高性能的服务。
反向代理和负载均衡
- Nginx 可以作为反向代理服务器,将客户端的请求转发到后端的应用服务器上。它可以隐藏后端服务器的真实 IP 地址,提高系统的安全性。
- 同时,Nginx 还可以作为负载均衡器,将客户端的请求分发到多个后端服务器上,以实现负载均衡和高可用性。它支持多种负载均衡算法,如轮询、加权轮询、IP 哈希等,可以根据实际需求进行灵活配置。
丰富的功能模块
- Nginx 拥有丰富的功能模块,可以满足不同的应用需求。例如,它支持 SSL/TLS 加密、HTTP/2 协议、动态模块加载、缓存、压缩等功能。
- 这些功能模块可以通过简单的配置进行启用或禁用,使得 Nginx 能够适应各种不同的应用场景。
2.1 nginx源码安装
补充:./configure 后选项介绍
--prefix=/usr/local/nginx \ 指定安装路径--user=nginx \ # 指定 nginx 运行用户--group=nginx \ # 指定 nginx 运行组--with-http_ssl_module \ # 支持 https://--with-http_v2_module \ # 支持 http 版本 2--with-http_realip_module \ # 支持 ip 透传--with-http_stub_status_module \ # 支持状态页面--with-http_gzip_static_module \ # 支持压缩--with-pcre \ # 支持正则--with-stream \ # 支持 tcp 反向代理--with-stream_ssl_module \ # 支持 tcp 的 ssl 加密--with-stream_realip_module # 支持 tcp 的透传 ip--add-module=/root/echo-nginx-module-0.632.1.1 将nginx包传入并解压
2.1.2 解压之后的目录中,用configure检测模块,并且检测需要安装的软件包,然后创建用户,并指定目录
创建用户:
useradd -s /sbin/nologin -M nginx
2.1.3下载依赖包,并且重新检测成功后,输入make命令
yum install gcc pcre-devel zlib-devel openssl-devel -y
2.1.4 然后make install
2.1.5 运行并产看他的进程
2.1.6 配置环境变量
2.1.7 然后停止。准备做平滑升级和回滚
2.2 平滑升级和回滚
2.2.1 解压高版本nginx
2.2.2 配置26
2.2.3 然后make制作
此时还是nginx24的进程
2.2.4 备份老的,在把新版本复制过去
2.2.5 user2介绍
#USR2 平滑升级可执行程序 , 将存储有旧版本主进程 PID 的文件重命名为 nginx.pid.oldbin ,并启动新的nginx# 此时两个 master 的进程都在运行 , 只是旧的 master 不在监听 , 由新的 master 监听 80# 此时 Nginx 开启一个新的 master 进程,这个 master 进程会生成新的 worker 进程,这就是升级后的 Nginx 进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
2.2.6 回收旧版本# 回收旧版本[root@Nginx sbin]# kill -WINCH 10576新版本生效![]()
2.2.7 回滚
释放旧的![]()
2.2.8 拉起旧的
删掉其他![]()
![]()
![]()
三 配置文件详解
3.1 配置文件说明
主配置文件:nginx.conf
子配置文件:include conf.d/*.conf
nginx配置文件格式说明
配置文件由指令与指令块构成每条指令以 ; 分号结尾,指令与值之间以空格符号分隔可以将多条指令放在同一行 , 用分号分隔即可 , 但可读性差 , 不推荐指令块以 { } 大括号将多条指令组织在一起 , 且可以嵌套指令块include 语句允许组合多个配置文件以提升可维护性使用 # 符号添加注释,提高可读性使用 $ 符号使用变量部分指令的参数支持正则表达式nginx 主配置文件的配置指令方式directive value [value2 ...];注意(1) 指令必须以分号结尾(2) 支持使用配置变量内建变量:由 Nginx 模块引入,可直接引用自定义变量:由用户使用 set 命令定义 , 格式 : set variable_name value;引用变量: $variable_name主配置结构main block :主配置段,即全局配置段,对 http,mail 都有效# 事件驱动相关的配置event {...}#http/https 协议相关配置段http { ...}# 默认配置文件不包括下面两个块#mail 协议相关配置段mail {...}#stream 服务器相关配置段stream {...}文件格式说明# 全局配置端,对全局生效,主要设置 nginx 的启动用户 / 组,启动的工作进程数量,工作模式, Nginx 的 PID 路 径,日志路径等。worker_processes 1; # 启动工作进程数数量worker_connections 1024; # 设置单个 nginx 工作进程可以接受的最大并发#http 块是 Nginx 服务器配置中的重要部分,缓存、代理和日志格 式定义等绝大多数功能和第三方模块http 块可 以包含多个server 块,而一个 server 块中又可以包含多个 location 块keepalive_timeout 65; # 长连接超时时间,单位是秒listen 80; # 配置 server 监听的端口# 和邮件相关的配置#mail {# ...# } mail 协议相关配置段#tcp 代理配置, 1.9 版本以上支持#stream {# ...# } stream 服务器相关配置段# 导入其他路径的配置文件#include /apps/nginx/conf.d/*.conf}
3.2 全局配置与http模块
全局配置
Main 全局配置段常见的配置指令分类正常运行必备的配置优化性能相关的配置用于调试及定位问题相关的配置事件驱动相关的配置全局配置说明user nginx nginx; # 启动 Nginx 工作进程的用户和组worker_processes [number | auto]; # 启动 Nginx 工作进程的数量 , 一般设为和 CPU 核心数相同worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ;# 将 Nginx 工作进程绑定到指定的 CPU 核心,默认 Nginx 是不进行进程绑定的,绑定并不是意味着当前 nginx 进程独占以一核心 CPU ,但是可以保证此进程不运行在其他核心上,这就极大减少了 nginx 的工作进程在不同的cpu 核心上的来回跳转,减少了 CPU 对进程的资源分配与回收以及内存管理等,因此可以有效的提升 nginx 服务器的性能。CPU MASK: 00000001 : 0 号 CPU00000010 : 1 号 CPU10000000 : 7 号 CPU# 示例worker_cpu_affinity 0001 0010 0100 1000; 第 0 号 --- 第 3 号 CPUworker_cpu_affinity 0101 1010;#pid 文件保存路径pid /usr/local/nginx/logs/nginx.pid;worker_priority 0; # 工作进程优先级, -20~20(19)worker_rlimit_nofile 65536; # 所有 worker 进程能打开的文件数量上限 ,# 包括 :Nginx 的所有连接(例如与代理服务器的连接等)# 而不仅仅是与客户端的连接# 另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制# 最好与 ulimit -n 或者 limits.conf 的值保持一致worker_connections 65535; # 设置单个工作进程的最大并发连接数use epoll; # 使用 epoll 事件驱动,
http配置块
# 在响应报文中将指定的文件扩展名映射至 MIME 对应的类型include /etc/nginx/mime.types;default_type application/octet-stream; # 除 mime.types 中的类型外 #指定其它文件的默认 MIME 类型,浏览 器一般会提示下载types {text/html html;image/gif gif;image/jpeg jpg;}基于不同的 IP 、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块ngx_http_core_module 实现。
3.3 root与alias
写一个子配置文件,*.conf记得加引号
root举例
![](https://i-blog.csdnimg.cn/direct/6714e6889d5e4dd5888e2e31b90fc192.png)
![](https://i-blog.csdnimg.cn/direct/449d177d886e4d458935036578b96ec3.png)
补充:
root # 给定的路径对应于 location 中的 /uri 左侧的 /alias # 给定的路径对应于 location 中的 /uri 的完整路径
3.4 location的介绍
在一个 server 中 location 配置段可存在多个,用于实现从 uri 到文件系统的路径映射;ngnix 会根据用户请求的 URI 来检查定义的所有 location ,按一定的优先级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候, nginx 会先在 server 中的多个 location 选取匹配度最高的一个uri uri是用户请求的字符串,即域名后面的 web 文件路径然后使用该 location 模块中的正则 url 和字符串,如果匹配成功就结束搜索,并使用此 location 处理此请求。
3.5 账户认证
由 ngx_http_auth_basic_module 模块提供此功能
在配置文件写入
测试![]()
![]()
四 高级配置
4.1 nginx 压缩功能
Nginx 支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文件大小将比源文件显著变小,样有助于降低出口带宽的利用率,降低企业的 IT 支出,不过会占用相应的 CPU 资源。Nginx 对文件的压缩功能是依赖于模块 ngx_http_gzip_module, 默认是内置模块介绍# 启用或禁用 gzip 压缩,默认关闭gzip on | off;# 压缩比由低到高从 1 到 9 ,默认为 1 ,值越高压缩后文件越小,但是消耗 cpu 比较高。基本设定未 4 或者 5gzip_comp_level 4;# 禁用 IE6 gzip 功能,早期的 IE6 之前的版本不支持压缩gzip_disable "MSIE [1-6]\.";#gzip 压缩的最小文件,小于设置值的文件将不会压缩gzip_min_length 1k;# 启用压缩功能时,协议的最小版本,默认 HTTP/1.1gzip_http_version 1.0 | 1.1;# 指定 Nginx 服务需要向服务器申请的缓存空间的个数和大小 , 平台不同 , 默认 :32 4k 或者 16 8k;gzip_buffers number size;# 指明仅对哪些类型的资源执行压缩操作 ; 默认为 gzip_types text/html ,不用显示指定,否则出错gzip_types mime-type ...;# 如果启用压缩,是否在响应报文首部插入 “Vary: Accept-Encoding”, 一般建议打开gzip_vary on | off;# 预压缩,即直接从磁盘找到对应文件的 gz 后缀的式的压缩文件返回给用户,无需消耗服务器 CPU# 注意 : 来自于 ngx_http_gzip_static_module 模块gzip_static on | off;示例![]()
![]()
![]()
![]()
![]()
4.2 变量介绍
变量使用:
ginx 的变量可以在配置文件中引用,作为功能判断或者日志等场景使用变量可以分为内置变量和自定义变量内置变量是由 nginx 模块自带,通过变量可以获取到众多的与客户端访问相关的值。常用内置变量$remote_addr; #存放了客户端的地址,注意是客户端的公网 IP$args; # 变量中存放了 URL 中的所有参数# 例如 :https://search.jd.com/Search?keyword= 手机 &enc=utf-8# 返回结果为 : keyword= 手机 &enc=utf-8$is_args# 如果有参数为 ? 否则为空$document_root;# 保存了针对当前资源的请求的系统根目录 , 例如 :/webdata/nginx/timinglee.org/lee 。$document_uri;# 保存了当前请求中不包含参数的 URI ,注意是不包含请求的指令# 比如 :http://lee.timinglee.org/var?\id=11111 会被定义为 /var# 返回结果为 :/var$host;# 存放了请求的 host 名称limit_rate 10240;echo $limit_rate;# 如果 nginx 服务器使用 limit_rate 配置了显示网络速率,则会显示,如果没有设置, 则显示 0$remote_port;# 客户端请求 Nginx 服务器时随机打开的端口,这是每个客户端自己的端口$remote_user;# 已经经过 Auth Basic Module 验证的用户名$request_body_file;# 做反向代理时发给后端服务器的本地资源的名称自定义变量Syntax: set $variable value;Default: —Context: server, location, if
五 nginx反向代理功能
反向代理: reverse proxy ,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。Nginx 除了可以在企业提供高性能的 web 服务之外,另外还可以将 nginx 本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是 Nginx 服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能
ngx_http_proxy_module: # 将客户端的请求以 http 协议转发至指定服务器进行处理ngx_http_upstream_module # 用于定义为 proxy_pass,fastcgi_pass,uwsgi_pass# 等指令引用的后端服务器分组ngx_stream_proxy_module: # 将客户端的请求以 tcp 协议转发至指定服务器处理ngx_http_fastcgi_module: # 将客户端对 php 的请求以 fastcgi 协议转发至指定服务器助理ngx_http_uwsgi_module: # 将客户端对 Python 的请求以 uwsgi 协议转发至指定服务器处理
5.1 http反向代理
proxy_pass; # 用来设置将客户端请求转发给的后端服务器的主机# 可以是主机名 ( 将转发至后端服务做为主机头首部 ) 、 IP 地址:端口的方式# 也可以代理到预先设置的主机群组,需要模块 ngx_http_upstream_module 支持服务器配置
客户机配置
并且客户端访问代理到后端服务器上![]()
5.2 nginx四层负载
5.3 实现fastcgi
为什么会有 FastCGI ?CGI 协议虽然解决了语言解析器和 Web Server 之间通讯的问题,但是它的效率很低,因为 Web Server每收到一个请求都会创建一个 CGI 进程, PHP 解析器都会解析 php.ini 文件,初始化环境,请求结束的时候再关闭进程,对于每一个创建的 CGI 进程都会执行这些操作,所以效率很低,而 FastCGI 是用来提高 CGI 性能的, FastCGI 每次处理完请求之后不会关闭掉进程,而是保留这个进程,使这个进程可以处理多个请求。这样的话每个请求都不用再重新创建一个进程了,大大提升了处理效率。什么是 PHP-FPM ?PHP-FPM(FastCGI Process Manager :FastCGI 进程管理器 ) 是一个实现了 Fastcgi 的程序,并且提供进程管理的功能。进程包括 master 进程和 worker 进程。 master 进程只有一个,负责监听端口,接受来自 web server的请求worker 进程一般会有多个,每个进程中会嵌入一个 PHP 解析器,进行 PHP 代码的处理。源码编译yum install -y bzip2 systemd-devel libxml2-devel sqlite-devellibpng-devel libcurl-devel oniguruma-devel然后上传php软件然后编译./configure --prefix=/usr/local/nginx --add-module=/root/echo-nginx-module-0.63 --add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module-0.33 --user=nginx --group=nginx --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-stream --with-stream_ssl_module --with-stream_realip_module --with-pcre --![]()
![]()
然后make && make install 安装,然后操作文件![]()
设置时区![]()
注释选项,启动系统![]()
启动
准备php测试界面
nginx 配置转发
重启nginx服务验证php测试界面
添加php环境![]()
5.4 php高速缓存
由于php访问效率有点差,所以需要memcache缓存来提升他的速度,类似于在内存那给他了一个小空间,让他缓存
解压 tar zxf memcache-8.2.tgz
安装
复制测试文件到nginx发布目录中
按要求修改
配置 php 加载 memcache 模块
yum install memcached -y 下载软件并且 配置
高速缓存
make && make install
配置nginx主目录,让其包含conf.d/*.conf