Nginx 구성 및 최적화 3

1. 웹페이지 상태 페이지

  • nginx는 서버의 실행 상태 정보를 볼 수 있는 상태 페이지를 제공합니다. 상태
    페이지에는 현재 활성 연결 수, 허용된 요청 수, 처리 시간 및 기타 정보가 표시되므로 서버의 실행 상태를 이해하는 데 매우 유용합니다. 서버 및 문제 해결.

  • Nginx 모듈 ngx_http_stub_status_module의 구현에 따라 nginx를 컴파일하고 설치할 때 --with-http_stub_status_module 컴파일 매개변수를 추가해야 합니다.

  • 상태 페이지에는 가상 호스트의 상태가 아닌 전체 서버의 상태가 표시됩니다.

yum install -y httpd-tools 
htpasswd -bc /apps/nginx/conf.d/.httpuser byyd 123456

cd /apps/nginx/conf.d/

vim computer.conf

#添加以下内容

location /nginx_status {
    
    
#验证模块可以不加
   auth_basic           "auth login";
   auth_basic_user_file /apps/nginx/conf/.htpasswd;
   
   stub_status;
}
Active connections:
#当前处于活动状态的客户端连接数,包括连接等待空闲连接数=reading+writing+waiting
accepts
#统计总值,Nginx自启动后已经接受的客户端请求的总数。
handled
#统计总值,Nginx自启动后已经处理完成的客户端请求总数,通常等于accepts,除非有因worker_connections限制等被拒绝的连接
requests
#统计总值,Nginx自启动后客户端发来的总的请求数。
Reading
#当前状态,正在读取客户端请求报文首部的连接的连接数,数值越大,说明排队现象严重,性能不足
Writing
#当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大
Waiting
#当前状态,正在等待客户端发出请求的空闲连接数,开启 keep-alive的情况下,这个值等于active – (reading+writing)

2개, nginx 타사 모듈

  • nginx 타사 모듈은 nginx 기능을 확장 및 향상하고 특정 요구 사항에 따라 동작을 사용자 정의하는 데 사용되는 선택적 플러그인입니다.
  • 타사 모듈은 새로운 지시문, 처리기, 변수를 추가하거나 기존 기능을 수정할 수 있습니다.
  • 타사 모듈을 사용하려면 nginx를 컴파일하고 설치할 때 해당 모듈 소스 코드를 포함하고 모듈에서 제공하는 지침에 따라 구성해야 합니다.

2.1, 에코 모듈

echo-nginx-module은 구성 파일의 echo 명령을 구문 분석하고, 해당 스크립트나 표현식을 실행하고, 결과를 HTTP 응답으로 클라이언트에 반환할 수 있는 타사 nginx 모듈입니다. echo 모듈을 사용하면 다음을 달성할 수 있습니다. :
1.
출력 일반 텍스트: 응답의 일부로 클라이언트에 문자열을 반환합니다
. 2. 출력 변수 값: nginx 내장 변수 또는 사용자 정의 변수의 값을 클라이언트에 반환합니다. 요청 헤더 정보를 표시하거나 콘텐츠를 동적으로 생성하는 데 매우 유용합니다.
3. HTTP 상태 코드 출력: 응답 HTTP 상태 코드 설정
4. 요청 처리 흐름 제어: 요청을 종료하거나 요청을 다른 URL로 리디렉션하여 요청 처리 흐름을 제어합니다.
에코를 사용하려면 -nginx-module, Nginx를 컴파일하고 설치할 때 이 모듈을 추가하거나 타사 패키지 관리 도구를 통해 설치해야 합니다.

#举个例子
http {
    
    
    server {
    
    
        listen 80;
        server_name example.com;

        location /hello {
    
    
            echo "Hello, World!";
        }
    }
}

当访问 `http://example.com/hello` 时,Nginx 会使用 echo 模块输出 "Hello, World!" 作为 HTTP 响应。

https://codeload.github.com/openresty/echo-nginx-module/zip/refs/heads/master 다운로드 모듈 패키지

#重新编译安装 添加echo模块
cd   /test11/nginx-1.18.0

./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 --add-module=/test11/echo-nginx-module-master

make -j2 && make install

#在配置文件中加入echo模块配置
vim /apps/nginx/conf.d/computer.conf 

location  /ip {
    
    
  default_type   text/html;
  echo "welcome, your ip addr: ";
  echo $remote_addr;
}

