服务器--nginx配置及理解

0. 前言

最近公司系统被黑客攻击,内部服务集群内的各机器要进行服务器的全部迁移,并且nginx由各个项目各使用一个端口,变成了所有项目集中使用同一个端口+前缀路由模式,同时加入其他的路由匹配规则,请求转规则,安全规则配置等;在这个过程中遇到一些坑,决定梳理一下nginx的配置。

1. nginx目录结构

tree -L 2 nginx/ 命令查看nginx目录的二级文件结构,如下

csharp 复制代码
nginx/  
├── conf.d        # 用于存放服务器的额外配置目录 (默认为空)
├── fastcgi.conf  # 包含了FastCGI配置,用于FastCGI后端通信,例PHP-FPM(用于访问php文件)  
├── fastcgi_params # 包含了传递给FastCGI服务器的参数,与`fastcgi.conf`一起使用   
├── koi-utf       # 包含了字符集映射表,分别用于从koi8-r到utf-8和  
├── koi-win       # 包含了字符集映射表,从koi8-r到windows-1251的字符转换。 
├── mime.types    # 个文件定义了不同文件扩展名与MIME类型之间的映射关系 
├── modules-available      # 一般包含了所有可用的Nginx模块。  (默认为空) 
├── modules-enabled        # 包含了链接到`modules-available`中模块的符号链接
│   ├── 50-mod-http-image-filter.conf  
│   ├── 50-mod-http-xslt-filter.conf 
│   ├── 50-mod-mail.conf  
│   └── 50-mod-stream.conf  
├── nginx.conf    # Nginx的主配置文件,包含了服务器的核心配置指令
├── proxy_params  # 包含了代理服务器的配置参数,确保了后端服务器可以接收到正确的客户端信息
├── scgi_params   # 包含了与SCGI协议相关的参数
├── sites-available  # 目录包含了可用的站点配置文件,可以理解为从配置文件,若主配置文件不加载,则无用 
│   ├── default  
│   └── nginx.conf  
├── sites-enabled    # 指定哪些配置是启用的
│   └── default -> /etc/nginx/sites-available/default
├── snippets  
│   ├── fastcgi-php.conf   # 主要是处理PHP请求的FastCGI配置
│   └── snakeoil.conf      # 主要是自签名SSL证书的配置
├── uwsgi_params  # 从Windows字符集到UTF-8的映射表

