L o a d i n g . . .
SHIWIVI-文章

//sunny forever
while(life<end){
love++;
beAwesome :)}

    <
  • 主题:
  • + -
  • 清除背景
  • 禁用背景

Nginx笔记(上)

字数:11302 写于:2022-03-04
最新更新:2022-03-06 阅读本文预计花费您33分钟
nginx官方文档:http://nginx.org/en/docs/

基本介绍

Nginx简介

Nginx是一款高性能的Web服务器软件,能在高并发环境下快速响应http/https请求,同时也提供IMAP/POP3/SMTP服务,可用于反向代理服务器、虚拟主机、域名解析、负载均衡、防盗链、URL重定向、http/https、邮件代理服务器等各类场景。

根据Netcraft 发布的web服务器调查报告,截至2022年1月,nginx是全球最常用的web服务器软件,占有全球32.3%的站点,另一服务器软件Apache占有23.9%的站点,很大一部分web服务器使用Nginx作为负载均衡服务器。

依赖与环境

操作系统要求:Nginx底层使用了多进程和I/O多路复用(epoll)来提高并发能力,因此需要使用Linux2.6以上的内核以支持epoll

源码包依赖:

  • GCC编译器:编译C语言
  • PCRE库(兼容正则表达式库):用于支持正则表达式
  • zlib库:为Nginx的gzip压缩提供压缩算法
  • OpenSSL:提供安全通信

进程模型

master进程:主进程,以root权限运行,负责读取检测配置文件,启动和管理worker进程

worker进程:工作进程,权限由配置文件中的user决定,负责处理网络请求,进程数量由配置文件中的worker_processes决定

常用命令

Nginx服务命令

未配置全局环境变量的情况下,nginx命令执行路径为/usr/local/nginx/sbin,可以通过./nginx -h查看所有命令

命令 说明
./nginx 启动nginx
./nginx -h -h可替换为-?,查看nginx的所有命令
./nginx -v 查看nginx的版本
./nginx -s 信号量 发送一个信号量操作nginx
./nginx -s stop 强制关闭nginx
./nginx -s quit 停止接受新请求,等待nginx处理完当前任务后关闭nginx
./nginx -s reload 重新加载配置文件
./nginx -s reopen 重新打开日志文件(可用于日志分割)
./nginx -t [文件路径] 检测nginx的配置文件是否书写正确
./nginx -T 检测nginx的配置文件是否书写正确,若正确则将内容输出到屏幕
./nginx -c 文件路径 手动指定nginx的配置文件后启动

Linux系统命令

kill -信号 master进程PID

信号 说明
TERM/INT 强制关闭nginx
QUIT 停止接受新请求,处理完当前任务后关闭nginx
HUP 重新加载配置文件
USR1 重新打开日志文件(可用于日志分割)
USR2 不停止服务,平滑升级到最新版nginx
WINCH 停止接受新请求,处理完当前任务后关闭所有worker进程
关于平滑升级

执行 kill -USR2 17482(假设17482为master进程PID)命令进行平滑升级时,更新完ngixn后会开启一个新版本nginx对应的master进程和work进程,此时系统中将会有两个master进程,并且新版本的master进程PID会被记录在/usr/loca1/nginx/logs/nginx.pid文件中,而旧版本master进程PID会被记录在/usr/loca1/nginx/logs/nginx.pid.oldbin文件中,之后会发送QUIT信号给旧的master进程,让其处理完请求后关闭,完成升级。

配置文件

配置文件位于/usr/local/nginx/conf/nginx.conf路径下

全局配置

#user nobody; //指定nginx工作进程的用户身份,默认为nobody worker_processes 1; //允许生成的worker process数

#error_log logs/error.log; //日志级别与存放路径
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid; //master进程pid存放路径
……

user配置进程权限

user 用户名 [用户组];

默认为nobody,配置决定了worker进程的调用用户,以及nginx对文件(一般指资源文件和目录)的读写权限,而日志文件、pid文件、配置文件等由master进程调用的文件则不受此配置影响,所有者一般为root。当配置的用户对指定文件无访问权限时,Nginx将返回403错误,此时需要授予该用户相关权限,或者更改为权限更高的用户。