nginx -t
nginx -s reload 

``

换一台机器,检测模块是否成功加载
curl 192.168.2.100/ip

3. 변수

nginx에서 변수는 HTTP 요청 및 응답에서 데이터를 저장하고 검색하는 메커니즘입니다.
변수에는 요청, 요청 방법, 요청 매개변수, 타임스탬프 등과 같은 정보가 포함될 수 있습니다.

http://nginx.org/en/docs/varindex.html
官方文档

3.1 내장변수

3.1.1 일반적으로 사용되는 내장변수

NGINX가 역방향 프록시 서버 역할을 하면 수신된 클라이언트 요청을 백엔드 서버로 전달합니다. 요청의 소스 정보를 유지하기 위해 NGINX는 요청을 전달할 때 X-Forwarded-For 헤더를 설정할 수 있으므로 백엔드 서버가 실제 클라이언트 IP 주소를 알 수 있습니다.

내장 변수 기능
$remote_addr 클라이언트의 주소는 클라이언트의 공개 IP입니다.
$proxy_add_x_forwarded_for 역방향 프록시 서버에서 X-Forwarded-For 설정
$args 요청 쿼리 매개변수
$arg_ 이름이 지정된 쿼리 매개변수의 값을 출력합니다.
$document_root 현재 요청의 루트 디렉터리 경로
$document_uri 쿼리 문자열 부분을 제외한 현재 요청의 URI
$호스트 요청된 호스트 이름을 보유합니다.
한도_비율 nginx 서버가limit_rate로 네트워크 속도를 표시하도록 구성된 경우 표시되고, 설정되지 않은 경우 0으로 표시됩니다.
$remote_port 클라이언트가 Nginx 서버에 요청하면 무작위로 포트가 열리는데, 이는 각 클라이언트의 고유 포트입니다.
$remote_user Auth Basic Module에서 인증된 사용자 이름
$request_body_file 역방향 프록시 역할을 할 때 백엔드 서버로 전송되는 로컬 리소스의 이름
$request_method 리소스를 요청하는 방법, GET/PUT/DELETE 등
$request_filename 현재 요청의 파일 경로
$request_uri 호스트 이름 없이 요청 매개변수를 포함하는 원시 URI
$ 방식 요청에 사용되는 프로토콜(http 또는 https)
$server_protocol 클라이언트가 리소스를 요청하는 데 사용하는 프로토콜 버전을 보유합니다.
$server_addr 서버의 IP 주소를 저장하세요.
$서버_이름 요청된 서버의 호스트 이름
$server_port 요청한 서버의 포트 번호
$http_ 요청 메시지의 헤더 필드를 기록합니다.
$http_user_agent 클라이언트가 사용하는 사용자 에이전트
$http_쿠키 요청의 쿠키
$cookie_ 이름 요청 메시지의 헤더 단어 쿠키의 키 이름
$sent_http_ 이름 응답 메시지의 첫 번째 필드

3.1.2 예를 들어보자

vim /apps/nginx/conf.d/computer.conf
#添加以下内容
location /main {
    
    
        index index.html;
        default_type text/html;
        echo "hello world,main-->";
        echo $remote_addr;
        echo $args;
    	echo $arg_user
        echo $document_root;
        echo $document_uri;
        echo $host;
        echo $http_user_agent;
        echo $http_cookie;
        echo $request_filename;
        echo $scheme;
        echo $scheme://$host$document_uri?$args;
        }


- `index index.html;`:指定默认的索引文件为index.html,当访问/main时,如果有index.html文件,将自动显示该文件。

- `default_type text/html;`:指定默认的Content-Type为text/html,如果响应中没有特别指定Content-Type,则使用默认值。

- `echo "hello world,main-->";`:输出字符串"hello world,main-->"

- `echo $remote_addr;`:输出客户端的IP地址。

- `echo $args;`:输出请求的查询参数。

- `echo $arg_user;`:输出名为user的查询参数的值。

- `echo $document_root;`:输出当前请求的根目录路径。

- `echo $document_uri;`:输出当前请求的URI。

- `echo $host;`:输出请求的主机名。

- `echo $http_user_agent;`:输出客户端使用的用户代理。

- `echo $http_cookie;`:输出请求中的Cookie。

- `echo $request_filename;`:输出当前请求的文件路径。

- `echo $scheme;`:输出请求使用的协议(http或https)。

- `echo $scheme://$host$document_uri?$args;`:输出完整的URL,包括协议、主机、路径和查询参数。

