Nginx 简要介绍

Nginx 与 Apache

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

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

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

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

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

nginx

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

安装

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

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

关于 Windows 系统上的使用请参考👇

Windows下nginx安装、配置与使用 - 脚本之家

关于代理

基本配置方法

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

两个位置

开始配置

1
2
3
nano /etc/nginx/nginx.conf #此处应使用你的 nginx.conf 文  件路径
vi /etc/nginx/nginx.conf #此处应使用你的 nginx.conf 文件 路径
vim /etc/nginx/nginx.conf #此处应使用你的 nginx.conf 文 件路径

vi vim nano 的使用方法不清楚的话,请自行找搜索引擎解决

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 时显示的默认页面就是这个配置起了作用

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 ]
}

常用正则

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

参考文章

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