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下的 default 、nginx.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匹配成功,当遇到这种情况,将有如下的优先顺序匹配规则
makefile1:准确匹配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-百度网盘