여기에 이미지 설명을 삽입하세요

切换到另一台主机进行测试
curl 192.168.2.100/main

여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

curl -b  uid=100 '192.168.2.100/main?user=byyd&title=cto'

여기에 이미지 설명을 삽입하세요

3.2. 맞춤 변수

nginx에서는 사용자 정의 변수를 사용하여 구성 파일의 다른 위치에서 재사용할 수 있도록 일부 특정 값을 저장하고 조작할 수 있습니다.
set 명령어를 통해 새로운 변수, 즉 새로운 맞춤 변수에 값을 할당할 수 있습니다.

基本语法
set $variable value; #变量名可自定义

使用环境
server, location, if

vim /apps/nginx/conf.d/computer.conf
#添加以下内容
location /test {
    
    
        set $name  byyd;
        echo $name;
        set $my_port $server_port;
        echo $my_port;
        }

여기에 이미지 설명을 삽입하세요

切换到另一台主机
curl 192.168.2.100/main

여기에 이미지 설명을 삽입하세요

4. 맞춤형 액세스 로그 최적화

사용자 정의 액세스 로그는 보다 유연하고 사용자 정의된 로깅 방법을 제공할 수 있습니다.
1. 특정 요구 사항을 충족하기 위해 : 사용자 정의 액세스 로그를 통해 클라이언트 IP 주소, 액세스 시간, 요청 콘텐츠, 상태, 전송된 바이트 수, 참조와 같은 특정 액세스 정보를 기록하도록 선택할 수 있습니다. 페이지, 사용자 에이전트 등 이러한 정보는 특정 분석, 모니터링 또는 통계 요구 사항을 충족하기 위해 필요에 따라 사용자 정의할 수 있습니다.
2. 로그 양 줄이기 : 기본적으로 nginx에 의해 기록되는 액세스 로그는 더 자세하고 많은 정보를 포함합니다. 사용자 정의 액세스 로그를 사용하면 관심 있는 정보만 기록할 수 있어 과도한 로그 데이터를 방지하고 디스크 공간과 읽기 및 쓰기 오버헤드 를 줄일 수 있습니다. 3. 성능 향상: 사용자 정의 액세스 로그는 디스크 쓰기 작업을 줄여 시스템 성능에 미치는 영향을 줄일 수
있습니다 . 특히 접속량이 많은 경우, 로그량을 줄이면 시스템의 처리 능력과 응답 속도를 향상시킬 수 있습니다.4.
로그 분석 및 모니터링 : 맞춤형 접속 로그를 사용하면 로그 데이터를 보다 쉽게 ​​분석하고 모니터링할 수 있습니다. 사용자 정의 스타일에 따라 다양한 로그 분석 도구나 스크립트를 사용하여 유용한 정보 추출, 액세스 분석, 보안 감사, 성능 최적화 등을 수행할 수 있습니다.

4.1. 액세스 로그 형식 사용자 정의

nginx 액세스 로그를 커스터마이징하려면 nginx 구성 파일을 편집하고 http 부분의 로그 형식을 수정해야 합니다. 다음은
nginx 구성 파일에 커스텀 액세스 로그를 정의하는 방법을 보여주는 간단한 예입니다.

http {
    
    
    # 定义自定义访问日志格式
    log_format my_custom_log '$remote_addr - $remote_user [$time_local] "$request" '
                           '$status $body_bytes_sent "$http_referer" '
                           '"$http_user_agent"';

    # 配置使用自定义访问日志格式的访问日志文件
    access_log /path/to/custom_access.log my_custom_log;

    # 其他配置项...
}

在上述例子中,我们使用 `log_format` 指令定义了一个名为 `my_custom_log` 的自定义日志格式,该格式包含了 IP 地址、用户名、访问时间、请求内容、状态码、传输字节数、引用页面和用户代理等信息。

然后,在 `access_log` 指令中指定了一个自定义访问日志文件的路径 `/path/to/custom_access.log`,并且将之前定义的 `my_custom_log` 格式应用于该日志文件。

请注意,修改完配置文件之后,记得重新加载 Nginx 配置使改动生效,使用命令 `nginx -s reload` 可以实现配置文件的热重载。

4.2, 사용자 정의 json 형식 로그

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"}';


location / {
    
    
  root /data/nginx/pc/;
  access_log logs/access.log access_json;
}
'"http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTMLe/101.0.4951.54 Safari/537.36",'    '"status":"304"}'


