nginx的常用配置与命令相关硬核干货

embedded/2024/12/22 17:51:34/

今天小晨跟大家分享Nginx常用配置与命令相关的硬核干货,可以说运维工作中基本都会用到这些,掌握它,你可以不用求人!

Nginx特点

  • 高并发、高性能;

  • 模块化架构使得它的扩展性非常好;

  • 异步非阻塞的事件驱动模型这点和 Node.js 相似;

  • 相对于其它服务器来说它可以连续几个月甚至更长而不需要重启服务器使得它具有高可靠性;

  • 热部署、平滑升级;

  • 完全开源,生态繁荣;

Nginx作用

Nginx 的最重要的几个使用场景:

  1. 静态资源服务,通过本地文件系统提供服务;

  2. 反向代理服务,延伸出包括缓存、负载均衡等;

  3. API 服务, OpenResty ;

对于前端来说 Node.js 并不陌生, Nginx 和 Node.js 的很多理念类似, HTTP 服务器、事件驱动、异步非阻塞等,且 Nginx 的大部分功能使用 Node.js 也可以实现,但 Nginx 和 Node.js 并不冲突,都有自己擅长的领域。Nginx 擅长于底层服务器端资源的处理(静态资源处理转发、反向代理,负载均衡等), Node.js 更擅长上层具体业务逻辑的处理,两者可以完美组合。

用一张图表示:

Nginx常用命令

nginx -s reload  # 向主进程发送信号,重新加载配置文件,热重启nginx -s reopen   # 重启 Nginxnginx -s stop    # 快速关闭nginx -s quit    # 等待工作进程处理完成后关闭nginx -T         # 查看当前 Nginx 最终的配置nginx -t         # 检查配置是否有问题

Nginx核心配置

nginx.conf配置文件结构

Nginx 的典型配置示例:

