day2:nginx基础(未完待续)
一,http协议
概述
HTTP(Hypertext Transfer Protocol,超文本传输协议)是应用层协议,主要用于Web浏览器与Web服务器之间的通信。它基于请求/响应模型,客户端发送请求,服务器返回响应。HTTP是无状态的协议,即每个请求和响应都是独立的,不会记住之前的请求。
主要特点:
- 无连接:每次请求和响应都是独立的,服务器在完成一个请求后不会保留会话信息。
- 无状态:每个请求和响应都是独立的,服务器不会存储客户端的历史请求数据。
- 简单:HTTP协议本身设计简单,易于实现和理解。
抓包工具
抓包工具用于捕获和分析通过网络传输的数据包,常用于调试、分析HTTP协议的请求和响应。常见的抓包工具有:
- Wireshark:强大的网络协议分析工具,支持多种协议。
- Fiddler:常用于调试Web应用,提供流量捕获、修改和模拟功能。
- Charles:与Fiddler类似,常用于HTTP和HTTPS的调试。
- Burp Suite:网络安全测试工具,常用于Web应用安全的渗透测试。
请求方式与响应状态码
请求方式:
HTTP协议定义了几种不同的请求方式(又称HTTP动词):
- GET:请求资源,不带有请求体,常用于获取数据。
- POST:发送数据,常用于提交表单或上传文件。
- PUT:更新资源,通常用于替换资源。
- DELETE:删除资源。
- PATCH:部分更新资源。
- HEAD:与GET类似,但不返回内容,常用于检查资源是否存在。
- OPTIONS:询问服务器支持哪些HTTP方法。
HTTP请求格式
部分 | 内容 | 示例 |
---|---|---|
请求行 | 请求方法、请求目标、HTTP版本 | GET /index.html HTTP/1.1 |
请求头部 | 请求头包含多个键值对,传递附加信息 | Host: www.example.com |
User-Agent: Mozilla/5.0 ... | ||
Accept: text/html,application/xhtml+xml,... | ||
请求空行 | 就是一个空行用于分隔 | 就是空行 |
请求主体 | 请求数据,仅在POST 、PUT 等方法中出现 | username=admin&password=12345 |
HTTP响应格式
部分 | 内容 | 示例 |
---|---|---|
响应行 | HTTP版本、状态码、状态描述 | HTTP/1.1 200 OK |
响应头部 | 响应头包含多个键值对,传递服务器返回的附加信息 | Content-Type: text/html; charset=UTF-8 |
Content-Length: 1234 | ||
Server: Apache/2.4.41 (Unix) | ||
响应空行 | 就是一个空行用于分隔 | 就是空行 |
响应主体 | 返回的数据,具体内容根据Content-Type 类型来解析 | <html><head><title>Example</title></head><body><h1>Welcome to Example</h1></body></html> |
响应状态码:
HTTP响应码表示请求的处理结果,分为以下几类:
- 1xx:信息性响应,表示请求已被接受,正在处理。
- 2xx:成功响应,表示请求已成功处理。
- 200 OK:请求成功。
- 201 Created:资源已创建。
- 3xx:重定向,表示需要客户端进一步操作。
- 301 Moved Permanently:资源永久移动。
- 302 Found:资源临时移动。
- 4xx:客户端错误,表示请求有问题。
- 400 Bad Request:请求无效。
- 404 Not Found:资源未找到。
- 5xx:服务器错误,表示服务器处理请求时发生错误。
- 500 Internal Server Error:服务器内部错误。
- 502 Bad Gateway:网关错误。
会话技术
HTTP协议本身是无状态的,意味着每个请求是独立的,没有“记住”前一个请求。为了解决这个问题,可以使用一些会话技术:
- Cookies(客户端的会话技术):通过在浏览器中存储小文件,服务器可以在多个请求间“记住”客户端的状态。
- Session(服务端的会话技术):服务器端通过Session来存储状态信息,客户端通过Session ID(通常存储在Cookie中)来识别会话。
- Token(如JWT):通常用于现代Web应用,客户端通过令牌与服务器进行身份验证和会话管理。
二,Nginx的概述与安装
概述
Nginx(发音为“engine-x”)是一款高性能的Web服务器和反向代理服务器,同时也可以作为负载均衡器、HTTP缓存、邮件代理等使用。它由俄罗斯的软件工程师Igor Sysoev开发,并于2004年发布。由于其高效的性能、低资源消耗和扩展性,Nginx已经成为全球最流行的Web服务器之一。
特点
- 高并发处理能力:Nginx采用事件驱动(asynchronous)模型,可以高效地处理成千上万的并发连接。
- 反向代理功能:Nginx可以充当反向代理,支持负载均衡、缓存和安全访问控制等功能。
- 负载均衡:支持多种负载均衡策略,包括轮询、最少连接、IP哈希等。
- 低内存消耗:相比传统的Web服务器,Nginx的内存消耗较低,可以处理更多的并发请求。
- 模块化设计:Nginx的模块化设计使其功能易于扩展,支持HTTP、邮件、流媒体等多种协议。
- 支持静态文件处理:Nginx非常擅长静态文件的处理和分发,能有效减少Web服务器的负担。
原理
Nginx是基于事件驱动模型的Web服务器。在接收到请求后,它并不会为每个连接创建新的线程或进程,而是通过一个或多个工作进程共享连接池并通过事件循环的方式处理请求。具体原理如下:
- 事件驱动:Nginx的主进程和工作进程相互协作,通过事件通知和回调来管理并发连接。
- 异步处理:每个请求由一个工作进程处理,工作进程可以异步执行多个请求的处理,从而避免了传统Web服务器中每个请求都独占一个线程的性能瓶颈。
- 进程模型:Nginx的主进程负责管理工作进程,工作进程负责实际处理请求。主进程通常只负责监控和管理,工作进程处理客户端请求。
安装
Nginx的安装有两种主要方式:通过包管理器安装和源代码编译安装。
通过包管理器安装
在CentOS 7上安装Nginx:
更新系统:
sudo yum update -y
安装EPEL仓库(如果没有的话):
sudo yum install epel-release -y
安装Nginx:
sudo yum install nginx -y
启动并设置Nginx开机启动:
sudo systemctl start nginx
sudo systemctl enable nginx
访问服务器IP地址进行测试,应该能够看到Nginx的默认欢迎页面。
编译安装
下载Nginx源代码:
wget http://nginx.org/download/nginx-1.21.0.tar.gz
解压源代码包:
tar -zxvf nginx-1.21.0.tar.gz
安装依赖(以CentOS为例):
sudo yum install gcc pcre-devel zlib-devel openssl-devel -y
进入Nginx源代码目录,配置编译选项:
cd nginx-1.21.0
./configure --prefix=/usr/local/nginx
编译并安装:
make
sudo make install
启动Nginx:
sudo /usr/local/nginx/sbin/nginx
编译参数(如果已经安装的可以用nginx -V)
在编译Nginx时,./configure
命令提供了一些选项,常用的编译参数有:
--prefix=/etc/nginx {含义:指定 Nginx 的安装目录}
--sbin-path=/usr/sbin/nginx {含义:定义 Nginx 二进制可执行文件的路径}
--modules-path=/usr/lib64/nginx/modules {含义:设定 Nginx 动态模块的存储路径}
--conf-path=/etc/nginx/nginx.conf {含义:设置 Nginx 主配置文件的路径}
--error-log-path=/var/log/nginx/error.log {含义:指定错误日志文件的路径}
--http-log-path=/var/log/nginx/access.log {含义:设置 HTTP 访问日志文件的路径}
--pid-path=/var/run/nginx.pid {含义:定义存放 Nginx 进程 ID 文件的路径}
--user=nginx {含义:指定运行 Nginx 的用户}
--group=nginx {含义:指定运行 Nginx 的用户组}
--with-http_gunzip_module {含义:启用 HTTP 解压模块,允许服务器解压内容}
--with-http_ssl_module {含义:启用 SSL 模块,支持 HTTPS 连接}
目录介绍(rpm -ql nginx,如果是rpm -qc 名字就是查看配置文件位置)————yum版
--/etc/ {# 系统配置文件目录}
----logrotate.d/ {# 日志轮转配置目录}
------nginx {# Nginx 日志轮转配置文件}
----nginx/ {# Nginx 的主要配置目录}
------fastcgi.conf {# FastCGI 配置文件}
------fastcgi.conf.default {# FastCGI 默认配置文件}
------fastcgi_params {# FastCGI 参数文件}
------fastcgi_params.default {# FastCGI 参数默认文件}
------koi-utf {# 字符集转换文件}
------koi-win {# 字符集转换文件}
------mime.types {# MIME 类型文件}
------mime.types.default {# MIME 类型默认文件}
------nginx.conf {# Nginx 主配置文件}
------nginx.conf.default {# Nginx 默认配置文件}
------scgi_params {# SCGI 参数文件}
------scgi_params.default {# SCGI 参数默认文件}
------uwsgi_params {# uWSGI 参数文件}
------uwsgi_params.default {# uWSGI 参数默认文件}
------win-utf {# 字符集转换文件}
--/usr/ {# 用户程序和文件的目录}
----bin/ {# 系统二进制文件目录}
------nginx-upgrade {# 用于升级 Nginx 的工具}
----lib/systemd/system/ {# Systemd 服务文件目录}
------nginx.service {# Nginx 的 systemd 服务文件}
----lib64/nginx/ {# 64位系统下的 Nginx 目录}
------modules {# 动态模块目录}
----sbin/ {# 系统管理二进制文件目录}
------nginx {# Nginx 主程序文件}
----share/ {# 共享文件目录}
------doc/nginx-1.20.1/ {# Nginx 文档目录}
--------CHANGES {# 版本变更日志}
--------README {# 自述文件}
--------README.dynamic {# 关于动态模块的自述文件}
--------UPGRADE-NOTES-1.6-to-1.10 {# 升级注意事项文档}
------licenses/nginx-1.20.1/ {# Nginx 许可证目录}
--------LICENSE {# Nginx 许可证文件}
------man/ {# 手册页目录}
--------man3/nginx.3pm.gz {# Nginx Perl 模块的手册页}
--------man8/nginx-upgrade.8.gz {# nginx-upgrade 工具的手册页}
--------man8/nginx.8.gz {# Nginx 手册页}
------nginx/ {# Nginx 共享文件目录}
--------html/ {# 默认 HTML 文件目录}
----------404.html {# 默认 404 错误页面}
----------50x.html {# 默认 50x 错误页面}
----------en-US {# 英文-US 目录,可能包含本地化内容}
----------icons/ {# 图标目录}
------------poweredby.png {# Nginx 的 "powered by" 图标}
----------img/ {# 可能包含额外的图像文件}
----------index.html {# 默认主页面}
----------nginx-logo.png {# Nginx 标志}
----------poweredby.png {# Nginx 的 "powered by" 图标}
--------modules/ {# Nginx 模块目录}
------vim/vimfiles/ {# VIM 配置文件目录}
--------ftdetect/nginx.vim {# 检测 Nginx 配置文件类型的 VIM 脚本}
--------ftplugin/nginx.vim {# 针对 Nginx 配置文件的 VIM 插件}
--------indent/nginx.vim {# Nginx 配置文件缩进的 VIM 脚本}
--------syntax/nginx.vim {# Nginx 配置文件语法高亮的 VIM 脚本}
--/var/ {# 变量数据目录}
----lib/nginx/ {# Nginx 运行时的临时文件目录}
------tmp {# 临时文件目录}
----log/nginx/ {# Nginx 日志目录}
------access.log {# Nginx 访问日志文件}
------error.log {# Nginx 错误日志文件}
--/etc/ {# 系统配置文件目录}
----logrotate.d/ {# 日志轮转配置目录}
----nginx/ {# Nginx 的主要配置目录}
--/usr/ {# 用户程序和文件的目录}
----bin/ {# 系统二进制文件目录}
----lib/systemd/system/ {# Systemd 服务文件目录}
----lib64/nginx/ {# 64位系统下的 Nginx 目录}
----sbin/ {# 系统管理二进制文件目录}
----share/ {# 共享文件目录}
------doc/nginx-1.20.1/ {# Nginx 文档目录}
------licenses/nginx-1.20.1/ {# Nginx 许可证目录}
------man/ {# 手册页目录}
------nginx/ {# Nginx 共享文件目录}
--------html/ {# 默认 HTML 文件目录}
----------icons/ {# 图标目录}
----------img/ {# 可能包含额外的图像文件}
--------modules/ {# Nginx 模块目录}
------vim/vimfiles/ {# VIM 配置文件目录}
--/var/ {# 变量数据目录}
----lib/nginx/ {# Nginx 运行时的临时文件目录}
----log/nginx/ {# Nginx 日志目录}
配置文件介绍(了解为主)
Nginx的配置文件(默认路径为/etc/nginx/nginx.conf
)是Nginx的核心,包含了所有的配置设置。配置文件结构分为以下几部分:
-
全局设置:设置进程数、日志路径等。通常在文件顶部。
-
user nginx; # 设置Nginx进程的运行用户(通常是www-data或nginx) worker_processes 1; # 设置工作进程数。通常为CPU核心数,和物理设备一致,也可以用auto自动 pid /var/run/nginx.pid; # 指定Nginx的进程ID文件 error_log /var/log/nginx/error.log warn; # 错误日志路径及日志级别
user
: 设置运行 Nginx 的操作系统用户,一般用nginx
或www-data
。worker_processes
: 设置 Nginx 的工作进程数量,通常设置为 CPU 核数。pid
: 指定存储 Nginx 主进程 PID 的文件路径。error_log
: 设置 Nginx 的错误日志路径和日志级别。常见日志级别包括debug
,info
,warn
,error
,crit
等。(默认就好)
events
块: Nginx 配置文件中的一个全局块,它包含一些与 Nginx 事件处理机制相关的指令。-
events {worker_connections 1024; # 每个工作进程最多处理的连接数use epoll; # 选择使用的事件模型#multi_accept on; # 启用每个工作进程一次性接受多个连接#accept_mutex_delay 500ms; # 设置互斥锁的延迟时间为 500 毫秒 }worker_connections 指定了每个工作进程能够处理的最大连接数。Nginx 是事件驱动模型,多个连接可以由一个工作进程处理,而不需要创建多个线程。此指令决定了每个工作进程的最大连接数。默认值:1024建议设置:根据服务器的负载能力和并发连接的数量来设置。如果网站需要处理大量的并发请求,可以增大此值。use 指令用来指定事件模型,决定了 Nginx 如何与操作系统交互来处理事件。不同的操作系统有不同的事件驱动模型,Nginx 允许根据操作系统选择合适的事件处理机制。常见的事件模型有:select(默认的、较旧的事件模型)是较旧的模型,性能相对较差,通常只在某些旧版本的系统上使用。poll (是较旧的模型,性能相对较差,通常只在某些旧版本的系统上使用。)epoll(Linux 中推荐使用的事件模型,具有更好的性能)kqueue(macOS 和 BSD 系统使用的事件模型)是 macOS 和一些 BSD 系统上用于事件通知的模型。rtsig(基于实时信号的事件处理模型) -----------------------------------下面不常用------------------------------------------- multi_accept 指令用于控制每个工作进程接受多个连接的方式。如果启用此选项,每个工作进程可以一次性接受多个连接,而不仅仅是一个连接。multi_accept on:当有多个连接等待处理时,每个工作进程会一次性接受所有的连接,而不是一个一个地接收。适用于高并发场景。multi_accept off:默认情况下,每个工作进程只会接受一个连接,然后再去接受下一个连接。accept_mutex 指令用于控制是否启用连接接收的互斥锁。在高并发场景下,多个工作进程可能会同时试图接收连接,启用互斥锁可以避免多个进程争抢同一个连接。accept_mutex on:启用互斥锁,避免多个进程同时接收连接,通常在多核 CPU 环境下可以提高性能。accept_mutex off:禁用互斥锁,多个进程可以并发接收连接。accept_mutex_delay 指令设置了工作进程在等待接收连接时的延迟时间。当启用了互斥锁时,如果一个工作进程正在接收连接,其他进程就需要等待一段时间,这个延迟时间可以通过该指令调整。默认值:500ms如果你的服务器上有很多 CPU 核心,或者你遇到多进程竞争连接的问题,调整该值可能有助于性能优化。
-
-
http块:定义HTTP服务器的设置,包括反向代理、负载均衡、虚拟主机、日志等。
-
HTTP 部分是最常见的配置区域,定义了与 HTTP 协议相关的所有设置。通常包括静态文件服务、虚拟主机、代理设置、负载均衡等。
-
http {include mime.types; # 引入 mime 类型文件(规定了哪些文件类型nginx可以认识,默认不改)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 /var/log/nginx/access.log main; # 访问日志路径,用main格式sendfile on; # 启用高效的文件发送tcp_nopush on; # 禁用TCP推送tcp_nodelay on; # 禁用TCP延迟keepalive_timeout 65; # 保持连接的超时时间include /etc/nginx/conf.d/*.conf; # 引入额外的配置文件(一个文件管理了一个网站) }
include mime.types
: 这个指令引入了一个文件,其中包含了多种文件类型的 MIME 类型映射。log_format
: 定义访问日志的格式。access_log
: 设置访问日志的路径和使用的日志格式。sendfile
: 启用高效的文件传输(不通过内核进行复制)。keepalive_timeout
: 设置持久连接(HTTP Keep-Alive)的超时时间。
- Server 部分:Server 块配置每个虚拟主机的详细设置。在这里可以配置监听端口、域名、根目录等,通常每个网站对应一个
server
块。-
server {listen 80; # 监听端口80(HTTP)server_name www.example.com; # 设置服务器的域名root /usr/share/nginx/html; # 设置Web根目录location / { # 配置根路径的请求处理index index.html index.htm; # 设置默认的首页文件}error_page 404 /404.html; # 设置404错误页面location = /404.html { # 当404错误发生时,使用此配置root /usr/share/nginx/html;internal;} }
listen
: 设置 Nginx 监听的端口。server_name
: 配置虚拟主机的域名(也可以是 IP 地址)。root
: 设置Web根目录,即静态文件存放的位置。location
: 配置 URL 路径的处理规则,支持正则匹配。
- Location 部分(location block):Location 块用于定义如何处理特定 URL 路径的请求。可以针对路径进行详细配置,例如静态文件服务、代理请求、重写等。
-
location /images/ {root /usr/share/nginx/html; # 为/images路径指定一个根目录autoindex on; # 启用自动目录列表显示 }location /api/ {proxy_pass http://127.0.0.1:8080; # 将请求代理到本地的其他服务proxy_set_header Host $host; # 设置代理请求的 Host 头 }location / {try_files $uri $uri/ =404; # 处理请求的静态文件,如果找不到则返回404 }
location /images/
: 匹配所有/images/
路径的请求,并为其配置单独的根目录。proxy_pass
: 用于设置反向代理,将请求转发到后端服务器。try_files
: 用于尝试访问多个文件路径,如果没有找到文件则返回指定的错误页面。
-
- 重定向与错误页面配置
-
server {listen 80;server_name www.oldsite.com;return 301 http://www.newsite.com$request_uri; # 将所有请求重定向到新站点 }server {listen 80;server_name www.example.com;error_page 500 502 503 504 /50x.html; # 定义常见错误的自定义页面location = /50x.html {root /usr/share/nginx/html;} }
return 301
: 这用于将请求永久重定向到新的 URL(如更新了站点地址)。error_page
: 配置 Nginx 处理特定错误码时的行为,常用于设置自定义错误页面。
-
-
-
/etc/nginx/conf.d/default.conf这个是默认文件,没有也没事,有些不会自动创建,我们看完了nginx的配置,来看看具体的关于网站的配置文件吧。
# 这个server块是Nginx默认服务器的配置,它会处理所有没有匹配其他server块的请求。server {# listen指令指定Nginx监听的端口。此处监听80端口,并标记为默认服务器。listen 80 default_server; # 监听80端口,标记为默认服务器listen [::]:80 default_server; # 支持IPv6协议,监听80端口,标记为默认服务器# server_name指定匹配该server块的域名。此处使用'_'表示匹配所有未匹配的请求。server_name _; # 匹配所有未指定server_name的请求,通常是默认主机# root指令指定网站的根目录。Nginx会从这个目录加载文件。root /usr/share/nginx/html; # 设置网页的根目录# index指令指定默认的首页文件。Nginx会优先查找这些文件作为首页。index index.html index.htm; # 设置默认的首页文件为index.html或index.htm# location块用于定义路径匹配规则。此处匹配根路径,并设置静态文件的返回方式。location / {try_files $uri $uri/ =404; # 如果请求的文件不存在,则返回404错误}# 定义404错误页面的路径。如果用户请求的页面不存在,将返回404页面。error_page 404 /404.html; # 404错误页面的URLlocation = /404.html {root /usr/share/nginx/html; # 错误页面的文件目录}# 定义500, 502, 503, 504错误页面的路径。当发生这些服务器错误时,Nginx会返回50x.html页面。error_page 500 502 503 504 /50x.html; # 其他服务器错误的自定义页面location = /50x.html {root /usr/share/nginx/html; # 错误页面的文件目录}
}
启动参数
- nginx 【选项】
- -h:查看帮助
- -t:语法检查
- -s start|stop|reload|quit(阻止任务进入,等待当前任务结束完停止):方式指定信号量
- -v:查看版本
- -e:
三,基本配置
需求:自定义一个虚拟主机(监听80端口,页面资源访问/data/user,主机名设置为user.woniu.cn)
思路:
- 1./etc/nginx/conf.d/default.conf复制出来一个配置文件
- 2.定义一个存放页面文件的目录
- 3.修改配置文件(主机名/页面文件路径)
- 4,在真实机中配置hosts
- 5.启动nginx
- 6.测试访问
四,nginx日志(/var/log/nginx/)
概述
Nginx 的日志系统分为 访问日志 和 错误日志 两类,分别记录不同类型的信息。日志配置可以在 Nginx 配置文件中进行设置,通过日志文件可以追踪和分析 HTTP 请求、响应、错误等。
Nginx主要记录三个信息:1,Nginx服务的启动与停止。2,记录客户端访问Nginx服务器的详细信息。3,Nginx运行的时候出现的错误或者是失败信息。
主要日志类型
- 访问日志(Access Log):记录每个请求的详细信息,包括客户端信息、请求时间、请求方法、状态码等。
- 错误日志(Error Log):记录服务器在运行时遇到的错误信息,如配置错误、请求失败、服务器问题等。
日志类型
访问日志(Access Log)
访问日志记录了客户端的所有请求。每个请求会生成一行日志,记录客户端的 IP 地址、请求的 URL、请求时间、响应状态码、响应时间等信息。
访问日志的位置: 通常访问日志存储在 /var/log/nginx/access.log
文件中。
$remote_addr: 客户端 IP 地址。
$remote_user: 认证的用户名(如果有的话)。
$time_local: 本地时间(格式:[day/month/year:hour:minute:second zone])。
$request: 请求的原始 HTTP 请求字符串(例如 GET /index.html HTTP/1.1)。
$status: HTTP 响应状态码(例如 200、404)。
$body_bytes_sent: 发送给客户端的字节数(不包括响应头)。
$http_referer: 请求的来源(即引导用户到当前页面的前一个页面的 URL)。
$http_user_agent: 客户端的浏览器信息。
$http_x_forwarded_for: X-Forwarded-For 头部信息(常用于代理请求中记录真实的客户端 IP)。
错误日志(Error Log)
错误日志记录了 Nginx 在运行期间遇到的错误信息。它通常用于排查故障和查看 Nginx 的运行状况。
错误日志的位置: 通常错误日志存储在 /var/log/nginx/error.log
文件中。
• debug: 记录所有调试信息。
• info: 记录普通信息。
• warn: 记录警告信息。
• error: 记录错误信息。
• crit: 记录严重错误信息。
warn: 错误日志的日志级别,通常有 debug、info、notice、warn、error 和 crit 等。
日志配置
Nginx 的日志配置通常在 nginx.conf
文件中进行设置。日志配置的主要目的是指定日志文件的位置、格式、日志级别等。
访问日志配置
在 http
或 server
块中配置访问日志:(解释上面也有)
http {access_log /var/log/nginx/access.log main;
#如果参数是off就是不要生成日志
}
错误日志配置
在 http
或 server
块中配置错误日志:
http {error_log /var/log/nginx/error.log warn;
}