Nginx
本文最后更新于:8 个月前
与Apache相比,Nginx是更轻量高效的Web服务器,更适用来提供静态资源服务
Nginx
一、简介
Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是,Nginx 是免费的并可以商业化,配置使用也比较简单。
Nginx 的最重要的几个使用场景:
静态资源服务,通过本地文件系统提供服务;
反向代理服务,延伸出包括缓存、负载均衡等;
虚拟主机,一台服务器虚拟出多个网站
安全管理,搭建API接口网关,对每个接口服务进行拦截
限流,限制用户请求速度,防止服务器受不了
Nginx 和 Node.js 的很多理念类似,HTTP 服务器、事件驱动、异步非阻塞等,且 Nginx 的大部分功能使用 Node.js 也可以实现,但 Nginx 和 Node.js 并不冲突,都有自己擅长的领域。
- Nginx 擅长于底层服务器端资源的处理(静态资源处理转发、反向代理,负载均衡等)
- Node.js 更擅长上层具体业务逻辑的处理
两者可以完美组合,共同助力前端开发。
二、安装Nginx
1、安装命令
1 |
|
2、相关文件
1 |
|
- 主配置文件:
/etc/nginx/nginx.conf
- 默认web目录:
/etc/share/nginx/html/
3、运行Nginx
1 |
|
之后我们输入正确的URL,就可以看到默认页面了
4、查看Nginx状态
1 |
|
5、前置准备
想要正常访问nginx,除了以上步骤之后,还需要在云服务器的「安全规则」上打开对应的端口,http-80,https-443。
三、Nginx配置
- 主配置文件:
/etc/nginx/nginx.conf
- 默认web目录:
/etc/share/nginx/html/
1、主配置文件 nginx.conf
配置文件结构解析:
1 |
|
配置文件的语法:
配置文件由指令与指令块构成;
每条指令以 ; 分号结尾,指令与参数间以空格符号分隔;
指令块以 {} 大括号将多条指令组织在一起;
include 语句允许组合多个配置文件以提升可维护性;
使用 # 符号添加注释,提高可读性;
使用 $ 符号使用变量;
部分指令的参数支持正则表达式;
2、全局变量
Nginx 有一些常用的全局变量,你可以在配置的任何位置使用它们,如下表:
全局变量名 | 功能 |
---|---|
$host | 请求信息中的 Host,如果请求中没有 Host 行,则等于设置的服务器名,不包含端口 |
$request_method | 客户端请求类型,如 GET、POST |
$remote_addr | 客户端的 IP 地址 |
$args | 请求中的参数 |
$content_length | 请求头中的 Content-length 字段 |
$http_cookie | 客户端cookie信息 |
$scheme | HTTP 方法(如http,https) |
$server_protocol | 请求使用的协议,如 HTTP/1.0、HTTP/1.1 |
还有更多的内置预定义变量,可以直接搜索关键字「nginx内置预定义变量」可以看到一堆博客写这个,这些变量都可以在配置文件中直接使用。
3、location属性
location指令的功能是用来匹配不同的url请求,进而对请求做不同的处理和响应,其中难点在于location的匹配机制
语法格式:location [ | = | ~ | ~* | ^~ ] URI {...}
匹配参数:
=
,精确匹配,内容必须完全一致才匹配成功1
2
3location = /abc/ {...}
http://abc.com/abc #匹配成功
http://abc.com/abc/index #匹配失败空格,直接是一个空格,匹配那些以指定pattern开头的URL(普通字符串而不是正则表达式)
1
2
3location /laf {...}
http://abc.com/laf #匹配成功
http://abc.com/laf/api #匹配成功^~
,前缀匹配,只匹配普通字符串。1
2
3
4location ^~ /index/ {...}
#以 /index/ 开头的请求,都会匹配上
http://abc.com/index/index.page #匹配成功
http://abc.com/error/error.page #匹配失败~
,正则匹配,区分大小写1
2
3location ~ /Abc/ {...}
http://abc.com/Abc/ #匹配成功
http://abc.com/abc/ #匹配失败~*
,正则匹配,不区分大小写1
2
3location ~* /Abc/ {...}
http://abc.com/Abc/ #匹配成功
http://abc.com/abc/ #匹配成功
优先级:
(1)精确匹配,即=
。如果匹配上,则匹配过程到此结束
(2)字符串前缀匹配,即:空格和^~
,找到匹配前缀最长的那个,如果匹配上,则匹配过程到此结束
(3)正则表达式匹配,取第一个匹配成功的,这里不看匹配长度,而是看在配置文件中的前后顺序。
注意:
「空格」和「^~
」都表示字符串前缀匹配,这也意味着两者可能发生冲突,如下
1 |
|
4、root指令 & alias指令
1 |
|
两者的用法区别:
root配置如下:
1
2
3
4location /blog/ {
root /usr/local/nginx/html;
index index.html index.htm;
}请求 http://127.0.0.1:80/blog/index.html 这个地址时,那么在服务器里面对应的真正的资源是 /usr/local/nginx/html/blog/index.html文件。
即:真实的路径是:root指定的地址 + location的值
alias配置如下:
1
2
3
4location /blog/ {
alias /usr/local/nginx/html/;
index index.html index.htm;
}同样请求http://127.0.0.1:80/blog/index.html时,在服务器查找的资源路径是:**/usr/local/nginx/html/index.html**文件
即:真实的路径是:alias指定的路径,与location无关。alias指定的路径就是location的别名。
使用alias注意:
- alias后面必需要用
/
结束,不然会被认为是文件,从而找不到对应的目录。(而root对/
的添加可有可无) - alias只能用在location中
参考链接:
Nginx系列:root与alias指令用法的区别 - 腾讯云开发者社区-腾讯云 (tencent.com)
四、Nginx常用命令
1 |
|
五、Nginx配置HTTPS
1. 配置SSL证书
第一步,把/etc/nginx/nginx.conf
文件中关于TLS的注释去除
1 |
|
第二步,从阿里云服务器控制台下载SSL证书
第三步,在云服务器对应位置创建目录,放置对应文件
第四步,修改nginx.conf
中对应的文件名
第五步,校验配置文件,确认无误后热重载Nginx
1 |
|
现在就可以通过https协议访问网页了
2. 配置多个SSL证书
只需要按照上面的格式,并列写多个server, 针对不同的server_name, 配置对应的ssl证书。
3. http自动跳转https
在http的配置文件中的server中添加一行代码即可,如下:
1 |
|
六、Nginx配置反向代理
在http模块的server内部添加location规则,进行代理
1 |
|
这和Apache有很大区别。
Apache上的效果是:访问域名/express
,会直接跳转到http://127.0.0.1:3000
上,并且不会在http://127.0.0.1:3000
后面添加/express
。实际上,/express
相当于是http://127.0.0.1:3000
的别名。
七、Nginx配置二级路径
使用alias指令
alias指令的作用是:用alias指定的路径替代location指定的路径
1 |
|
八、Nginx开启Gzip压缩
开启Gzip压缩有什么好处?A:减小通过网络传输的数据量,提高传输速度,但是会增加服务器和客户端压缩、解压缩的性能消耗。所以需要权衡使用。
如何查看网页是否开启压缩:检测站点:www.timegogo.top/laf网页GZIP压缩检测结果 (chinaz.com)
在/etc/nginx/conf.d
目录下新建一个gzip.conf
文件
1 |
|
gzip_types:要采用 gzip 压缩的 MIME 文件类型,其中 text/html 被系统强制启用;
gzip_static:默认 off,该模块启用后,Nginx 首先检查是否存在请求静态文件的 gz 结尾的文件,如果有则直接返回该 .gz 文件内容。可以结合Webpack使用,在打包时就打包出.gz文件
gzip_proxied:默认 off,nginx做为反向代理时启用,用于设置启用或禁用从代理服务器上收到相应内容 gzip 压缩;
gzip_vary:用于在响应消息头中添加 Vary:Accept-Encoding,使代理服务器根据请求头中的 Accept-Encoding 识别是否启用 gzip 压缩;
gzip_comp_level:gzip 压缩比,压缩级别是 1-9,1 压缩级别最低,9 最高,级别越高压缩率越大,压缩时间越长,建议 4-6;
gzip_buffers:获取多少内存用于缓存压缩结果,16 8k 表示以 8k*16 为单位获得;
gzip_min_length:允许压缩的页面最小字节数,页面字节数从header头中的 Content-Length 中进行获取。默认值是 0,不管页面多大都压缩。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大;
gzip_http_version:默认 1.1,启用 gzip 所需的 HTTP 最低版本;
效果对比:
下面是没有开启gzip之前的请求头和响应头
下面是开启gzip之后的响应头
并没有在响应头中看到期望出现的Content-Encoding
字段,不过通过「站长工具-网页GZIP压缩检测」看到对应的URL已经开启了Gzip
九、Nginx跨域
Nginx跨域大体分为两种方式:一种是在Nginx中配置http响应头,另一种是将Nginx作为正向代理服务器
1. CORS跨域
在Nginx中配置http响应头这种方式,本质上属于配置CORS跨域。它和在服务端代码中配置CORS没有本质区别,只是所处的位置不同,下面给出示例:(下面是nginx.conf配置文件,以配置http连接的响应头为例)
1 |
|
2. 代理跨域
在前端网页(应用)所在的服务器下,部署一个Nginx服务器,并使用Nginx的代理,让网页向Nginx发送后端请求,然后再由Nginx向实际的服务端发送请求。因为前端网页和Nginx服务器同源,所以不存在跨域问题。
问题合集
阿里云服务器上(CentOS7),Nginx服务正常启动,但是无法访问网址。系统没有开启防火墙,云服务器访问规则里也打开了80端口。
A:URL错误导致的,Edge浏览器默认给我添加了
https
前缀,但是实际需要使用http
协议。从http
转换到https
应该需要在nginx中进行配置