worker_processes配置进程数量
  • master_process on/off;用于指定是否生成worker进程,默认为on
  • worker_processes 值/auto;指定worker进程生成数量,默认为1
worker_processes值越大,处理并发能力越强。但需要考虑服务器的CPU核心数、内存余量等硬件资源大小
daemon配置nginx为守护进程

daemon on/off;

配置nginx是否以守护进程方式启动,并在后台运行,默认为on

error_log配置日志

error_log 路径 [日志级别];

配置日志路径和记录级别,这里指Nginx本身运行错误产生的日志,用户连接产生的日志需要在http/https块里配置,默认将notice以上级别的日志写入error.log日志文件中,日志级别有 debug、info、notice、warn、error、crit

pid配置pid文件路径

pid 路径;

自定义pid文件路径,默认在/usr/local/nginx/logs/nginx.pid路径下。pid文件用于存放master进程的pid,会在master进程产生时生成,进程关闭时删除。当使用nginx -s reload/reopen重新加载配置文件或日志时,nginx会到该文件中读取进程pid,如果该文件无法找到或者已经被删除,nginx将报错,常用的解决方法是使用nginx -c 配置文件名命令重新指定配置文件后启动nginx

events块

... events { worker_connections 1024;//每个worker允许的最大连接数 }
accept_mutex配置网络连接序列号

accept_mutex on/off;

默认为on,用于解决“惊群”问题,即将连接到nginx的网络连接进行序列化,并依次分配给worker进程,防止多个worker争抢连接。

accept_mutex配置网络连接序列号

multi_accept on/off;

默认为off,在off状态下,一个worker进程只能接收一个新的连接请求,否则,一个worker进程将同时接收所有新连接。

worker_connections配置单进程最大连接数

worker_connections 值;

默认为1024,用于配置每个worker允许的最大连接数,值不能超过操作系统最大文件句柄数量。

use配置事件处理模型

use 参数;

可选参数有poll/select/epoll/kqueue等,Linux2.6以上内核默认使用epoll函数以优化并发连接能力。

http块

http { include mime.types; //引入外部文件mime.types 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 logs/access.log main; //定义access连接日志的路径与内容 //快速传输文件 sendfile on; #tcp_nopush on; //服务器保持连接最大时间,单位为s #keepalive_timeout 0; keepalive_timeout 65; //传输文件前是否压缩 #gzip on; ....
include

include 文件名;

  • 用于引入外部文件,管理员可以定义一个外部文件书写配置,然后通过include将该文件内容引入到相应位置。
  • 这里引入的mime.types用于标识文档、媒体文件格式和类型,该文件标识了常用的html、css、js、jpg等文件类型,用于帮助nginx识别请求的文件类型
default_type

default_type MIME类型;

默认值application/octet-stream指没有特定类型的二进制文件,MIME类型可参考MDN文档:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types

access_log
  • log_format 变量名 日志格式;
  • access_log 路径 变量名;

二者搭配使用,第一个语句用于定义一个变量名,并将配置的日志格式赋值给该变量,变量名取值需使用$符。第二个语句用于根据变量名对应的日志格式,将用户访问日志书写到对应路径下。日志格式中对应的变量含义:

变量名 说明
remote_addr 客户端地址
remote_user 客户端用户名
time_local 访问时间和时区
request 请求的URL和HTTP协议
http_host 请求地址,即浏览器中输入的地址
status http请求返回的状态码,如:301、404等
upstream_status upstream状态
body_bytes_sent 发送给客户端的文件大小(字节)
http_referer 该请求是从哪个链接跳转过来
http_user_agent 客户端信息,如:浏览器标识等
ssl_protocol SSL协议版本
ssl_cipher 交换数据中的算法
request_time 整个请求的总时间
upstream_addr upstream的地址,即真正提供服务的主机地址
http_x_forwarded_for 记录有代理服务器时客户端地址的配置
upstream_response_time 请求过程中,upstream响应时间
sendfile
  • sendfile on/off;
  • tcp_nopush on/off;

sendfile用于高效传输文件,在sendfile为on的状态下,开启tcp_nopush会将文件积累到一定大小后再统一发送,用于提高包传输效率

keepalive_timeout
  • keepalive_timeout 值;
  • tcp_nodelay on/off;

keepalive_timeout用于设置保持与客户端连接的最大时间,单位默认为s,超时时nginx会关闭连接并释放服务器资源,若设置为0则禁用该设置。设置的时间过大会导致大量的无效连接未断开,从而占用服务器资源,太小会导致服务未处理完,就被强制关闭连接。

在keepalive_timeout启用状态下,配置tcp_nodelay on;可以将数据即使发送。

gzip

gzip on/off;

gzip 用于配置传输文件前是否进行压缩以提高传输速率,压缩会占用一定系统资源

server块

server { listen 80; //监听端口 server_name localhost;//监听的域名或ip地址 #charset koi8-r; #access_log logs/host.access.log main;//日志输出路径 location /web/ { //路由路径 root /test; index index.html index.htm; } location /images { root /test; autoindex on;//自动生成文件归档页面 } location /.well-known/pki-validation/{ root /; } location /new/{ root /; add_header Content-Disposition "attachment;"; } //定义404页面 #error_page 404 /404.html; //定义50x页面 # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
listen

listen 地址/端口 [default_server];

配置监听地址和端口,default_server参数用于将该server设置为默认主机,无该参数则第一个server为默认主机,当没有匹配到客户端指定的端口/IP时,将连接到默认主机。地址和端口格式可以为:

  • listen 127.0.0.1 监听该地址所有端口
  • listen 127.0.0.1:8080 监听该地址的8080端口
  • listen *:8080 监听所有地址的8080端口
server_name

server_name 域名/IP地址;

用于配置虚拟主机的标识名称,域名或IP地址可以写多个,使用空格隔开。当listen中配置了域名或IP地址,则server_name配置的域名和IP地址将失效,配置方法可以使用以下三种,当域名被多个server匹配到,将按精确匹配>通配符在开头>通配符在结尾>正则匹配>默认主机的优先级进行分配。

精确匹配
server { listen 80; server_name aaaa.com bbbbb.cn;//配置多个域名 .....}
通配符匹配

通配符只能在段首和段尾使用,不能再域名中间使用!

server { listen 80; server_name *.aaaa.com www.aaaa.*; .....}
正则匹配
server { listen 80; server_name ~正则表达式; .....}
charset

charset 编码格式;
charset 用于指定字符编码格式,默认的koi8-r为俄语编码格式(nginx作者是俄罗斯人),与utf-8类似

access_log

access_log 路径 日志格式;

用于指定该server的连接日志,日志格式默认使用http模块中的main变量定义的格式,可用log_format命令自行定义。

location

location 请求路径;

配置请求路径,可配置多个location块用于响应不同请求

location /路径{ //在test目录下匹配该路径(默认) root /test } location = /路径{ //在test目录下精准匹配该路径 root /test } location ~* \正则表达式 { //在test目录下正则匹配(添加*号不区分大小写) root /test } ~用于标识正则表达式,*表示不区分大小写,^~则表示不包含正则表达式,功能和不加~一致
root/alias

root/alias 路径;

用于指定资源查找路径,使用root语句时,客户端请求location路径,Nginx查找资源会直接前往root路径+location路径。alias一般在需要隐藏服务器真实路径时使用,查找资源会直接前往alias路径,location路径仅作为客户端请求的虚拟路径

index

index 文件名;

用于设置主页,文件名可以写多个,如: index index1.html index2.html;当找不到第一个文件时,会依次往后查找。

error_page

error_page 状态码 [=状态码] 路径;

用于设置错误处理方法,根据不同的状态码,进行相应处理,常用于配置404,50x页面,可以通过添加[=状态码]修改返回给客户端的状态码,如:error_page 404 [=200] /404.html,浏览器收到的状态码将从404修改为200。路径可以为:

  • 地址:error_page 404 http://wrong.com
  • 重定向:
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }
  • 返回信息:
    error_page 404 @goto
    loaction @goto{
    default_type text/plain;
    return 404 ‘not found….’
    }

Web服务器配置实例

需求:在服务器8081和8082端口分别配置server1、server2两个服务,每个服务下有两个页面,根据客户端请求返回不同页面,为每个服务配置单独的访问日志。

目录树

webservers目录位于服务器根目录下,conf.d目录用于存放每个服务的配置文件,web目录用于存放页面和访问日志。每个服务下的logs目录用于存放access_log日志文件,webpages目录用于存放页面。

webservers |____conf.d | |_____server1.conf | |_____server2.conf |____web |____404.html |____server1 | |____logs——access_log | |____webpages | |____web1.html | |____web2.html |____server2 |_____logs——access_log |_____webpages |_____web3.html |_____web4.html

http块配置

定义两个变量server1和server2,用于配置日志格式,两个服务的配置文件独立存放于/webservers/conf.d路径下,使用include引入nginx.conf配置文件中。

http{ ...... log_format server1 'new access =>$time_local'; log_format server2 'new access =>$time_local'; include /webservers/conf.d/*.conf;//引入两个服务的配置文件 }

server1配置

访问http://45.77.77.10:8081访问web1页面

访问http://45.77.77.10:8081/pages访问web2页面

server{
    listen 8081;
    server_name 45.77.77.10;
    access_log /webservers/web/server1/logs/access.log server1;
    error_page 404 /404.html;
    location /{
    alias /webservers/web/server1/webpages/;
    index web1.html;
    }
    location /pages{
    alias /webservers/web/server1/webpages/;
    index web2.html;
    }
    location =/404.html{
    root /webservers/web;
    index 404.html;
    }
      }
server2配置

访问http://45.77.77.10:8082/web3.html访问web3页面

访问http://45.77.77.10:8082/webpages访问web4页面

server{
    listen 8082;
    server_name 45.77.77.10;
    access_log /webservers/web/server2/logs/access.log server2;
    error_page 404 /404.html;
    location /web3.html{
    root /webservers/web/server2/webpages;
    index web3.html;
    }
    
    location /webpages{
    root /webservers/web/server2;
    index web4.html;
    }

    location =/404.html{
    root /webservers/web;
    index 404.html;
    }
      }
配置https服务时,使用ssl_certificatessl 路径语句配置证书,使用ssl_certificate_key 路径配置密钥

静态资源提供服务

http {
    .......
gzip on;
gzip_min_length 1;  //设置最小压缩大小,小于1字节的文件不进行压缩
gzip_comp_level 3; //压缩级别(压缩比),取值范围为1-9,值越大,压缩越多,cpu占用率越高
gzip_types text/css text/javascript; //配置压缩的文件类型
    server {
        listen      80;
        server_name  45.77.78.10;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location /images/ {  //匹配路径
        root /test;         //资源所在路径
        autoindex on;  //自动生成资源归档页面
         }
        location /images {  //匹配路径
        root /test;         //资源所在路径
         }
         location /other/ {  //匹配路径
        alias /test/images;         //资源所在路径
         }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        .....
    }
    ........
}

test目录服务器根目录下,并且在/test/images路径下存放了photo.jpg照片

  • 使用第一个location配置时,当访问 http://45.77.78.10/images/ 时,ngxin会在自动生成的归档页面上输出/test/images/目录下的所有文件。请求只能为location后面配置的参数,若请求为 http://45.77.78.10/test/images/则会返回404
  • 使用第二个location配置时,由于未使用 autoindex on 配置,nginx不会生成归档页面,当访问 http://45.77.78.10/images/ 时nginx将返回403,访问文件需指定具体文件路径,如:http://45.77.78.10/test/images/photo.jpg
  • 当需要对访问者隐藏服务器实际文件路径时,可以使用alias进行配置,使用第三个location配置,url应当为http://45.77.78.10/other/photo.jpg,此时实际访问的依旧alias指定的/test/images路径下的文件
上一篇:VLess+TLS+WS代理服务器搭建
下一篇:Redhat防火墙
z z z z z