文章目录
1. nginx 简介
nginx性能比apache强,体现 在io模型方面
Pv:
UV : 不同浏览器是不同的UV
GET 获取
POST 上传
HEAT 只看头
访问网站的流程
1.dns解析
2.cdn
3.tcp
4.web服务器 处理
建立连接
接收请求
处理请求 GET POST等
获取资源
构建响应报文
发送响应报文
记录日志
5) 浏览器接收响应报文,进行页面渲染
http请求报文
http响应报文
nginx如何优化?
要优化 Nginx 的性能和效率,可以考虑以下几个方面的优化措施:
调整工作进程和连接数:
- 调整 Nginx 的工作进程数,根据服务器的 CPU 核心数和负载情况进行合理的设置。
- 调整 Nginx 的最大连接数限制,确保与实际需求相匹配。
合理配置缓存:
- 针对静态资源(如图片、样式表、JavaScript 等),使用 Nginx 的内置缓存来加速访问。
- 配置适当的缓存时间和缓存规则,以减少对后端服务器的请求。
优化 SSL/TLS:
- 使用更高效的 SSL/TLS 版本,并配置适当的密码套件,以确保安全性和性能的折中。
- 考虑使用缓存 SSL/TLS 会话以减少握手的开销。
开启 Gzip 压缩:
- 配置 Nginx 开启 Gzip 压缩,减小传输的数据量,提高响应速度。
- 可以根据不同的文件类型选择合适的压缩级别和压缩算法。
负载均衡和反向代理:
- 使用 Nginx 的负载均衡功能,将请求分发到多个后端服务器,提高系统的吞吐量和可用性。
- 使用 Nginx 的反向代理功能,将请求代理到不同的后端服务器,实现请求的路由和负载均衡。
配置文件优化:
- 优化 Nginx 配置文件,确保配置项的正确性和一致性。
- 避免不必要的模块加载,只加载需要的模块和功能。
- 使用 include 文件来组织和管理配置项,提高可维护性。
监测和日志优化:
- 启用 Nginx 的访问日志和错误日志,进行监测和故障排查。
- 使用日志切割来管理日志文件的大小和数量,避免过大的日志文件影响性能。
需要注意的是,优化策略和步骤可能因环境和实际需求而有所不同。建议根据实际情况进行针对性的优化,并进行性能测试和监测,以评估优化效果和调整进一步优化的策略。
- 隐藏版本 绑定cpu
请求的流程
描述: 1.客户发起情况到服务器网卡;
2.服务器网卡接受到请求后转交给内核处理;
3.内核根据请求对应的套接字,将请求交给工作在用户空间的Web服务器进程
4.Web服务器进程根据用户请求,向内核进行系统调用,申请获取相应资源(如index.html)
5.内核发现web服务器进程请求的是一个存放在硬盘上的资源,因此通过驱动程序连接磁盘
6.内核调度磁盘,获取需要的资源
7.内核将资源存放在自己的缓冲区中,并通知Web服务器进程
8.Web服务器进程通过系统调用取得资源,并将其复制到进程自己的缓冲区中
9.Web服务器进程形成响应,通过系统调用再次发给内核以响应用户请求
10.内核将响应发送至网卡
11.网卡发送响应给用户
这就是整个web请求的全过程。这个过程涉及到2个IO,一个就是客户端请求的网络I/O,另一个就是Web服务器请求资源的磁盘I/O
服务器发送请求>到达服务器网卡 缓冲区》
一个常见的 Web 请求过程可以分为以下几个步骤:
用户在浏览器中输入 URL(统一资源定位符),并按下回车键。
浏览器解析 URL,提取出主机名(如:www.example.com)和资源路径(如:/index.html)。
浏览器首先会查询本地缓存,看是否有之前请求过的相同资源的副本。如果有且未过期,浏览器会直接从缓存中获取资源,跳过后续步骤。
如果缓存中没有相应的资源或资源已过期,浏览器会通过 DNS(域名系统)解析获取主机的 IP 地址。DNS 解析将域名转换为 IP 地址,以便浏览器能够与服务器建立连接。
浏览器使用获取到的 IP 地址与服务器建立 TCP(传输控制协议)连接。TCP 提供可靠的、面向连接的数据传输。
一旦建立 TCP 连接,浏览器会发送 HTTP(超文本传输协议)请求到服务器。请求中包含请求方法(如 GET、POST)、请求头(包含一些元数据)、请求路径等信息。
服务器接收到请求后,根据请求路径找到对应的资源,并进行处理。这可能涉及到业务逻辑的处理、数据库查询等。
服务器将处理完的资源以 HTTP 响应的形式返回给浏览器。响应中包含状态码(用于表示请求的成功或失败)、响应头(包含一些元数据)、响应体(包含实际的响应内容)等信息。
浏览器接收到响应后,会根据响应的内容类型进行相应的处理。比如,如果响应是 HTML 页面,浏览器会解析 HTML 并渲染页面;如果响应是图片,浏览器会显示该图片。
浏览器将解析完的资源进行展示,用户可以在浏览器中看到相应的内容。同时,浏览器还会将响应内容保存到缓存中,以便下次请求同样的资源时可以直接从缓存中获取,提高性能。
以上是一个常规的 Web 请求过程,不同的应用场景和技术可能会有所不同,但基本的流程是相似的。
HTTP(超文本传输协议)中的首部字段是用于在请求和响应消息中传递元数据和其他相关信息的一种机制。以下是HTTP中常见的首部字段:
通用首部字段:
- Cache-Control:控制缓存行为。
- Connection:控制连接的行为。
- Date:日期和时间。
- Upgrade:要求服务器升级到不同的协议。
- Via:中间代理服务器的信息。
请求首部字段:
- Accept:指定客户端可以接受的内容类型。
- Accept-Encoding:指定客户端可以接受的内容编码方式。
- Content-Type:请求中发送的实体的媒体类型。
- User-Agent:客户端的用户代理标识。
响应首部字段:
- Content-Length:返回的实体主体的长度(以字节为单位)。
- Content-Encoding:指定响应实体使用的编码方式。
- Content-Type:响应实体的媒体类型。
- Server:服务器的软件名称和版本号。
- Set-Cookie:设置一个或多个Cookie。
实体首部字段:
- Content-Length:实体主体的长度(以字节为单位)。
- Content-Encoding:实体主体的编码方式。
- Content-Type:实体主体的媒体类型。
还有许多其他的首部字段,用于传递不同的信息。每个首部字段都有其特定的作用和语义,用于帮助客户端和服务器之间进行正确的通信和处理请求或响应。
curl -v www.baidu.com
< HTTP/1.1 302 Moved Temporarily #302 临时重定向
< Server: openresty
< Date: Fri, 08 Sep 2023 14:10:10 GMT #表示服务器生成响应的日期和时间,以协调世界时(UTC)表示。
< Content-Type: text/html #响应主体的媒体类型,这里的值是 “text/html”,表示返回的内容是 HTML 文档
< Content-Length: 142 #表示响应主体的长度,以字节为单位,这里的值是 142。
< Connection: keep-alive #指示服务器是否要求客户端保持持久连接,在此示例中,服务器要求客户端维持持久连接。
< Location: https://www.oppo.com/
< Request-Id: 64fb2b421cfe0cfcf891adbc83ce4faa #用于标识请求的唯一编号或标识符
< X-IP-Source: 4cb2b356b598ca96d5297afa558bd372 #指示客户端的 IP 地址或来源
< Access-Control-Allow-Origin: * #用于指示服务器所允许的跨域请求的来源。在这个示例中,服务器允许所有来源的跨域请求。
< strict-transport-security: max-age=31536000 #用于指示服务器所允许的跨域请求的来源。在这个示例中,服务器允许所有来源的跨域请求。
网络IO
同步:你去问
异步:主动通知你
阻塞:影响干别的事
异步: 不影响
I/O 多路复用
windows不支持epoll
nginx为什么性能好?
epoll模型,MMAP
支持0复制
Nginx之所以具有良好的性能,主要有以下几个原因:
异步非阻塞模型:Nginx采用了事件驱动的异步非阻塞架构,通过使用少量的线程即可处理大量并发连接。这种设计方式使得Nginx在高并发场景下能够高效地处理请求,提高了系统的吞吐量。
轻量级:Nginx是一个轻量级的服务器软件,具有很小的内存占用和CPU消耗。它的代码精简,功能模块化,只包含了核心的功能,减少了不必要的资源开销,提高了性能。
出色的内存管理:Nginx使用了高效的内存管理机制,能够快速分配和释放内存,有效地降低了内存碎片化的问题,并提高了内存的利用率。
高度可定制性:Nginx提供了丰富的配置选项,可以根据具体需求进行灵活的配置和定制。用户可以根据自己的需求选择合适的模块和功能,避免了不必要的开销,提高了性能。
综上所述,Nginx通过其异步非阻塞的架构、轻量级设计、高效的内存管理和可定制性等特点,使得其具有优秀的性能表现。
nginx缓存功能?
nginx 有一个master进程,其他是work进程,master主进程指派工作,拉起work进程配【
2. nginx安装
编译安装
#yum -y install gcc pcre-devel openssl-devel zlib-devel make
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -xf nginx-1.24.0.tar.gz
cd nginx-1.24.0/
useradd -s /sbin/nologin nginx
cd /apps/nginx-1.24.0
./configure --help
./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
make && make install
chown -R nginx.nginx /apps/nginx
nginx没有线程
nginx 平滑升级
yum安装升级
模拟用户访问:
dd if=/dev/zero of=1.img bs=1M count=100
wget --limit-rate=100 http://192.168.1.150/1.img
nginx1.18 ->nginx 1.24
1.nginx -V 查看参数
root@ubuntu20:/apps/nginx-1.24.0# nginx -V
nginx version: nginx/1.18.0 (Ubuntu)
built with OpenSSL 1.1.1f 31 Mar 2020
TLS SNI support enabled
configure arguments: --with-cc-opt=‘-g -O2 -fdebug-prefix-map=/build/nginx-lUTckl/nginx-1.18.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2’ --with-ld-opt=‘-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC’ --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module
2.下载包解压,
./configure 带上nginx -V 查询到的参数
uubuntu20.04./configure: error: the HTTP XSLT module requires the libxml2/libxslt libraries. You can either do not enable the module or install the libraries.
安装sudo apt update && sudo apt install libxml2-dev libxslt-dev
nginx ./configure: error: the HTTP image filter module requires the GD library. You can either do not enable the module or install the libraries.
安装 sudo apt update sudo apt install libgd-dev
3.编译:
make
生成的二进制文件在objs目录
root@ubuntu20:/apps/nginx-1.24.0/objs# ll nginx
-rwxr-xr-x 1 root root 8083408 Sep 9 12:33 nginx*
4.备份的二进制文件
root@ubuntu20:/apps/nginx-1.24.0/objs# which nginx
/usr/sbin/nginx
cp /usr/sbin/nginx{,.bak}
untu20:/usr/sbin# cd
root@ubuntu20:~# \cp /apps/nginx-1.24.0/objs/nginx /usr/sbin/nginx
cp: cannot create regular file ‘/usr/sbin/nginx’: Text file busy
强制替换root@ubuntu20:~# \cp -f /apps/nginx-1.24.0/objs/nginx /usr/sbin/nginx
5.测试升级的nginx是否兼容,出现ok才能升级,我这里是测试
root@ubuntu20:~# /usr/sbin/nginx -t
nginx: [emerg] module “/usr/share/nginx/modules/ngx_http_image_filter_module.so” version 1018000 instead of 1024000 in /etc/nginx/modules-enabled/50-mod-http-image-filter.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed
这个原因是因为以前nginx modules 和现在官方的modules 不匹配需要我们先将旧的modules 卸载安装新版官方的modules
安装官方源
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
导入密钥
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
配置稳定版本的源
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
优先选择nginx官方的包。而不是系统源的包
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
更新
sudo apt update
查看源中所有nginx的模块,可用看到之前是libnginx-mod .1.24版本是nginx-mod
apt remove lib-nginx-mod* #卸载旧的nginx模块
apt install nginx-mod* #安装1.24版本的nginx模块
/usr/sbin/nginx -t 测试ok
root@ubuntu20:~# //usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
升级后访问zabbix 网站 502 Bad Gateway
可能是nginx 版本和zabbix不匹配的原因
源码安装平滑升级
升级要经过充分的测试
nginx版本与业务是否匹配
编译:注意不要make install
备份nginx
拷贝新的nginx文件
cp -f /apps/nginx-1.25.2/objs/nginx /apps/nginx/sbin/
测试
[root@rocky8 logs]# /apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
nginx -t 测试通过后,发送usr2信号
kill -USR2 cat /apps/nginx/logs/nginx.pid
#会生成新进程,旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx
[root@rocky8 logs]# cat /apps/nginx/logs/nginx.pid.oldbin
25094
[root@rocky8 logs]# cat /apps/nginx/logs/nginx.pid
25329
向旧的进程发送which信号, 它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理
kill -WINCH cat /apps/nginx/logs/nginx.pid.oldbin
退出老的进程
kill -QUIT cat /apps/nginx/logs/nginx.pid.oldbin
项目标题: nginx平滑升级
1.项目背景(版本过旧,添加新模块)
2.项目目标
3.项目实现过程(原理、步骤)
4.项目结果
nginx配置文件
worker_processes auto; 自动匹配cpu核数
root@server01:/etc/nginx# ps axo pid,cmd,psr |grep nginx
worker_cpu_affinity 0001 0010; 绑定cpu #防止缓存失效#将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
nginx 的master 进程是root运行,work进程是普通用户运行, 因为nginx端口80是特权端口小于1023,只能用root运行
worker_connections 2048; #所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例
如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级
别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致,
这是一些常见的 Nginx 配置指令,用于设置代理请求的头部信息。
proxy_set_header Host $http_host;
设置代理请求的 Host 头部为客户端的请求 Host 头部值。proxy_set_header X-Real-IP $remote_addr;
设置代理请求的 X-Real-IP 头部为客户端的真实 IP 地址。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
设置代理请求的 X-Forwarded-For 头部,将客户端的 IP 地址追加到该头部中,以表明客户端的真实 IP 地址。proxy_set_header X-Forwarded-Proto $scheme;
设置代理请求的 X-Forwarded-Proto 头部为请求的协议(HTTP 或 HTTPS)。
这些配置指令通常用于反向代理服务器的配置,用于将客户端请求转发给后端服务器,并在请求头部中传递一些关键的信息。
好奇,开心
sendfile on; 提示性能
#tcp_nopush on; #在开启了sendfile的情况下,合并请求后统一发送给客户端,必须开启sendfile,但会延迟
-
server_tokens off; 不显示版本
- 包含
nginx虚拟主机
vi /conf/nginx.conf
include /apps/nginx/conf/conf.d/*; #添加
root@server01:/apps/nginx/conf/conf.d# cat www.luohw.org
server {
listen 8889;
server_name www.luohw.org;
root /apps/nginx/html/pc;
}
root@server01:/apps/nginx/conf/conf.d# cat m.luohw.org
server {
listen 8889;
server_name m.luohw.org;
root /apps/nginx/html/mobile;
}
配置文件在前的优先级高
server 块
alias和root的区别?
root是定义根的
location /about { #相当于访问/opt/pc/aaa/
alias /opt/pc/aaa/;
}
location /about { #/opt/pc/aaa/about/
root /opt/pc/aaa/;
}
server {
listen 8889;
server_name www.luohw.org;
location / {
root /apps/nginx/html/pc;
}
location /about {
root /opt/pc/aaa/;
}
curl www.luohw.org:8889/about222/ 访问 /opt/pc/aaa/about222/index.html
location /about/ {
root /opt/pc/aaa/;
}
curl www.luohw.org:8889/about222/ 访问/apps/nginx/html/pc/about222/index.html
location ^~ /about/ { 以什么开头
^~ 包含
^*
~* 包含,不区分大小写
#匹配优先级从高到低:
=, ^~, /*, 不带符号
配置密码验证访问
htpasswd -cb /etc/nginx/conf.d/.nginx-user luo 123456
auth_basic "login password";
auth_basic_user_file /etc/nginx/conf.d/.nginx-user;
指定密码访问
curl -I -u luo:123456 zabbix.luo.com
自定义错误页面
#访问不存在会报404,就会访问 /data/html/40x.html
error_page 404 /40x.html;
location = /40x.html {
root /data/html/ ;
}
检测文件是否存在
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/index.html $uri/html /index.html; #访问url找不到就找$uri/index.html,最后找index.html
}
GET / HTTP/1.1
HOST: 192.168.1.150
下载文件配置
location /down {
autoindex on;#自动索引功能
alias /apps/nginx/html/mobile/luo;
# autoindex_exact_size off;#计算文件确切大小(单位bytes),此为默认值,off只显示大概大小(单位kb、mb、gb)
autoindex_localtime on;
#上传一个包到nginx,太大会报413
root@server01:/apps/nginx/conf/conf.d# curl -T /root/mysql-8.0.33-linux-glibc2.28-x86_64.tar.gz http://120.77.146.92:8889/down/
413 Request Entity Too Large
上传文件太大
修改参数
client_max_body_size 1m; #设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误
高价值展示生活
安全感建立
具备信息交换
兴趣爱好,工作,职业
生活状态
T / HTTP/1.1
HOST: 192.168.1.150
# 下载文件配置
location /down {
autoindex on;#自动索引功能
alias /apps/nginx/html/mobile/luo;
# autoindex_exact_size off;#计算文件确切大小(单位bytes),此为默认值,off只显示大概大小(单位kb、mb、gb)
autoindex_localtime on;
root@server01:/apps/nginx/conf/conf.d# curl -T /root/mysql-8.0.33-linux-glibc2.28-x86_64.tar.gz http://120.77.146.92:8889/down/
413 Request Entity Too Large
上传文件太大
client_max_body_size 1m; #设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误
3. nginx高级配置
实现 http 反向代理
proxy_pass中有无/的区别:
location /web {
index index.html;
proxy_pass http://120.77.146.92:8889;
}
8889后面没有/ 会访问 http://120.77.146.92:8889/web/index.html,,此行为类似于root
location /web {
index index.html;
proxy_pass http://120.77.146.92:8889/;
}
8889后面有/ 会访问 http://120.77.146.92:8889/index.html,类似与alias
http响应头解释
Accept-Ranges: bytes:表示服务器支持按照字节范围请求获取部分文件内容。
Access-Control-Allow-Origin: *:表示允许所有来源的请求访问资源,这是一个CORS(跨域资源共享)的设置。
Cache-Control: max-age=31536000:表示客户端(浏览器)可以缓存该资源,并在31536000秒(1年)内不会再次发起请求。
Content-Length: 26110:表示返回的响应正文的字节长度。
Content-MD5: tJg9d3rfSWmSFvmFeVQ6UA==:表示响应正文的MD5摘要,用于验证内容的完整性。
Content-Type: application/x-javascript:表示响应正文的媒体类型为JavaScript。
Date: Wed, 05 Jul 2023 08:16:06 GMT:表示响应生成的日期时间。
Last-Modified: Thu, 28 Mar 2019 11:11:28 GMT:表示该资源的最后修改时间。
nginx-vary: Accept-Encoding:表示服务器在进行缓存时,会根据请求头中的"Accept-Encoding"字段的值进行区分,以提供更好的缓存策略。
Server: openresty:表示服务器的软件类型为openresty。
Vary: Accept-Encoding:表示服务器在进行缓存时,会根据请求头中的"Accept-Encoding"字段的值进行区分,以提供更好的缓存策略。
via: CHN-GDfoshan-CT3-CACHE1[2],CHN-GDfoshan-CT3-CACHE40[0,TCP_HIT,0],CHN-GDdongguan-GLOBAL1-CACHE47[2],CHN-GDdongguan-GLOBAL1-CACHE99[0,TCP_HIT,0]:表示代理服务器和缓存服务器的路径,可以用于追踪请求的传输路径。
X-CCDN-CacheTTL: 31536000:表示资源被缓存的时间,这里是31536000秒(1年)。
X-CCDN-Expires: 16007178:表示资源的过期时间戳。
x-hcs-proxy-type: 1:表示代理类型为1。
x-oss-hash-crc64ecma: 1862480746180049706:表示响应正文的CRC64-ECMA校验和。
x-oss-object-type: Normal:表示对象类型为Normal。
x-oss-request-id: 63B7BF1F67F3E433314BAB97:表示对象请求的唯一标识符。
x-oss-server-time: 7:表示对象服务端时间为7。
x-oss-storage-class: Standard:表示对象存储类型为Standard。
自定义日志格式
log_format testlog '$remote_addr [$time_local] "$request" $status "$http_user_agent" ';
access_log /etc/zabbix/zabbix.log testlog;
定义json格式日志:在http块
log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,' #总的处理时间
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",' #后端应用服务器处理时间
'"http_host":"$host",'
'"uri":"$uri",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"tcp_xff":"$proxy_protocol_addr",'
'"http_user_agent":"$http_user_agent",'
'"status":"$status"}';
access_log /apps/nginx/logs/access_json.log access_json;
效果
root@server01:/apps/nginx/conf# cat ../logs/access_json.log
{"@timestamp":"2023-09-11T18:48:04+08:00", '"host":"172.29.21.67",' '"clientip":"120.77.146.92",' '"size":2,' '"responsetime":0.000,' '"upstreamtime":"-",' '"upstreamhost":"-",' '"http_host":"120.77.146.92",' '"uri":"/index.html",' '"xff":"-",' '"referer":"-",' '"tcp_xff":"-",' '"http_user_agent":"curl/7.81.0",' '"status":"200"}'
压缩
命令行压缩
root@server01:/apps/nginx/conf# curl --head --compressed -I http://120.77.146.92:8889/syslog.html
https
自签发证书
openssl req -newkey rsa:4096 -nodes -sha256 -keyout zabbix-ca.key -x509 -days 3650 -out zabbix-ca.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
Country Name (2 letter code) [AU]:CN 国家
State or Province Name (full name) [Some-State]:guangdong 省份
Locality Name (eg, city) []:shenzheng 城市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:luo.com 公司
Organizational Unit Name (eg, section) []:id 部门
Common Name (e.g. server FQDN or YOUR name) []:zabbix.luo.com #要加密的网站
Email Address []:
root@ubuntu20:/etc/nginx/cert# ls
zabbix-ca.crt zabbix-ca.key
nginx添加配置文件
listen 80;
listen 443 ssl ;
ssl_certificate /etc/nginx/cert/zabbix-ca.crt;
ssl_certificate_key /etc/nginx/cert/zabbix-ca.key;
server_name zabbix.luo.com;
申请阿里云ssl证书
阿里云申请证书
下载证书,pem包含了二个证书,要提取里面的文件,pem中文件上面那个是zabbix.luohuiwen.top申请网站的证书
nginx配置
root@ubuntu20:/etc/nginx/conf.d# cat zabbix.luohuiwen.top.conf
server {
listen 8889;
listen 8822 ssl;
ssl_certificate /apps/nginx/conf/cert/a.crt;
ssl_certificate_key /apps/nginx/conf/cert/zabbix.luohuiwen.top.key;
server_name zabbix.luohuiwen.top;
location / {
root /usr/share/nginx/html;
}
}
上面配置https走8822端口
面试题目:
http 协议的各个版本和区别
比较nginx 和 apache 的特性
nginx 的功能
常见的nginx 性能优化方法
location的优先级
rewrite 中 redirect,permanent, break和last区别
在nginx的rewrite指令中,redirect、permanent、break和last是常用的选项,它们的作用和行为有所不同:
1. redirect:使用`redirect`选项会返回一个临时重定向响应(HTTP状态码302)给客户端。它会将请求重定向到新的URL,但是客户端会保留原始的HTTP方法(GET、POST等)。通常用于临时性的重定向。
2. permanent:使用`permanent`选项会返回一个永久重定向响应(HTTP状态码301)给客户端。它会将请求永久重定向到新的URL,并且浏览器将使用新的URL来发送后续的请求。通常用于永久性的重定向。
3. break:使用`break`选项会立即停止当前的rewrite规则集,并且不会继续匹配其他规则。通常用于在rewrite期间中断规则匹配流程,例如在if语句中使用。
4. last:使用`last`选项会停止当前的rewrite规则集,并继续按照新的URI进行请求处理。它会重新开始一个新的请求处理流程,使用新的URI匹配location块中的规则。通常用于在rewrite期间将请求重定向到另一个location。
需要注意的是,`redirect`和`permanent`选项是执行HTTP重定向,而`break`和`last`选项是控制rewrite规则的处理流程。每个选项的使用场景和效果取决于你的具体需求和nginx配置。
如何获取客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
在 Nginx 的配置文件中,proxy_set_header
指令用于设置需要添加到传出请求的 HTTP 头部。
X-Forwarded-For
是一个常见的 HTTP 头部字段,用于表示客户端的真实 IP 地址。当使用代理服务器时,代理服务器会将原始请求的 IP 地址添加到 X-Forwarded-For
头部中,以便目标服务器可以获取到客户端的真实 IP 地址。
在 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
这个配置中,$proxy_add_x_forwarded_for
是一个 Nginx 内置的变量,它的值是 X-Forwarded-For
头部当前的值加上逗号和客户端真实 IP 地址。如果请求中已经包含了 X-Forwarded-For
头部,$proxy_add_x_forwarded_for
会追加客户端的真实 IP 地址到已有的值中。如果请求中没有 X-Forwarded-For
头部,$proxy_add_x_forwarded_for
会创建一个新的 X-Forwarded-For
头部,并将客户端的真实 IP 地址设置为其值。
通过将 X-Forwarded-For
头部传递给目标服务器,目标服务器就可以获得客户端的真实 IP 地址,即使请求经过了代理服务器的转发。这对于目标服务器来说十分重要,因为在代理环境中,它无法直接获得客户端的真实 IP 地址。
nginx的常见模块
rewrite proxy upstream
nginx的反向代理的调度算法
比较nginx,haprorxy和LVS的区别
nginx
http的常见的响应码
访问web页面时出现502和504错误,请简述—下排查思路
有同事反应,网站访问速度很慢,有时候会出现打不开网站的情况,刷新等待好长时间后又正常打
开,请分析并说一说故障排查思路?
上家公司的服务各做了哪些优化,NGINX做了哪些优化
高价值展示生活
安全感建立
具备信息交换
兴趣爱好,工作,职业
生活状态