Nginx 快速入门

Nginx 简要介绍

Nginx 与 Apache

NginxApache 一样都是一种 WEB 服务器。通过 HTTP 协议提供各种网络服务。

但毫无争议的世界第一大服务器 Apache 的发展时期很长,它被设计为一个重量级的服务器。

它不支持高并发的服务器。在 Apache 上运行数以万计的并发访问,会导致服务器消耗大量内存。

操作系统对其进行进程或线程间的切换也消耗了大量的 CPU 资源,导致 HTTP 请求的平均响应速度降低。

这些都决定了 Apache 不可能成为高性能 WEB 服务器,轻量级高并发服务器 Nginx 就应运而生了。

Nginx

Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器;Nginx 可以作为一个 HTTP 服务器进行网站的发布处理;另外 Nginx 可以作为反向代理进行负载均衡的实现。

安装

参考 👉官方网站的安装教程

本文仅讨论 Nginx 在 Linux 服务器上的基本操作

Windows 系统下使用请参考 👉 传送门

关于代理

代理的理解

所谓代理就是一个代表、一个渠道;

此时就涉及到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;

如同生活中的专卖店,客人到 Adidas 专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是 Adidas 厂家,目标角色就是用户。

分类

正向代理

在如今的网络环境下,我们如果由于技术需要,需要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的

一般的思路是,找到一个可以访问海外网站的服务器,我们将请求发送给这个服务器,让他去访问国外的网站,然后将访问到的数据传递回来来达到我们的目的。

上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。

(差不多意思就是,当你通过正向代理访问 Google 并进行搜索时, Google 的服务器只清楚这个请求来自哪台代理服务器(或 ip 地址),却不知道是来自哪个客户端。因为客户端是通过代理服务器这个媒介来访访问网站的。而不用代理直接打开百度并搜索时,百度是知道这个请求是具体来自哪个客户端(或说 ip 地址)的)

总结来说:正向代理,”它代理的是客户端,代客户端发出请求”,是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

正向代理的用途
  • 访问原来无法访问的资源,如 Google 等国外技术资源
  • 可以做缓存,加速访问资源
  • 对客户端访问授权,上网进行认证
  • 记录用户访问记录(上网行为管理),对外隐藏用户信息

反向代理

先来考察一个事例:

国内某宝电商平台大家都清楚,每天访问的人数相信在双十一期间大家都有目共睹。那么他们是如何处理这个问题的呢?

分布式部署

分布式部署

直白来说就是通过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用 Nginx 进行反向代理实现的,并且通过封装 Nginx 和其他的组件之后起了个高大上的名字:Tengine。

简单理解 就是 一台 Nginx 服务器主要负责处理大量来自客户端请求,然后将这些请求分发给后台的业务服务器,那么这台负责处理请求服务器的运作方式就是反向代理。

反向代理,”它代理的是服务端,代服务端接收请求“,主要用于服务器集群分布式部署,反向代理隐藏了服务器的信息

反向代理的用途
  • 保证内网安全

    通常将反向代理作为公网访问地址,其他业务服务器是内网

  • 负载均衡

    通过反向代理服务器来优化网站的负载

基本配置方法

安装完 Nginx 后,执行 Nginx 命令。访问服务器公网 ip 地址即可看到 Nginx 的初始页面

两个位置

/etc/Nginx/

这里存放了 Nginx 的全局配置文件 Nginx.conf

或者被放在了 /usr/local/Nginx/Nginx.conf 👈 这里

其实配置文件目录下还有一个 Nginx.conf.default 文件

这个文件的作用是:当配置文件修改出错时,可以回到上一正常状态。

/usr/share/Nginx/

这里是部署项目的默认存放目录(默认的 Nginx 欢迎页就是在这个目录下)

开始配置

首先要将你的项目文件或项目目录上传到服务器上

可以到 Github 建个仓库克隆到服务器使用 scp 命令传输

具体可参考我写的利用 Linux 的 scp 命令传输文件到服务器

然后用 vi 、vim 或者 nano 等编辑器配置 Nginx.conf 文件

