谈谈Nginx

Yuan.Sn

在进行项目部署、代理配置时,我们经常会用到nginx这个“东西”。在WIKI中是这样定义的:

Nginx is a web server that can also be used as a reverse proxy, load balancer, mail proxy and HTTP cache.

是的,Nginx就是一个web server 管理着用户对服务器访问的一系列规则。文皱皱的? OK,举个nginx应用场景的例子:我有一台服务器跑着一个服务(比如说我的blog?然后这个服务存储在我服务器 /www/wwwroot/blog.geekie.site/index.html 的路径下,它是一个html的静态文件,然后突然有一天,小明突然心血来潮,想扒一扒我的“黑历史”,那他怎么才能够访问我这个html博客呢?当然,直接肯定不能访问的,因为它(.html)是一个静态文件,没有任何的listen程序。所以,我们就可以用Nginx代理了。
nginx可以在电脑内映射一个端口比如说 4000?,然后通过 ip+端口就能访问这个程序了 http://64.181.246.86:4000 。当然nginx能做的远远不只于这些,它可以 加域名 http://blog.geekie.site 加ssl证书 https://blog.geekie.site 进行反向代理 etc。总之 总之,nginx是玩机生涯中必须接触到的概念之一。

先在CLI(command line interface 俗称 黑框框)中输入 nginx -v 看看有没有安装过吧:

如果有对应的输出,像这样

1
2
root@instance-20241116-0254:~ nginx -v
nginx version: nginx/1.27.4

就说明安装成功了
IF NOT

https://nginx.org/en/linux_packages.html

去用 adp/yum 安装吧,没人无聊到会自己编译源码QAQ吧

核心概念 nginx.conf

谈到nginx,最核心 也是仅仅只需要我们掌握的 就是他的.conf文件的配置。
ok,那么问题来了。一般.conf的文件路径在哪里?

By default, the configuration file is named nginx.conf and placed in the directory /usr/local/nginx/conf, /etc/nginx, or /usr/local/etc/nginx.

官方文档列出了几个常见的nginx.conf路径,如果任然找不到,可是试试 find 指令

1
2
3
4
5
6
7
root@instance-20241116-0254:/ find \ -name nginx.conf
/www/server/nginx/src/conf/nginx.conf
/www/server/nginx/conf/nginx.conf
/etc/nginx/nginx.conf

root@instance-20241116-0254:/ whereis nginx
nginx: /usr/bin/nginx /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/local/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz

中间这段路径就是nginx的conf文件

/www/server/nginx/src/conf/nginx.conf
/www/server/nginx/conf/nginx.conf
/etc/nginx/nginx.conf

你可能会好奇,为什么存在这么多conf文件。其实这个问题也在早期困扰着我,当时部署一个项目需要用到8443端口,当nginx -s reload时候,始终发现8443端口被占用,再一查pid 发现就是nginx占用的。kill之后再重启就好了,但是过不久又会出现问题。
后来发现,是宝塔面板的nginx跟adp安装的nginx在“打架”。所以安装了宝塔面板的小伙伴们要注意下来。现在文章会分为两个部分,一种是CLI(command line interface)的Nginx介绍 另外一种是宝塔面板的nginx介绍。
~~ok,这里是写完了CLI的后期,宝塔你们先自己去研究吧,就是"点点点"的事情 多点几下就好了,然后等我哪天心情好了再写 hhh~~~~~

CLI下的Nginx

原版的nginx大多都不安装在 /www 目录下 (因为宝塔的nginx文件装在了这里),一般在 etc/nginx 当中。在配置nginx之前,先把常用的nginx指令列出来(瞄一眼就好):

命令 作用说明
sudo nginx 启动 NGINX 服务。
sudo nginx -s stop 快速停止 NGINX 服务。
sudo nginx -s quit 优雅地停止 NGINX 服务。
sudo nginx -s reload 重新加载 NGINX 配置。
sudo nginx -s reopen 重新打开 NGINX 日志文件。
sudo nginx -t 测试 NGINX 配置文件的语法。
`sudu px aux grep nginx`

安装完nginx后,可以先看看nginx的运行状态,使用sysemcrl status nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
root@instance-20250309-1139:~ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Tue 2025-07-15 07:00:36 UTC; 2 days ago
Docs: man:nginx(8)
Main PID: 3985179 (nginx)
Tasks: 3 (limit: 1086)
Memory: 14.2M (peak: 60.4M)
CPU: 35.703s
CGroup: /system.slice/nginx.service
├─3985179 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
├─3985180 "nginx: worker process"
└─3985181 "nginx: worker process"

如果看到running则说明成功启动了,反之则使用systemctl restart nginx指令重新启动下程序。

Nginx.conf的文件结构

开始讲文件结构之前,先放出我服务器内一段主conf文件的示例,这段配置文件几乎没有改动过,与原版结构极为相似。当然,你新下载出来的conf文件也几乎是这样的,会存在基本的字段,只是大部分用#注释掉了。(瞄一眼就好,看毛线呢 你又看不懂)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;

events {
worker_connections 768;
# multi_accept on;
}

http {

##
# Basic Settings
##

sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
client_max_body_size 100m;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# SSL Settings
##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

##
# Logging Settings
##

access_log /var/log/nginx/access.log;

##
# Gzip Settings
##

gzip on;

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

##
# Virtual Host Configs
##

#serve块
include /etc/nginx/conf.d/*.conf;
#include /etc/nginx/sites-enabled/*;
include /var/www/img_host/EasyImages2.0/*.conf;
include /var/www/nginx_test/*.conf;

}

nginx.conf分为全局设置以及局部设置,etc/ngninx/nginx.conf里的文件就是全局设置,现在先放一段官方文档对 conf文件 结构的描述,能看就看,反正我觉得不好看(不如看下面我说的):

nginx consists of modules which are controlled by directives specified in the configuration file. Directives are divided into simple directives and block directives. A simple directive consists of the name and parameters separated by spaces and ends with a semicolon (;). A block directive has the same structure as a simple directive, but instead of the semicolon it ends with a set of additional instructions surrounded by braces ({ and }). If a block directive can have other directives inside braces, it is called a context (examples: events, http, server, and location).

反正大概意思就是:Nginx的模型是指令(directives)控制的,这些指令写在conf中,然后这些指令可以是单独的,就像示例配置文件第1,2行的user,worker_processes这些指令一样,分别控制着:nginx运行的用户身份,worker的数量(worker的解释详细看进阶)。然后指令不仅可以是单个的,也可以是一个(block)。像conf文件第2个块 http{} 块,就定义和管理了所有http/https网络协议的相关配置。

其实它有很多很多 指令(directives),按照道理来说就是,你想让你的服务具备什么样子的特性(比如说想加域名啦,想加ssl啦 etc)就可以根据这些特性的排列来实现。然后这些指令就在这里
是不是看的已经“头昏眼花”了,哈哈哈 我也是。所以,下文我会根据几个实际例子,部署出常见的模板,大家套用模板就好啦~~

Nginx对静态文件的代理

Nginx 对静态文件(比如说一张单图片,一个静态html文件)的处理,需要一个 server块,块中还要包含两个location ,并且这个server块需要包含在http块当中。ok,具体看下面的例子,我现在有个 .html 文件,它长这样

然后我把它放在了服务器的 `/var/www/nginx_test`目录下

image
image

然后,我们开始配置 这个index.html的nginx配置文件。有两种方法,一种是直接配置在 etc/nginx/nginx.conf的主配置文件中,另一种是单独创建一个 conf 文件 然后 import到主文件中。我们选择第二种,因为这种方案在项目迁移时会更加方便。

先创建 nginxTest.conf 然后开始编辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 81;
server_name testhtml.geekie.site;
root /var/www/nginx_test;
index index.html index.htm;

# location块定义了nginx是如何处理URL请求,'/' 是一个前缀匹配,它会匹配所有请求,但通常作为最后的选择。
location / {
root /var/www/nginx_test;
index index.html;
}

location ~\.(png|jpg|gif)$ {
root /var/www/nginx_test/img_test;
}
}

这是一个配置好了的conf文件,Let's break down, 看看每个 指令的作用

server 块

在Nginx架构体系中,server块是最核心的配置体系块,用来定义一个虚拟主机,这个虚拟主机就是你的网站,你的服务。nginx就会根据客户端的请求头,来匹配对应的server块。

server块中的主要 指令 最常用的就是 listenserver_name

listen 81;

listen表示监听的端口和IP地址,nginx会一直监听客户端对这个81端口的访问请求,然后把请求 路由 到location中的路径中。listen的值可以填写任意端口地址,但是要注意的是,需要在云服务端打开对应的端口。可以用过这个网站 查看端口的开放情况。

server_name testhtml.geekie.site;

server_name表示服务的地址,可以写域名,也可以写对应服务器的IP。

server块中内嵌了 location块,记录了路由的地址,当server块匹配到客户端的请求之后,就会把请求路由到location块中的指定地址当中。

location / {
root /var/www/nginx_test;
index index.html;
}

location ~.(png|jpg|gif|ico)$ {
root /var/www/nginx_test/img;

}

因为我们已经将路由的 根(root)设置到了 var/www/nginx_test路径下,当访问到 https://testhtml.geekie.site 时,nginx 就会自动路由到 该路径下的 index.html文件。如何想要访问/var/www/nginx_test/img下的图片,就需要 https://testhtml.geekie.site/610UOC8xZpL._AC_UY1000_.jpg

将局部 server 块 导入主conf文件中

前文提到,我们采取了server块独立的方案,所以我们还需要把server块 import到主配置文件当中。直接在主server块中导入就行:

include /var/www/nginx_test/*.conf;

配置完成之后可以使用nginx -t指令验证是否更改正确,如果出现 successful 则使用nginx -s reload重载配置文件

1
2
3
4
5
root@instance-20250309-1139:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@instance-20250309-1139:~# nginx -s reload
2025/07/19 05:10:08 [notice] 691270#691270: signal process started

然后按理来说,如果你是配置的ip,就可以直接访问啦~

image
image

配置域名+ssl证书访问

当然,你可能不会满足ip访问的方式,让我们来加域名吧!!!
首先肯定要买一个域名吧,买完之后把域名解析到服务器的ip下

image
image

然后就要改 server块的内容了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 81;
listen 443 ssl http2;

server_name testhtml.geekie.site;
root /var/www/nginx_test;
index index.html;

# --- SSL 证书配置 ---
ssl_certificate /var/www/nginx_test/ssl/certificate.crt; # 证书文件
ssl_certificate_key /var/www/nginx_test/ssl/private.key; # 私钥文件

location / {
root /var/www/nginx_test;
#proxy_pass http://localhost:80;
index index.html;
}

location ~\.(png|jpg|gif|ico)$ {
root /var/www/nginx_test/img;
}
}

相较于上一段配置文件,增加了 listen的 443 端口(因为https走的是443),增加了ssl_certificatessl_certificate_key这两个指令是ssl证书及其密钥,填入它们的路径就行。
什么,你问 ssl证书和密钥 怎么来的?cf可以生成,具体的方法可以查询你的域名购买商方案。最后再放张部署图

image
image

image
image

image
image

最后 最后就基本数撒花啦~
我也写累了 QAQ

最后给个配置模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# ----------------------------------------------------------------------
# HTTP (端口 80) 服务器块
# 作用: 将所有 HTTP 请求永久重定向到 HTTPS
# ----------------------------------------------------------------------
server {
listen 80;
listen [::]:80; # 同时监听 IPv6 地址

# 填写你的域名
server_name testhtml.geekie.site;

# 将所有请求通过 301 永久重定向到对应的 HTTPS 地址
# $host 会自动获取请求的域名 (testhtml.geekie.site)
# $request_uri 会获取请求的路径和参数 (例如 /page?id=1)
return 301 https://$host$request_uri;
}

# ----------------------------------------------------------------------
# HTTPS (端口 443) 服务器块
# 作用: 处理所有安全的 HTTPS 流量
# ----------------------------------------------------------------------
server {
# --- 基础监听配置 ---
listen 443 ssl http2; # 在 443 端口上监听,并启用 SSL 和 HTTP/2
listen [::]:443 ssl http2; # 同时监听 IPv6 地址

# 填写你的域名
server_name testhtml.geekie.site;

# --- SSL 证书配置 ---
# !! 重要 !!
# 请将下面的路径替换为你的 SSL 证书文件和私钥文件的实际路径。
# 通常使用 Let's Encrypt 获取免费证书,路径可能如下所示。
ssl_certificate /etc/letsencrypt/live/testhtml.geekie.site/fullchain.pem; # 证书文件
ssl_certificate_key /etc/letsencrypt/live/testhtml.geekie.site/privkey.pem; # 私钥文件

# --- 推荐的 SSL 安全增强配置 ---
ssl_protocols TLSv1.2 TLSv1.3; # 使用安全的协议版本
ssl_prefer_server_ciphers on; # 优先使用服务端的加密套件
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;


# --- 网站根目录和默认文件 ---
# 将 root 和 index 定义在 server 级别,对所有 location 生效,避免重复
root /var/www/nginx_test;
index index.html;

# --- Location 路径匹配规则 ---

# 处理所有常规请求
location / {
# 尝试按顺序查找文件:
# 1. $uri: 查找与请求 URI 完全匹配的文件 (如 /about.html)
# 2. $uri/: 如果是目录,则查找该目录下的 index 文件 (如 /products/ -> /products/index.html)
# 3. =404: 如果都找不到,则返回 404 错误
try_files $uri $uri/ =404;
}

# 单独处理图片请求
# 注意: 这个 location 会覆盖上面 server 级别的 root 设置
location ~\.(png|jpg|gif|ico)$ {
# 为图片指定一个不同的根目录
root /var/www/nginx_test/img;
# 可以为图片设置浏览器缓存,提升访问速度
expires 30d;
add_header Cache-Control "public";
}

# 禁止访问隐藏文件,增加安全性
location ~ /\. {
deny all;
}
}

宝塔下的Nginx

呜呜呜~ 好困 我要睡觉了~~

Comments