脚本
#!/usr/bin/env python3
#coding:utf-8
status_200= []
status_404= []
with open("access_json.log") as f:
    for line in f.readlines():
        line = eval(line)
        if line.get("status") == "200":
            status_200.append(line.get)
        elif line.get("status") == "404":
            status_404.append(line.get)
        else:
            print("状态码 ERROR")
        print((line.get("clientip")))
f.close()
print("状态码200的有--:",len(status_200))
print("状态码404的有--:",len(status_404))

다섯, nginx 압축 기능

nginx는 서버에서 gzip 모듈을 활성화하여 압축을 제공합니다
. gzip이 활성화되면 nginx는 클라이언트의 브라우저 지원을 자동으로 감지한 다음 서버와 클라이언트 간에 압축 및 압축 해제합니다. 너무 작은 파일은 압축을 풀 필요가 없습니다
. 압축, 어쩌면 압축되었을 수도 있음 Bigger
공식 문서: https://nginx.org/en/docs/http/ngx_http_gzip_module.html

매개변수 항목 의역 매개변수 값
gzip 압축 켜기 또는 끄기 켜기/끄기;
gzip_types 파일 유형에 따라 선택적으로 압축 메커니즘을 활성화합니다. 이미지/png, 텍스트/css…
gzip_comp_level 압축 수준을 설정하는 데 사용되며, 수준이 높을수록 시간이 더 많이 소요됩니다. 1~9 (압축률이 높을수록 압축 효과가 좋아짐)
gzip_vary Vary:Accept-Encoding 헤더 필드의 응답 헤더 전달 여부를 설정합니다. 켜기/끄기;
gzip_buffers 압축 요청을 처리하는 버퍼의 수와 크기를 설정합니다. 16 8k와 같은 수량 크기;
gzip_disable 다양한 클라이언트 요청에 대해 압축을 활성화할지 여부 설정 .Chrome과 같은;
gzip_http_version 압축된 응답에 필요한 최소 HTTP 요청 버전을 지정합니다. 1.1로;
gzip_min_length 압축을 트리거할 최소 파일 크기 설정 512k와 같은;
gzip_proxied 백엔드 서버의 응답 결과에 대한 압축 활성화 여부 꺼짐, 만료됨, 캐시 없음...
http{
    
    
    # 开启压缩机制
    gzip on;
    # 指定会被压缩的文件类型(也可自己配置其他类型)
    gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
    # 设置压缩级别,越高资源消耗越大,但压缩效果越好
    gzip_comp_level 5;
    # 在头部中添加Vary: Accept-Encoding(建议开启)
    gzip_vary on;
    # 处理压缩请求的缓冲区数量和大小
    gzip_buffers 16 8k;
    # 对于不支持压缩功能的客户端请求不开启压缩机制
    gzip_disable "MSIE [1-6]\."; # 低版本的IE浏览器不支持压缩
    # 设置压缩响应所支持的HTTP最低版本
    gzip_http_version 1.1;
    # 设置触发压缩的最小阈值
    gzip_min_length 2k;
    # 关闭对后端服务器的响应结果进行压缩
    gzip_proxied off;
}

여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요
여기에 이미지 설명을 삽입하세요

6. HTTPS 기능

6.1 nginx의 HTTPS 작동 원리에 대한 자세한 설명

1.客户端发送HTTPS请求:客户端(例如web浏览器)通过HTTPS协议向nginx服务器发送加密的HTTP请求
。默认情况下,HTTPS使用443端口进行通信
2.服务器证书握手:nginx服务器收到HTTPS请求后,会向客户端发送已经配置好的ssl证书,该证书包含了服务器的公钥以及其他相关信息,例如服务器的域名
3.客户端验证证书;客户端接收到服务器发送的证书后,会使用预置的受信任证书颁发机构根据证书列表来验证详细的服务器证书链,客户端会检查证书是否由受信任的ca签发,并验证证书的有效和真实性。如果证书通过验证,客户端可以确认服务器的身份
4.密钥就交换:如果服务器的证书被验证成功,客户端会产生一个随机生成对称密钥,称为“会话密钥”。然后,客户端使用服务器的公钥来加密会话密钥,并将其发送给服务器
5.数据加密:nginx服务器接收到客户端发送的加密会话密钥,使用服务器的私钥解密该会话密钥,此后,nginx服务器和客户端使用会话密钥来进行对称加密和解密,以加密和解密数据传输
6.安全数据传输:一旦会话密钥被交换并使用,nginx服务器和客户端之间的通信将通过使用会话密钥进行加密和解密来保证安全性。所有通过 http 协议传输的数据,包含 HTTPS协议传输的数据,包含HTTP请求和响应内容,都将被加密
客户端和服务器之间的加密通道建立后,数据在传输的过程中将经过加密,从而提供了更高的安全性