# main段配置信息user  nginx;                        # 运行用户,默认即是nginx,可以不进行设置worker_processes  auto;             # Nginx 进程数,一般设置为和 CPU 核数一样error_log  /var/log/nginx/error.log warn;   # Nginx 的错误日志存放目录pid        /var/run/nginx.pid;      # Nginx 服务启动时的 pid 存放位置
# events段配置信息events {    use epoll;     # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)    worker_connections 1024;   # 每个进程允许最大并发数}
# http段配置信息# 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置http {     # 设置日志模式    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;   # Nginx访问日志存放位置
    sendfile            on;   # 开启高效传输模式    tcp_nopush          on;   # 减少网络报文段的数量    tcp_nodelay         on;    keepalive_timeout   65;   # 保持连接的时间,也叫超时时间,单位秒    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;      # 文件扩展名与类型映射表    default_type        application/octet-stream;   # 默认文件类型
    include /etc/nginx/conf.d/*.conf;   # 加载子配置项
    # server段配置信息    server {      listen       80;       # 配置监听的端口      server_name  localhost;    # 配置的域名
      # location段配置信息      location / {        root   /usr/share/nginx/html;  # 网站根目录        index  index.html index.htm;   # 默认首页文件        deny 172.168.22.11;   # 禁止访问的ip地址,可以为all        allow 172.168.33.44;# 允许访问的ip地址,可以为all      }
      error_page 500 502 503 504 /50x.html;  # 默认50x对应的访问页面      error_page 400 404 error.html;   # 同上    }}
  • main 全局配置,对全局生效;

  • events 配置影响 Nginx 服务器与用户的网络连接;

  • http 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;

  • server 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;

  • location 用于配置匹配的 uri ;

  • upstream 配置后端服务器具体地址,负载均衡配置不可或缺的部分;

用一张图清晰的展示它的层级结构:

图片

nginx.conf 配置文件的语法规则:

  1. 配置文件由指令与指令块构成

  2. 每条指令以 “;” 分号结尾,指令与参数间以空格符号分隔

  3. 指令块以 {} 大括号将多条指令组织在一起

  4. include 语句允许组合多个配置文件以提升可维护性

  5. 通过 # 符号添加注释,提高可读性

  6. 通过 $ 符号使用变量

  7. 部分指令的参数支持正则表达式,例如常用的 location 指令

配置文件 main 段核心参数

user

指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。

#语法:user USERNAME [GROUP]
user nginx lion; # 用户是nginx;组是lion

pid

指定运行 Nginx master 主进程的 pid 文件存放路径。

pid /opt/nginx/logs/nginx.pid # master主进程的的pid存放在nginx.pid的文件

worker_rlimit_nofile_number

指定worker子进程可以打开的最大文件句柄数。

worker_rlimit_nofile 20480; # 可以理解成每个worker子进程的最大连接数量。

worker_rlimit_core

指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。

worker_rlimit_core 50M; # 存放大小限制working_directory /opt/nginx/tmp; # 存放目录

worker_processes_number

指定 Nginx 启动的 worker 子进程数量。

worker_processes 4; # 指定具体子进程数量worker_processes auto; # 与当前cpu物理核心数一致

worker_cpu_affinity

将每个 worker 子进程与我们的 cpu 物理核心绑定。

worker_cpu_affinity 0001 0010 0100 1000; # 4个物理核心,4个worker子进程

将每个 worker 子进程与特定 CPU 物理核心绑定,优势在于,避免同一个 worker 子进程在不同的 CPU 核心上切换,缓存失效,降低性能。但其并不能真正的避免进程切换。

worker_priority

指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。

worker_priority -10; # 120-10=110,110就是最终的优先级

Linux 默认进程的优先级值是120,值越小越优先;nice 值范围为 -20 到 +19 。

备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。

worker_shutdown_timeout

指定 worker 子进程优雅退出时的超时时间。

worker_shutdown_timeout 5s;

timer_resolution

worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。

timer_resolution 100ms;

在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。

daemon

指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。

daemon off; # 默认是on,后台运行模式

配置文件 events 段核心参数

use

Nginx 使用何种事件驱动模型。

use method; # 不推荐配置它,让nginx自己选择

method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport

worker_connections

worker 子进程能够处理的最大并发连接数。

worker_connections 1024 # 每个子进程的最大连接数为1024

accept_mutex

是否打开负载均衡互斥锁。

accept_mutex on # 默认是off关闭的,这里推荐打开

server_name 指令

指定虚拟主机域名。

#语法:server_name name1 name2 name3# 示例:server_name www.nginx.com;

域名匹配的四种写法:

  • 精确匹配:server_name http://www.nginx.com ;

  • 左侧通配:server_name *.http://nginx.com ;

  • 右侧统配:server_name www.nginx.* ;

  • 正则匹配:server_name ~^www\.nginx\.*$ ;

匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配

server_name 配置实例:

1、配置本地 DNS 解析 hosts

# 添加如下内容,其中 121.42.11.34 是阿里云服务器IP地址
121.42.11.34 www.nginx-test.com121.42.11.34 mail.nginx-test.com121.42.11.34 www.nginx-test.org121.42.11.34 doc.nginx-test.com121.42.11.34 www.nginx-test.cn121.42.11.34 fe.nginx-test.club

注意:这里使用的是虚拟域名进行测试,因此需要配置本地 DNS 解析,如果使用阿里云上购买的域名,则需要在阿里云上设置好域名解析。

2、配置阿里云Nginx,vim /etc/nginx/nginx.conf

# 这里只列举了http端中的sever端配置

# 左匹配

server {  listen  80;  server_name  *.nginx-test.com;  root  /usr/share/nginx/html/nginx-test/left-match/;  location / {    index index.html;  }}

# 正则匹配

server {  listen  80;  server_name  ~^.*\.nginx-test\..*$;  root  /usr/share/nginx/html/nginx-test/reg-match/;  location / {    index index.html;  }}

# 右匹配

server {  listen  80;  server_name  www.nginx-test.*;  root  /usr/share/nginx/html/nginx-test/right-match/;  location / {    index index.html;  }}
# 完全匹配

server {  listen  80;  server_name  www.nginx-test.com;  root  /usr/share/nginx/html/nginx-test/all-match/;  location / {    index index.html;  }}

3、访问分析

  • 当访问 http://www.nginx-test.com 时,都可以被匹配上,因此选择优先级最高的“完全匹配”;

  • 当访问 http://mail.nginx-test.com 时,会进行“左匹配”;

  • 当访问 http://www.nginx-test.org 时,会进行“右匹配”;

  • 当访问 http://doc.nginx-test.com 时,会进行“左匹配”;

  • 当访问 http://www.nginx-test.cn 时,会进行“右匹配”;

  • 当访问 fe.nginx-test.club 时,会进行“正则匹配”;

root

指定静态资源目录位置,它可以写在 http 、 server 、 location 等配置中。

#root path
#例如:
location /image {  root /opt/nginx/static;}
#当用户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png

注意:root 会将定义路径与 URI 叠加, alias 则只取定义路径。

alias

它也是指定静态资源目录位置,它只能写在 location 中。​​​​​​​

location /image {  alias /opt/nginx/static/image/;}
#当用户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png

注意:使用 alias 末尾一定要添加 / ,并且它只能位于 location 中。

location

配置路径。

location [ = | ~ | ~* | ^~ ] uri {  ...}

匹配规则:

  • = 精确匹配;

  • ~ 正则匹配,区分大小写;

  • ~* 正则匹配,不区分大小写;

  • ^~ 匹配到即停止搜索;

匹配优先级:=  > ^~  > ~  > ~*  > 不带任何字符。

实例:

server {  listen  80;  server_name  www.nginx-test.com;
  # 只有当访问 www.nginx-test.com/match_all/ 时才会匹配到/usr/share/nginx/html/match_all/index.html  location = /match_all/ {      root  /usr/share/nginx/html      index index.html  }
  # 当访问 www.nginx-test.com/1.jpg 等路径时会去 /usr/share/nginx/images/1.jpg 找对应的资源  location ~ \.(jpeg|jpg|png|svg)$ {    root /usr/share/nginx/images;  }
  # 当访问 www.nginx-test.com/bbs/ 时会匹配上 /usr/share/nginx/html/bbs/index.html  location ^~ /bbs/ {    root /usr/share/nginx/html;    index index.html index.htm;  }}

location 中的反斜线

location /test {  ...}
location /test/ {  ...}
  • 不带 / 当访问 http://www.nginx-test.com/test 时, Nginx 先找是否有 test 目录,如果有则找 test 目录下的 index.html ;如果没有 test 目录, nginx  则会找是否有 test 文件。

  • 带 / 当访问 http://www.nginx-test.com/test 时, Nginx 先找是否有 test 目录,如果有则找 test 目录下的 index.html ,如果没有它也不会去找是否存在 test 文件。

return

停止处理请求,直接返回响应码或重定向到其他 URL ;执行 return 指令后, location 中后续指令将不会被执行。

#return code [text];#return code URL;#return URL;
#例如:
location / {  return 404; # 直接返回状态码}
location / {  return 404 "pages not found"; # 返回状态码 + 一段文本}
location / {  return 302 /bbs ; # 返回状态码 + 重定向地址}
location / {  return https://www.baidu.com ; # 返回重定向地址}

rewrite

根据指定正则表达式匹配规则,重写 URL 。

#语法:rewrite 正则表达式 要替换的内容 [flag];#上下文(标签):server、location、if
#示例:rewirte /images/(.*\.jpg)$ /pic/$1; # $1是前面括号(.*\.jpg)的反向引用

flag 可选值的含义:

  • last 重写后的 URL 发起新请求,再次进入 server 段,重试 location 的中的匹配;

  • break 直接使用重写后的 URL ,不再匹配其它 location 中语句;

  • redirect 返回302临时重定向;

  • permanent 返回301永久重定向;

server{  listen 80;  server_name fe.lion.club; # 要在本地hosts文件进行配置  root html;  location /search {    rewrite ^/(.*) https://www.baidu.com redirect;  }
  location /images {    rewrite /images/(.*) /pics/$1;  }
  location /pics {    rewrite /pics/(.*) /photos/$1;  }
  location /photos {
  }}

按照这个配置我们来分析:

  • 当访问 fe.lion.club/search 时,会自动帮我们重定向到 https://www.baidu.com。

  • 当访问 fe.lion.club/images/1.jpg 时,第一步重写 URL 为 fe.lion.club/pics/1.jpg ,找到 pics 的 location ,继续重写 URL 为 fe.lion.club/photos/1.jpg ,找到 /photos 的 location 后,去 html/photos 目录下寻找 1.jpg 静态资源。

if 指令

#语法:if (condition) {...}
#上下文:server、location
#示例:
if($http_user_agent ~ Chrome){  rewrite /(.*)/browser/$1 break;}

condition 判断条件:

  • $variable 仅为变量时,值为空或以0开头字符串都会被当做 false 处理;

  • = 或 != 相等或不等;

  • ~ 正则匹配;

  • ! ~ 非正则匹配;

  • ~* 正则匹配,不区分大小写;

  • -f 或 ! -f 检测文件存在或不存在;

  • -d 或 ! -d 检测目录存在或不存在;

  • -e 或 ! -e 检测文件、目录、符号链接等存在或不存在;

  • -x 或 ! -x 检测文件可以执行或不可执行;

实例:

server {  listen 8080;  server_name localhost;  root html;
  location / {    if ( $uri = "/images/" ){      rewrite (.*) /pics/ break;    }  }}

当访问 localhost:8080/images/ 时,会进入 if 判断里面执行 rewrite 命令。

autoindex

用户请求以 / 结尾时,列出目录结构,可以用于快速搭建静态资源下载网站。

autoindex.conf 配置信息:

server {  listen 80;  server_name fe.lion-test.club;
  location /download/ {    root /opt/source;
    autoindex on; # 打开 autoindex,,可选参数有 on | off    autoindex_exact_size on; # 修改为off,以KB、MB、GB显示文件大小,默认为on,以bytes显示出⽂件的确切⼤⼩    autoindex_format html; # 以html的方式进行格式化,可选参数有 html | json | xml    autoindex_localtime off; # 显示的⽂件时间为⽂件的服务器时间。默认为off,显示的⽂件时间为GMT时间  }}

当访问 http://fe.xxx.com/download/ 时,会把服务器 /opt/source/download/ 路径下的文件展示出来。


http://www.ppmy.cn/embedded/44023.html

相关文章

手摸手教你uniapp原生插件开发

行有余力,心无恐惧 这篇技术文章写了得有两三个礼拜,虽然最近各种事情,工作上的生活上的,但是感觉还是有很多时间被浪费.还记得几年前曾经有一段时间7点多起床运动,然后工作学习,看书提升认知.现在我都要佩服那会儿的自己.如果想回到那种状态,我觉得需要有三个重要的条件. 其…

基于Python实现 HR 分析(逻辑回归和基于树的机器学习)【500010104】

介绍 数据集说明 此数据集包含与员工有关的综合属性集合,从人口统计细节到与工作相关的因素。该分析的主要目的是预测员工流动率并辨别导致员工流失的潜在因素。 在这个数据集中,有14,999行,10列,以及这些变量:满意度…

中国交通信息科技集团有限公司(中交信科)java开发工程师-机试题目/颂大技术面试总结/理工数传 软件开发一面二面面试总结/武汉智能视觉信息技术有限公司/高级

武汉智能视觉信息技术有限公司/高级 如果解决jvm内存溢出如果解决亿级别的数据导出,有没有其他的方案可以解决呢索引的原理工作中用了哪些索引提高了多少的速度线程池的创建方法--解释new ThreadPool的其他参数以及四大拒绝策略分布式使用用到了哪些模式xxl-job的原理作为管理…

JWT令牌

目录 介绍 JWT的组成 应用场景-登录认证 介绍 JWT,全称:JSON Web Token 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的 JWT就是将原始的json数据格式进…

Linux程序开发(十二):线程与多线程同步互斥实现抢票系统

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

安装mysql的MGR集群

说明 1、 mysql数据库主从宕机,会影响到正常业务访问,并且要手动进行切换。 2、 MHA高可用搭建复杂,代码已停止更新。 3、 MGR集群搭建方便, master故障会自动进行切换,不影响业务正常访问。 一、环境准备 1、主机说明…

BurpGPT工具分享

相关链接 BurpGPT:https://burpgpt.app/ GitHub:https://github.com/aress31/burpgpt 功能概述 BurpGPT Pro(07/05/2023-01/04/2024) BurpGPT 是我们的 Burp Suite 扩展,集成了 OpenAI 的 LLMs,可用于高级漏洞扫描和基于流量的…

【Linux】Socket中的心跳机制(心跳包)

Socket中的心跳机制(心跳包) 1. 什么是心跳机制?(心跳包) 在客户端和服务端长时间没有相互发送数据的情况下,我们需要一种机制来判断连接是否依然存在。直接发送任何数据包可以实现这一点,但为了效率和简洁,通常发送一个空包&am…