nginx学习笔记

博主原创文章,转载请说明出处,但是不说我也管不了你🏳️

前言

本文首先会介绍nginx的基本特点,随后会介绍在Linux系统中如何配置nginx,来实现基本的web静态内容管理以及实现反向代理。更多内容可直接查询nginx官网,比较全。

正文

一、什么是nginx

1.1 nginx的出生

nginx(engine x)的最初概念于2002年诞生,在当时互联网正处于爆发期,nginx的最初作者Igor Sysoev与其余工程师都面临着一个共同问题:C10K问题(英:C10K problem,concurrentlyhandling ten thousand connections problem),该问题旨在解决如何处理超过 10,000 个并发连接。

起初Igor Sysoev尝试通过在Apache服务器上的改进来提升并发性能,只不过显然这样提升十分有限,于是Igor Sysoev决定开发一个全新的软件——即nginx雏形。

2004年10月4日,nginx第一个公开发行版公布。

1.2 nginx支持的服务

nginx最典型的使用方式就是将其部署于其他(例如Apache)服务器之前,而nginx可提供静态文件,并代理和缓冲应用服务器的动态内容。如果你加钱,nginx的商业版本还提供了流量管理和监控功能。一般来说,nginx可以提供以下功能:

  • 作为一个基本的HTTP web服务器
  • 为服务器提供反向代理
  • 为服务器实现响应内容缓存
  • 为服务器集群实现负载均衡
  • 作为一个基本的TCP/UDP代理服务器
  • 作为一个邮件代理服务器

关于nginx具体能提供的服务,请参考nginx官网首页的简述。

1.3 nginx的特点

nginx因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。作为一款轻量级的Web和反向代理服务器,nginx占用内存少、能支持高并发且并发能力很强。最后,nginx其实还有个特点,就是“配置可编程”,即用编程的方式去管理nginx的配置,编程语言用的是NGINX JavaScript (njs)

二、nginx安装与启动

本文将在Ubuntu 18.04.6 LTS版本下演示nginx的安装与启动,其余系统大同小异,具体可参见官网文档。

2.1 检查nginx安装情况

查看是否已经安装nginx,如图查询结果为空说明未安装:

1
sudo apt list --installed | grep nginx
未安装nginx

【注:为啥会有这一步?因为我用的腾讯云现成的轻量级宝宝式一站全套一条龙服务器,可能啥都给我装好了,这一步是看看到底装没有】

2.2 选择合适的nginx版本

1
sudo apt list | grep nginx
超多版本任你选

可以看到除了第一个“纯洁”的nginx,后面几个nginx都有后缀。不带后缀的实际只是nginx的安装依赖包,有后缀的才是要装的nginx,不同后缀代表不同的版本,各版本的差异可以在debian的nginx仓库里面看到,这里只说三种重要的:

  • core: 标准的 nginx 部署版本
  • full: 在 core 版本的基础上,包含了常用的三方模块
  • light: 简化版

这里就装原生态的core版本:

1
sudo apt install nginx-core
安装nginx-core版本

输入确认“Y”,等两秒安装完成。

2.3 查看nginx版本,确认安装完成

1
nginx -v
查看nginx版本

如图可以看到安装已完成。【注:如果显示command not found,则有可能是安装错误或者是环境变量未配置,请读者自行百度解决办法。nginx一般的安装路径在/usr/local/nginx/或者/etc/nginx/或者/usr/local/etc/nginx/】

2.4 启动nginx并查看运行状态

1
2
sudo nginx
ps aux | grep nginx
启动nginx

如图,启动nginx后可以看到有一个master进程和多个工作进程正在运行。

输入netstat命令查看本机端口号情况:

1
sudo netstat -tulnp | grep :80
查看端口

可以看到nginx已经在使用80端口号,即可以响应HTTP请求了【前提是防火墙开了80端口】。此时可以使用ifconfig查看本机ip,并使用位于同一局域网的设备的浏览器访问本机ip地址,结果如图:

nginx欢迎界面

2.5 nginx的文件目录结构

【注:感觉这个版本nginx安装目录四处开花,故对整体目录结构说明省略,主要关注重要文件】

  • nginx配置文件:nginx有两个配置文件,一个是主配置文件nginx.conf,另一个可以算成类似于“引入库”的配置文件,位于conf.d目录下。可以在nginx.conf文件中配置include参数引入位于conf.d目录下的配置文件,使其生效。例如:若conf.d/etc/nginx/目录下,则可以通过配置include /etc/nginx/conf.d/*.conf;来引入位于conf.d目录下的所有.conf配置文件,使其生效。

  • nginx二进制文件:用于启动执行nginx的各种命令,一般位于xx/sbin/目录下,可能为/usr/local/nginx/sbin/或者/usr/sbin/或者其他目录下。

  • nginx静态html文件:默认的index.html文件即“Welcom to nginx!”界面文件一般位于xx/html目录下,可能为/usr/local/nginx/html/或者/usr/share/nginx/html/或者其他目录下。

三、nginx的配置

3.1 配置文件结构

nginx实际由多个模块组成,而这些模块实际由配置文件中指定的指令控制。nginx配置文件中的指令分为两种:简单指令和块指令。【注:这是官网的说法,把这些参数配置说成为指令(directive)】

  • 简单指令:由一个指令名和若干参数组成,各指令、参数用空格分隔开来,并以;结尾。例如:pid /var/run/nginx.pid,使用了pid指令,其参数为/var/run/nginx.pid,整条指令指示了nginx.pid的文件路径。
  • 块指令:由一个名称和一组指令组成,指令用{}括住,括号里面的指令和普通指令结构相同。例如:
1
2
3
4
5
6
7
http{
sendfile on;
gzip on;
}
#以上块指令让nginx的http模块执行两个了普通指令:
#`sendfile on;`使nginx在发送文件前不必将其复制到缓冲区。
#`gzip on;`使nginx开启gzip压缩功能。

nginx.conf配置文件中默认有三大块:全局块、events块和http块。实际上可以认为nginx.conf文件内容就是一个大的块指令,例如有如下nginx配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#全局块配置
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

#events块配置
events {
//...
}

#http块配置
http {
//...
}

//...

【注:配置文件中#后面的一行内容将被视为注释】

3.2 配置nginx的静态资源服务

打开nginx.conf配置文件,可以看到里面已经默认有了http块:

nginx默认配置

在http块下新建一个server块,如下结构:

1
2
3
4
http{
server{
}
}

随后在server块中添加location块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http{
server{
listen 80;#监听的端口
server_name localhost;#请求的服务器名,localhost就是本地

#若请求localhost:8080/web/,则会直接返回
#/usr/share/nginx/html下的index.html文件
location /web/ {
root /usr/share/nginx/html;
}

#若请求localhost:8080/img/123.jpg,如果文件存在
#则会直接返回/usr/share/nginx/images123.jpg
location /img/ {
root usr/share/nginx/images;
}
}
}

保存文件后,如果nginx已启动,则可以使用:

1
nginx -s reload

让nginx直接重新读取配置而不必重启。随后可以尝试访问本地8080端口看看效果:

1
curl localhost:80/web/
返回了自定义index页面

由此完成了nginx静态资源的简单配置。

3.3 配置nginx实现反向代理

保持上面内容不变,为了简便起见,就用nginx反向代理自己,原地开始套娃。在http块内新增一个server块如下:

1
2
3
4
5
6
7
8
9
10
11
12
http{
server{
listen 9990;
server_name localhost;

location / {
#localhost:9990的请求转发到80端口去
#后面参数可以是:其余域名或者ip地址
proxy_pass localhost:80/web/;
}
}
}

保存文件后nginx再reload一下,之后测试一下访问:

1
curl localhost:9990
9990端口被代理到80端口

代理成功,完结。

参考资料

  1. nginx,nginx官网[EB/OL],https://nginx.org/en ↩︎