6.2、启用功能模块的配置过程

  • nginx的HTTPS功能通过ngx_http_ssl_module模块来实现的。

  • ngx_http_ssl_module 모듈은 SSL/TLS 프로토콜에 대한 지원을 Nginx에 추가하여 HTTPS 서비스를 제공할 수 있도록 합니다.

  • ngx_http_ssl_module 모듈은 SSL 인증서, 개인 키, 암호화 알고리즘, 프로토콜 버전 및 기타 SSL/TLS 관련 설정을 지정하기 위한 구성 항목 세트를 제공합니다.

1. SSL 인증서 및 개인 키 받기: 인증 기관(CA) 또는 자체 서명된 인증 기관으로부터 유효한 SSL 인증서와 해당 개인 키 파일을 얻습니다. 인증서는 서버의 신원을 확인하는 데 사용되며 개인 키는 SSL 연결을 해독하는 데 사용됩니다.
2. Nginx 구성: 기본 구성 파일 nginx.conf를 편집합니다.

ssl_certificate:指定SSL证书文件的路径。

ssl_certificate_key:指定SSL私钥文件的路径。

ssl_protocols:指定支持的TLS协议版本,例如TLSv1.2、TLSv1.3。

ssl_ciphers:指定加密算法套件,例如AES128-GCM-SHA256、ECDHE-RSA-AES256-GCM-SHA384。

其他可选的SSL配置项:ssl_prefer_server_ciphers、ssl_session_timeout等。

server {
    
    
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/private/key.key;

    # SSL配置项
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
}

3. Nginx 다시 시작: 구성 파일을 저장하고 Nginx 서비스를 다시 로드하거나 다시 시작합니다.

重启Nginx:保存配置文件,并重新加载或重启Nginx服务。

여기에 이미지 설명을 삽입하세요

ca.crt相当于颁发机构
byyb.com.crt相当于颁发对象

여기에 이미지 설명을 삽입하세요

cat byyb.com.crt ca.crt  > www.byyb.com.crt #合并

mv byyb.com.key www.byyb.com.key #公钥

여기에 이미지 설명을 삽입하세요

#编辑配置文件 
vim /apps/nginx/conf.d/computer.conf

server {
    
    
 listen 80;
 listen 443 ssl;
 ssl_certificate /ct/www.byyb.com.crt;
 ssl_certificate_key /ct/ssl/www.byyb.com.key;
 ssl_session_cache shared:sslcache:20m;
 ssl_session_timeout 10m;
}

location  / {
    
    
        root  /apps/nginx/html;
        if ( $scheme = http) {
    
    
        rewrite ^/(.*)$ https://www.byyb.com/$1 redirect;
      }
}

여기에 이미지 설명을 삽입하세요

编辑Windows的本地hosts文件,添加地址映射
路径 C:\Windows\System32\drivers\etc\hosts

여기에 이미지 설명을 삽입하세요

打开浏览器,访问
https:www.byyb.com

여기에 이미지 설명을 삽입하세요

세븐, 커스텀 아이콘

favicon.ico 파일은 URL을 북마크할 때 브라우저에 표시되는 아이콘입니다.

클라이언트가 브라우저를 사용하여 페이지에 액세스하면 브라우저는 페이지의 favicon.ico 파일을 가져오기 위한 요청을 시작합니다.
브라우저에서 요청한 favicon.ico 파일이 존재하지 않으면 서버는 404 로그를 기록하고 브라우저는 404 오류를 표시합니다.

#方法一:服务器不记录访问日志:
location = /favicon.ico {
    
    
   log_not_found off;
   access_log off;
}
#方法二:将图标保存到指定目录访问:
#location ~ ^/favicon\.ico$ {
    
    
location = /favicon.ico {
    
    
     root   /data/nginx/html/pc/images;
     expires 365d;  #设置文件过期时间
}

Supongo que te gusta

Origin blog.csdn.net/fyb012811/article/details/132640779
Recomendado
Clasificación