谈谈Nginx
在进行项目部署、代理配置时,我们经常会用到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 | root@instance-20241116-0254:~ nginx -v |
就说明安装成功了
IF NOT
去用 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 | root@instance-20241116-0254:/ find \ -name nginx.conf |
中间这段路径就是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 | root@instance-20250309-1139:~ systemctl status nginx |
如果看到running
则说明成功启动了,反之则使用systemctl restart nginx
指令重新启动下程序。
Nginx.conf的文件结构
开始讲文件结构之前,先放出我服务器内一段主conf文件的示例,这段配置文件几乎没有改动过,与原版结构极为相似。当然,你新下载出来的conf文件也几乎是这样的,会存在基本的字段,只是大部分用#
注释掉了。(瞄一眼就好,看毛线呢 你又看不懂)
1 | user www-data; |
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 文件,它长这样
然后,我们开始配置 这个index.html
的nginx配置文件。有两种方法,一种是直接配置在 etc/nginx/nginx.conf
的主配置文件中,另一种是单独创建一个 conf 文件 然后 import到主文件中。我们选择第二种,因为这种方案在项目迁移时会更加方便。
先创建 nginxTest.conf 然后开始编辑
1 | server { |
这是一个配置好了的conf文件,Let's break down, 看看每个 指令的作用
server 块
在Nginx架构体系中,server块是最核心的配置体系块,用来定义一个虚拟主机,这个虚拟主机就是你的网站,你的服务。nginx就会根据客户端的请求头,来匹配对应的server块。
server块中的主要 指令 最常用的就是 listen
与 server_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 | root@instance-20250309-1139:~# nginx -t |
然后按理来说,如果你是配置的ip,就可以直接访问啦~
配置域名+ssl证书访问
当然,你可能不会满足ip访问的方式,让我们来加域名吧!!!
首先肯定要买一个域名吧,买完之后把域名解析到服务器的ip下
然后就要改 server块的内容了
1 | server { |
相较于上一段配置文件,增加了 listen
的 443 端口(因为https走的是443),增加了ssl_certificate
与 ssl_certificate_key
这两个指令是ssl证书及其密钥,填入它们的路径就行。
什么,你问 ssl证书和密钥 怎么来的?cf可以生成,具体的方法可以查询你的域名购买商方案。最后再放张部署图
最后 最后就基本数撒花啦~
我也写累了 QAQ
最后给个配置模板
1 | # ---------------------------------------------------------------------- |
宝塔下的Nginx
呜呜呜~ 好困 我要睡觉了~~