服务器--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-百度网盘

相关推荐
柏油6 小时前
MySQL InnoDB 行锁
数据库·后端·mysql
咖啡调调。6 小时前
使用Django框架表单
后端·python·django
白泽talk6 小时前
2个小时1w字| React & Golang 全栈微服务实战
前端·后端·微服务
摆烂工程师6 小时前
全网最详细的5分钟快速申请一个国际 “edu教育邮箱” 的保姆级教程!
前端·后端·程序员
一只叫煤球的猫6 小时前
你真的会用 return 吗?—— 11个值得借鉴的 return 写法
java·后端·代码规范
Asthenia04126 小时前
HTTP调用超时与重试问题分析
后端
颇有几分姿色7 小时前
Spring Boot 读取配置文件的几种方式
java·spring boot·后端
AntBlack7 小时前
别说了别说了 ,Trae 已经在不停优化迭代了
前端·人工智能·后端
@淡 定7 小时前
Spring Boot 的配置加载顺序
java·spring boot·后端