Nginx学习

一、Nginx简介

Nginx学习起来并不困难,重点是要多运用才行,不能死记硬背

1.概述

Nginx同Apache一样都是一种WEB服务器,作为一台服务器,其根本目的就是要运行我们写的代码。而Nginx专门为性能优化而开发,所以它的功能有限流、负载均衡、反向代理。性能是其最重要的考量

未命名文件.png

2.反向代理

正向代理:安装在客户端的代理(VPN)

反向代理:安装在服务器端的代理

3.负载均衡

服务器有多台,每台的性能都不一样,由Nginx觉得将请求发送给哪台服务器

Nginx的请求策略有两种

  1. 内置策略
    • 轮询:依次将请求发送给各个服务器,第一个请求第一台服务器,第二个第二台………
    • 加权轮询:服务器性能越高权重越高,优先将请求发送给权重高的服务器
    • Ip hash:对请求的ip进行hash操作,使同一个客户端的多个请求分发给同一台服务器处理,因为各个服务器之间的session是不共享的
  2. 扩展策略

4.动静分离

动指动态文件,静指静态文件

像html、css、jpg这些都是静态文件,不需要经过后台处理,将这些静态文件与动态文件分开部署,以提高资源的相应速度

但是在目前前后端分离的项目中,个人觉得动静分离的作用不大

二、部署Nginx

操作系统为Ubuntu

1.安装

1
#apt-get install nginx

查看是否安装成功

1
2
#nginx -v
nginx version: nginx/1.10.3 (Ubuntu)

2.启动nginx

1
#service nginx start

提示Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details.

输入命令systemctl status nginx.service,发现是因为80端口被占用了

我们查看一下nginx的配置文件

1
#cat /etc/nginx/nginx.conf

在/etc/nginx/nginx.conf中并没有看到80端口,但是可以看到它包含了sites-enabled下的文件,再去查看这个,发现这个文件又指向了 site-available/default

image-20211112103848264

打开default ,可以看到它监听的端口是80,改为81端口,root配置网站根目录,而/var/www/html/就是apache的欢迎页

image-20211112104611014

访问81端口后会指向/var/www/html/

三、Nginx常用命令

1
2
3
4
5
6
7
nginx            #启动
nginx -s reload # 重新加载配置文件,热重启,这个经常使用
nginx -s reopen # 重启Nginx
nginx -s stop # 关闭Nginx
nginx -s quit # 安全退出。等待工作进程处理完成后关闭
nginx -T # 查看当前Nginx最终的配置
nginx -t # 检查配置是否有问题

四、Nginx配置文件

使用命令

1
#cat /etc/nginx/nginx.conf

main:在events上面的都是全局配置

events:配置影响 Nginx 服务器与用户的网络连接

http :配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置

第一个配置文件

http中包含了两个配置文件,该配置文件有对虚拟主机的server配置

image-20211112160904519

使用命令

1
#cat /etc/nginx/sites-available/default

server :配置虚拟主机的相关参数,一个 http 块中可以有多个 server

location :用于配置匹配的 uri

upstream :配置后端服务器具体地址,负载均衡配置不可或缺的部分;

第二个配置文件

整个的配置文件结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//main有关的全局配置

events{
worker_connections 768;
}
http{
//http有关的配置

upstraem dian{
server 8.8.8.1:8081 weight=1;
server 8.8.8.1:8082 weight=1;
}
server{
listen 81;
server_name www.123.com;
//对 / 的请求做负载均衡和反向代理
location / {
root html;
proxy_pass http://dian;
}
//因为image是静态资源,我们可以不把它放在Tomcat上,也就不用请求server
//当访问www.123.com:81/images/XXX时,实际请求路径为/opt/nginx/static/XXX
location /image {
root /opt/nginx/static;
}
}
}

重点是server

  • upstraem:配置负载均衡,指定服务器的相关信息,这里指定两台后台项目的地址和端口,并在location中配置代理proxy_pass,当访问81端口的/目录时就会将请求发送给 8.8.8.1:8081

    注意区分server和server_name,server_name指访问的地址,server指后台服务的地址

    访问:server_name:listen/ 代理到:proxy_pass

    访问:www.123.com:80/ 会代理到 http://8.8.8.1:8081/

    Q:为什么要配置server_name?我们完全可以通过服务器IP:端口进行访问

    A:server_name是起的一个标记名称。服务器IP只有一个,可能会出现一台服务器对应多个项目的情况,这样就可以使用server_name实现同一ip不同域名的需求。
    当我们通过hosts文件指定IP与域名的对应关系(186.11.124.120(服务器公网IP) www.123.com)之后,对域名的访问会映射成对应的IP,然后server name为虚拟服务器的识别路径。因此不同的域名会转发到对应的应用服务器中去。
    类似于git的origin,origin是一个别名,指向一个远程仓库,我们可以在同一个本地仓库中origin1指向github地址,定义origin2指向gitee地址,通过oring1、2向不同的远程仓库进行提交

  • listen:监听的端口

  • server_name 指定虚拟主机域名,例如:server_name www.123.com

  • root 指定静态资源目录位置,可以写在 httpserverlocation 配置中

  • location:配置路径

    匹配规则 匹配优先级: = > ^~ > ~ > ~* > 不带任何字符

    • = 精确匹配
    • ~ 正则匹配,区分大小写
    • ~* 正则匹配,不区分大小写
    • ^~ 匹配到即停止搜索

    例: location = /image/ location = /image

    是否有反斜杠:Nginx 先找是否有 images 目录,如果有则找 images 目录下的 index.html

    ​ 没有的话:不带反斜杠去找是否有image文件;

    ​ 带反斜杠不会去找是否存在 image文件


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!