1
nano /etc/Nginx/Nginx.conf #此处是你的 Nginx.conf 文件路径

找到 http{ } 块,可以看到其中有一个默认的 server{ } 块的配置 👇 解释如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#设定虚拟主机配置
server {
#侦听80端口
listen 80;
#定义使之生效的请求来源的域名
server_name localhost;
#默认请求
location / {
#定义服务器的默认网站根目录位置
root /usr/share/Nginx/html;
#定义首页索引文件的名称
index index.html index.htm;
}
#定义 404 页面
error_page 404 /404.html;
#定义 50x 页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
#定义服务器的默认网站根目录位置
root /usr/share/Nginx/html;
}
}

启动 Nginx 后,访问服务器公网 ip 时显示的默认页面就是这个配置起了作用

自己来写一个简单的 server 块 👇 (假设你部署的项目在 /home/blog 下)

1
2
3
4
5
6
7
server {
listen 8000;
location / {
root /home/blog;
index index.html;
}
}

配置完后运行 Nginx -s -reload 进行配置的重载,此时访问服务器 ip 地址的 8000 端口(如:47.93.187.210:8000)就能看到自己部署的项目了!

请特别注意,这里的一个 / 或者一个 空格 可能都会影响最后部署的结果,请对照着仔细配置。

当然,这里只介绍了最基础的配置方法。

跨域问题的简单解决方案

先看代码 👇

1
2
3
4
5
6
7
8
9
10
server {
listen 8000;
location ^~/api/ {
proxy_pass https://api.readhub.cn/;
}
location / {
root /home/news;
index index.html;
}
}

项目背景:

在编写项目代码时,由于浏览器存在同源策略,直接调用 ReadHub 官方的 api (https://api.readhub.cn/),会被 block。此时用 ‘api/’ 来请求,并用 Nginx 代理到 https://api.readhub.cn/ ,浏览器便会认为你是在同一域下发起的请求而不会拦截,从而实现跨域。

关键在于这里 👇

1
2
3
location ^~/api/ {
proxy_pass https://api.readhub.cn/;
}

location 后面用正则来匹配了所有以 api 结尾的请求,并将其转发到目的 url

这里要搞清易混淆的地方

你的待部署项目主页配置应该是 👇

1
2
3
4
location / {
root /home/news;
index index.html;
}

指定当前服务器 ip 对应监听端口的返回页面(即你的项目主页)

而下面这个 👇 是你项目中请求其他页面的资源时为了解决跨域问题而特定配置的一个代理,意义就是将当前包含 /api/ 结尾的地址转发到你设置的地址,具体更多的正则匹配参考 👉Nginx location 正则写法 - 博客园

1
2
3
location ^~/api/ {
proxy_pass https://api.readhub.cn/;
}

有了这个配置后,你的项目请求 api/topic 时,就被 Nginx 代理转发到了 https://api.readhub.cn/topic 从而实现跨越。

Nginx location 的正则匹配归纳

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
location = / {
# 精确匹配 / ,主机名后面不能带任何字符串
[ configuration A ]
}

location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
[ configuration B ]
}

location /api/ {
# 匹配任何以 /api/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration C ]
}

location ^~ /api/ {
# 匹配任何以 /api/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
[ configuration D ]
}

常用正则

  • . : 匹配除换行符以外的任意字符
  • ? : 重复 0 次或 1 次
  • + : 重复 1 次或更多次
  • * : 重复 0 次或更多次
  • \d :匹配数字
  • ^ : 匹配字符串的开始
  • : 匹配字符串的介绍
  • {n} : 重复 n 次
  • {n,} : 重复 n 次或更多次
  • [c] : 匹配单个字符 c
  • [a-z] : 匹配 a-z 小写字母的任意一个

小括号 () 之间匹配的内容,可以在后面通过 $1 来引用, $2 表示的是前面第二个 () 里的内容。正则里面容易让人困惑的是 \ 转义特殊字符。

Nginx 的详细配置以及配置文件详解参考 👇

参考文章

(强烈建议阅读参考文章里的前两篇文章 👍)