需要关心的文件以及目录

  • 配置文件:在配置一台新机器需要关心的nignx配置目录是一级目录下的 nginx.config 主配置文件、以及类似sites-available下的 defaultnginx.conf 等被nginx.config文件引入的从配置文件。
  • 日志文件:执行 grep access_log /etc/nginx/nginx.conf 输出 access_log /var/log/nginx/access.log;可知访问日志存放与 /var/log/nginx/目录下。这份日志地址很重要,在配置了nginx serve后但是无法成功访问的时候,第一往往能f12 或 日志中发现关键点
  • php相关文件: 若需要使用到php,则需要注意 fastcgi.conf、fastcgi_params、snippets等文件和文件夹
  • sites-enabled文件夹:由于nginx.config 文件夹中有一句include /etc/nginx/sites-enabled/*; 所以只有在sites-enabled文件夹中重新指向了的文件配置才会生效

2. 核心配置文件解读

nginx.config 主配置文件

被注释的配置信息省略了,是如下是一份安装后的初版配置,可以理解为包含了nginx较为核心配置,加上我配置了一个基础http服务。每个配置的作用用注释来进行解释

nginx 复制代码
user www-data; # 指定 Nginx 服务以哪个用户身份运行,通常是 `www-data`

worker_processes auto; # 设置工作进程数,`auto` 表示自动按照CPU核心数分配

pid /run/nginx.pid; # 指定 Nginx 主进程的 PID 文件位置

include /etc/nginx/modules-enabled/*.conf; # 导入所有 `/etc/nginx/modules-enabled/` 中配置文件

events {
	worker_connections 768; # 每个工作进程允许的最大连接数
}

http { 
	sendfile on; # 启用高效文件传输模式,减少 CPU 使用(若不开启,则在传输文件时需要频繁切换用户态和内存态)
	tcp_nopush on; # 当使用 sendfile 时,将 HTTP 响应的头部和内容一起发送,提高网络包的效率
	tcp_nodelay on; # 禁用 Nagle 算法,减少发送数据前的等待时间,降低网络延迟
	keepalive_timeout 65; # 长连接的超时时间,单位是秒

	types_hash_max_size 2048; # 文件类型哈希表的最大大小,用于优化性能

	include /etc/nginx/mime.types; # 包含 MIME 类型的定义文件
	default_type application/octet-stream; # 默认的文件类型,如果请求的文件类型未定义,则使用此类型

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # 定义允许的 SSL 协议版本,弃用 SSLv3 以防止 POODLE 攻击
	ssl_prefer_server_ciphers on; # 优先使用服务器的加密套件

	access_log /var/log/nginx/access.log; # 访问日志文件的位置
	error_log /var/log/nginx/error.log; # 错误日志文件的位置

	gzip on; # 启用 gzip 压缩,减小传输的文件大小
        

	include /etc/nginx/conf.d/*.conf; # 导入 `/etc/nginx/conf.d/` 目录下所有的配置文件
	include /etc/nginx/sites-enabled/*; # 导入 `/etc/nginx/sites-enabled/` 目录下所有站点配置文件
        
        
        server {
            listen 80; # 监听 80 端口,这是 HTTP 的默认端口
            server_name localhost; # 定义服务器名称,这里设置为 localhost,通常会设置为域名

            root /mnt/fanqie_online/dist; # 设置网站的根目录,这里的路径是 `/mnt/fanqie_online/dist`

            error_page 400 502 503 504 /50x.html; # 定义错误页面,当 400、502、503、504 状态码出现时,将向用户显示 /50x.html

            location / {
                try_files $uri $uri/ /index.html; # 尝试按顺序提供请求的 URI、URI 对应的目录或 /index.html 文件
            } 
        }


}

值得注意的点:

  • 在配置用户身份的时候不要给nobody,否则缓存越界之后直接会导致响应抛出500,不要问为什么,问就是踩过坑
  • try_files <math xmlns="http://www.w3.org/1998/Math/MathML"> u r i uri </math>uriuri/ /index.html 这个配置,是做单页面应用,路由模式采用不带#的方式必做的

3. http 服务配置

关于使用nginx配置一个服务站点,核心要关注的是http内部的配置信息

http块中可以配置多个server块,每个server块又可以配置多个location块。

ini 复制代码
http{
   server {
        listen 80;
        server_name localhost;
        root /mnt/fanqie_online/dist;
        error_page 400 502 503 504 /50x.html;
        location / {
                try_files $uri $uri/ /index.html;
        } 
    }
}
  • 关于server块配置 每个server可以理解为一个服务

    • server_name的配置方式有三种,分别是

      js 复制代码
      精确匹配
          server {
                  listen 80;
                  server_name www.xiaolong.cn www.xiaolong.cn;
                  ...
          }
      通配符匹配,通配符不能出现在域名的中间,只能出现在首段或尾段
          server {
                  listen 80;
                  server_name  *.xiaolong.cn	www.xiaolong.*; 
                  ...
          }
      正则表达式匹配
          server{
                  listen 80;
                  server_name ~^www\.(\w+)\.com$;
                  default_type text/plain;
                  return 200 $1  $2 ..;
          }
          注意 ~后面不能加空格,括号可以取值
    • server_name指令支持通配符和正则表达式,因此在包含多个虚拟主机的配置文件中,可能会出现一个名称被多个虚拟主机的server_name匹配成功,当遇到这种情况,将有如下的优先顺序匹配规则

    makefile 复制代码
    1:准确匹配server_name
    
    2:通配符在开始时匹配server_name成功
    
    3:通配符在结束时匹配server_name成功
    
    4:正则表达式匹配server_name成功
    
    5:被默认的default_server处理,如果没有指定默认找第一个server
  • 关于 location, 每个location可以理解为服务下的一个资源集

    • uri变量是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式,那么nginx服务器在搜索匹配location的时候,是先使用不包含正则表达式进行匹配,找到一个匹配度最高的一个,然后在通过包含正则表达式的进行匹配,如果能匹配到直接访问,匹配不到,就使用刚才匹配度最高的那个location来处理请求。
    • 可以设置请求资源的目录root / alias
      • alias:用来更改location的URI
      • path为修改后的根路径。
      • index:设置网站的默认首页
      • error_page:设置网站的错误页面
      • try_files 按优先级尝试匹配
      • ...其他的代理、缓存、重写、反盗链等配置可以自行网上查询学习(或者结合文章结尾的资源学习)

4. 总结

nginx/apache等 web服务器软件 的配置是服务器配置的重要环节,也是初始环节,如果需要让服务器提供对外服务,必不可少的需要接触到nginx类型服务器配置,如果掌握不够深度,很容易出现一个配置反反复复折腾几个小时的情况,因此仔细掌握nginx常见的配置方法,并且进行实践、总结,可以让自己对nginx工作原理有自己的理解与认识。

若刚接触nginx,http模块中的location匹配优先级等规则,root/alias用法,代理是几个必须要进行实践,去探究其工作原理的。

资源推荐: 黑马nginx-百度网盘

相关推荐
捂月37 分钟前
Spring Boot 核心逻辑与工作原理详解
java·spring boot·后端
Nightselfhurt1 小时前
RPC学习
java·spring boot·后端·spring·rpc
Estar.Lee8 小时前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
2401_8576100310 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全
凌冰_10 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
码农飞飞10 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货10 小时前
Rust 的简介
开发语言·后端·rust
AskHarries10 小时前
如何将Spring Cloud Task发布Data Flow上执行?
java·后端·spring cloud
monkey_meng11 小时前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
Estar.Lee11 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip