Nginx笔记

Posted by saltyfishyjk on 2023-04-20
Words 2k and Reading Time 8 Minutes
Viewed Times

Nginx笔记

Part 0 前言

参考资料:

Nginx音标为/'endʒɪneks/,读音为engine x

Nginx适合承担HTTP服务器和反向代理服务器的工作,也可以提供方便的静态资源配置与访问。

同时,Docker提供了不错的对Nginx的封装,很适合将其加入CI/CD工作流。

Part 1 安装

环境:Ubuntu 20.04

Ubuntu下安装Nginx的难度不大,没有什么坑。

  • sudo apt-get install nginx

TODO:忘记记录怎么启动起来的nginx服务了,好像执行过sudo nginx -tsudo nginx -s reload

Part 2 配置文件nginx.conf结构

参考资料:

概述

Nginx的命令行参数不多,配置文件nginx.conf是Nginx服务的核心,这决定了Nginx和其模块的工作方式。

默认情况下,nginx.conf放在/usr/local/nginx/conf/etc/nginx/usr/local/etc/nginx 中。因此,当利用Docker构建CI/CD时,需要注意将仓库中的nginx.conf文件移动到容器的合适位置。具体地,笔者曾在Dockerfile中用过COPY nginx.conf /etc/nginx/nginx.conf

VSCode提供了NGINX Conf插件,适合用来高亮文本和格式化文档。

nginx组成

nginx由模块(module)组成,模块由配置文件(nginx.conf)中的指令(directives)控制。指令又分为简单指令(simple directive)和块指令(block directive)。

指令

  • 简单指令

    • 结构:名称和参数组成,由空格分隔,以;结尾
    • 形如:[名称] [参数];
  • 块指令

    • 结构:和简单指令相同,但不以;结尾,而是以一组由{}包围的附加指令结尾。
    • 形如:[名称] [参数] {若干附加指令}

如果块指令的{}中可以包含其他指令,那么它被称为上下文(context)。

上下文

上下文包括:

  • events
  • http
  • server
  • location

配置文件中在所有上下文之外的指令被认为是在主(main)上下文中。比如,eventshttpmain上下文中;serverhttp上下文中;locationserver上下文中。因此可以形如:

1
2
3
4
5
6
7
8
9
10
11
12
13
user nginx; # 简单指令,在main中
worker_processes 1; # 简单指令,在main中
events {
worker_connections 1024; # 简单指令,在events中
} # 块指令,在main中
http {
server {
listen 80; # 简单指令,在server中
location / {
root /app; # 简单指令,在location中
} # 块指令,在server中
} # 块指令,在http中
} # 块指令,在main中

Part 3 main context

参考资料:

main 上下文是默认上下文,不显示声明,任何不隶属于任意其他上下文的指令均被认为是在main上下文中。

e.g.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
user nginx; # 配置用户或用户组,格式为user user [group]默认为user nobody nobody,用于精确管理权限
worker_processes 1; # 允许生成的进程数,默认为1
pid /var/run/nginx.pid # 指定nginx进程运行文件的存放地址
error_log /var/log/nginx/error.log warn; # 指定日志路径和级别,本设置可以放入main, http, server;级别包括debug|info|notice|warn|error|crit|alert|emerg
events { # events块,在后续介绍
# codes
}
http { # http块,在后续介绍
# codes
server { # server块,在后续介绍
# codes
location { # location块,在后续介绍
# codes
}
location {
# codes
}
}
server {
# codes
}
}

Part 4 events context

参考资料:

events模块包含了Nginx中处理连接的设置。

e.g.

1
2
3
4
5
6
7
8
9
10
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; # 最大连接数,默认为512
client_header_buffer_size 4k;
open_file_cache max=2000 inactive=60s;
open_file_cache_valid 60s;
open_file_cache_min_uses 1;
}

常用设置是worker_connections,其余配置没有特殊需求可以保持默认,即,不添加描述字段。

Part 5 http context

参考资料:

e.g.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
http {
include /etc/nginx/mime.types; # 文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型,默认为text/plain
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;
sendfile on;
keepalive_timeout 65;
server {
# codes
location {
# codes
}
location {
# codes
}
}
server {
# codes
}
}

include

将文件扩展名与文件类型映射表包含或另一个文件到当前配置中。mine.types形如:

1
2
3
4
5
6
7
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
# ...
}

也可以使用include引入其他的server配置文件。

default_type

设置默认处理方式。

keepalive_timeout

设置web服务器处理完一个请求后保持这个TCP连接的时间,Nginx默认为75秒。

Part 6 server

参考资料:

在Nginx中,一个server配置块代表了一个虚拟机主机。

虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成多台 “虚拟” 的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的 Internet 服务器功能(WWW、FTP、Email 等等),同一台主机上的虚拟主机之间是完全独立的。

从网站访问者来看,每一台虚拟主机和一台独立主机完全一样。

利用虚拟主机,不用为每个要运行的网站提供一台单独的 Nginx 服务器或单独运行一组 Nginx 进程。虚拟主机提供了在同一台服务器、同一组 Nginx 进程上运行多个网站的功能。

e.g.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
server_name localhost;
access_log logs/host.access.log main;
location / {
# codes
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
# codes
}
location /prod-api {
# codes
}
}

listen

Nginx通过listen指令指定的值监听网络请求,可以是IP协议,也可以是UNIX域套接字。若不设置listen指令,Nginx以超级用户运行时监听80端口,非超级用户运行时监听8000端口。

listen指令的值提供了丰富的参数,具体可以参考server 配置块介绍 - 人人编程网

server_name

server_name指令主要用于配置基于名称的虚拟主机,在接收到客户请求后的匹配顺序为准确的server_name匹配 > 以*通配符开始发字符串 > 以*通配符结束的字符串 > 正则表达式,具体可以参考server 配置块介绍 - 人人编程网

access_log

用于指定日志文件的存放路径和格式。

Part 7 location

参考资料:

location配置块用来配置匹配的不同请求URL的处理方式。location块只能在server块中配置。

e.g.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 80;
server_name localhost;
location / {
root /app;
index index.html;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /prod-api {
rewrite ^/prod-api/(.*)$ /$1 break;
proxy_pass http://101.43.219.110:8080/; #后台接口地址
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
}

location

  • 格式

    1
    2
    3
    location [ = | ~ | ~* | ^~ ] /URL {
    # ...
    }
  • 参数说明

    • 空:表示前缀匹配,代表跟请求中的URL从头开始匹配。
    • =:用于标准URL前,要求精确匹配,成功则立即处理,Nginx停止搜索其他匹配。
    • ^~:用于标准URL前,要求一旦匹配就会立即处理,不在匹配其他正则URL,一般用来匹配目录
    • ~:用于正则URL前,表示URL包含正则表达式,区分大小写
    • ~*:用于正则URL前,表示URL包含正则表达式,不区分大小写

命名location

暂时没有用过,可以参考location 配置块介绍 - 人人编程网

URL匹配顺序

可以参考location 配置块介绍 - 人人编程网

proxy_pass

用来设置代理服务器的映射地址,可以使用http或https协议,地址可以使用域名、IP和可选端口。

Part 8 图床与静态资源

Part 9 Vue项目打包与部署

Part 10 Docker部署


This is copyright.