目录

前端 10 问之 Nginx (第一篇)

1、nginx 的作用

静态资源服务

  • 浏览器缓存
  • 防盗链
  • 资源压缩
  • 限流

代理服务

  • 正向代理
  • 反向代理
  • 负载均衡

2、nginx 和 apache 的区别?

  • 轻量级,同样起 web 服务,比 apache 占用更少的内存及资源
  • 抗并发,nginx 处理请求是异步非阻塞的,而 apache 则是阻塞型的,在高并发下 nginx 能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简单

最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程;nginx 是异步的 epoll 模型,多个连接(万级别)可以对应一个进程。

3、nginx 配置文件的一般结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
worker_processes  1;                		# worker进程的数量
events {                              	# 事件区块开始
  worker_connections  1024;          		# 每个worker进程支持的最大连接数
}
http {                                  # HTTP 区块开始
  server {            		    	        # 第一个Server区块开始,表示一个独立的虚拟主机站点
    listen       80;     		            # 提供服务的端口,默认80
    server_name  localhost;    		      # 提供服务的域名主机名
    location / {            	          # 第一个location区块开始
      root   htm;       		            # 站点的根目录,相当于Nginx的安装目录
      index  index.html index.htm;    	# 默认的首页文件,多个用空格分开
    }          				                  # 第一个location区块结果
  }
}

4、都说 nginx 性能高,为什么 nginx 性能这么高?

因为 nginx 是用来异步非阻塞事件处理机制:运用了 epoll 模型,通过异步、非阻塞的方式来处理请求

5、如何重启?

1
nginx -s reload

6、nginx 校验配置文件是否正确

校验默认配置文件:

1
2
3
4
nginx -t
# out:
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful

校验指定配置文件:

1
nginx -t -c [config-path]

7、alias 与 root 的区别?

问题:

在当前的 web server 的根路径下,需要配置 /website 来匹配系统路径下 /usr/my-website/dist 中的静态资源文件,需要如何配置?

回答:

可以使用别名来配置:

1
2
3
4
location /website {
  alias  /usr/my-website/dist;
  index  index.html index.htm;
}

上面的配置,很多人会将 alias 配置成 root,这样会有问题,这会导致网络请求 /website 下的资源文件时,实际请求的是 /usr/my-website/dist/website 路径下的资源文件,这会导致找不到文件而报 404。

所以这里需要使用别名来配置,换成 alias 时,请求 /website 下的资源文件时,可以正确请求到 /usr/my-website/dist 下的资源文件。

相关链接: stackoverflow question

8、server_name 有什么作用?

在实际的生产环境,公网 ip 是很有限的,经常会出现一个 ip 多个业务系统公用,这时候就可以用 server_name 来匹配 http request header 里 host 字段,来实现同 ip 不同域名的需求。

例如:domain.com 和它的二级域名 demo.domain.com 配置在同一个公网 ip 上,这时候可以通过 server_name 来提供分别提供 http 服务:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
http {
  server {
    listen 80;
    server_name domain.com;
    return 200 hello;
  }

  server {
    listen  80;
    server_name demo.domain.com;
    return 200 world;
  }
}

上面的配置请求 domain.com 会返回 hello,请求 demo.domain.com 会返回 world。

9、nginx location 匹配规则

修饰符类型有下面 4 种:

  • = 开头表示精确匹配,命中后不再进行后续的查找
  • ^~ 开头表示 uri 以某个常规字符串开头,不是正则匹配,命中后不再进行后续的查找
  • ~ 开头表示区分大小写的正则匹配
  • ~* 开头表示不区分大小写的正则匹配

当有多条 location 规则时,nginx 有一套比较复杂的规则,优先级如下:

location = > location 完整路径 > location ^~ 路径前缀 > location ~*/~ 正则 > location 路径前缀 > /

  1. 精确匹配 =,命中后使用它的配置。
  2. 查找是否有不带修饰符的完整匹配,如何命中,使用它的配置。
  3. 前缀匹配 ^~,命中后不再进行其他低优先级匹配,在精确匹配中选择最长匹配的项并使用它的配置。
  4. 按文件中顺序的正则匹配 ~~*,如果匹配则停止查找,使用命中的配置。
  5. 匹配不带任何修饰的前缀匹配,选择最长匹配的项并使用它的配置

相关链接: Nginx 匹配规则 彻底弄懂 Nginx location 匹配

10、nginx 常见优化方式

1、CPU 内核亲容

1
worker_processes 16;

2、每个 worker 最大并发连接数

1
2
3
4
events {
  use epoll;
  worker_connections 10240;
}

3、使用零拷贝

1
sendfile on;

4、优化日志打印

减少或消除不必要的日志记录,可以节省服务器上的磁盘存储、 CPU 和 I/O 操作。

(1)、禁用对页面资源请求的日志记录

1
2
3
location ~* \.(?:jpg|jpeg|gif|png|ico|woff2|js|css)$ {
  access_log off;
}

(2)、禁用成功请求的日志记录

(3)、使用缓冲最小化 I/O 操作

5、开启 gzip 压缩

1
2
3
4
5
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;

参考文章: Help the World by Healing Your NGINX Configuration