什么是Nginx

一、什么是Nginx

Nginx是一款高性能、轻量级的网页服务器,采用事件驱动的异步非阻塞处理框架,它主要应用于静态文件服务、负载均衡、正向代理和反向代理等场景,在互联网项目中被广泛应用。

二、为什么需要Nginx

举个例子:

  • 由于我们开发项目时,前端页面调用后端服务,ip地址都是在公司的局域网内,自然是能互相通信的。
  • 但当我们将项目部署到公网上时,就需要将前端系统界面的地址通过Nginx代理服务器进行转发,才能被局域网外的用户访问到。
  • 然而此时用户只能成功访问页面,后台的服务仍处于局域网下,需要前端通过Nginx做一下转发才能让用户正常的访问后台服务。

上述过程中,前端页面和后台服务的转发都用到了Nginx,如下图所示:

在这里插入图片描述

在这里插入图片描述

三、Nginx的应用场景

1. 静态资源(动静分离)

Nginx 服务器会将接收到的请求分为动态请求和静态请求,这样能减轻服务器的压力,同时使项目结构更加规范,方便开发和部署:

  • 静态请求直接从Nginx服务器所设定的根目录路径去获取对应的资源
  • 动态请求转发给后台服务器
    在这里插入图片描述

具体的配置在nginx.conf文件里:

http {
	# 部分内容略去
	upstream backservice { 
        server 192.168.1.123:8080;
    }
	# 虚拟机(服务)列表
    server {
        # 监听所有地址的80端口,也可以指定IP
        listen       80;
        server_name  localhost;

        location / {
            # 指定访问的静态文件夹,用来存放静态资源
            root   /app/dist;
            # 指定index页面
            # index  index.html index.htm;
            # 这个字段指定当前uri 访问的文件顺序,
            # 即uri没有的话就访问uri/ 依次到index.html、404.
            try_files $uri $uri/ /index.html =404;
		}
		# 后台服务
        location /backservice/ {
            proxy_pass http://backservice/;
        }
}

2. 负载均衡

很多中间件都应用到了负载均衡技术,Nginx常用的几种负载均衡的方式:

2.1 轮询(默认)

顾名思义,每一个客户端的请求会按时间顺序轮流分配到不同的服务器上,如果后端服务down掉,会自动过滤。

upstream backservice{
  server 192.168.1.123:8080;
  server 192.168.1.124:8080;
}
2.2 weight 权重(Nginx自带)

如果后端服务器性能不均衡,可以使用权重法来指定轮询的几率,权重越高,被分配的次数越多。

upstream backservice{
  server 192.168.1.123:8080 weight=1;
  server 192.168.1.124:8080 weight=3;
  server 192.168.1.125:8080 weight=4;
}
2.3 ip_hash(Nginx自带)
  • 该方法主要是为了解决session会话的问题,如果客户端已经访问了某个服务器,如果再次登录被分配到了另一个服务器,那么客户的登录信息就丢失了
  • 所以采用ip_hash方法将每个请求按照访问ip的hash结果进行分配,这样就能保证同一个用户会固定访问一个后端服务器,保证了session会话
upstream backservice{
  ip_hash; 
  server 192.168.1.123:8080;
  server 192.168.1.124:8080;
}
2.4 least_conn(Nginx自带)

将请求转发给连接数较少的后端服务器。

upstream backservice{
  least_conn; 
  server 192.168.1.123:8080;
  server 192.168.1.124:8080;
}
2.5 fair(第三方)

fair是按照服务器端的响应时间来分配请求,响应时间短的服务器优先分配,需要安装第三方的插件。

upstream backservice{
  fair;
  server 192.168.1.123:8080;
  server 192.168.1.124:8080;
}

3. 反向代理

接下来就是Nginx的重头戏了——反向代理,什么是反向代理呢?举个例子:

  • 你是一名刚毕业的大学生,来到新的城市要租房
  • 于是租房中介找到你说:“我可以为您提供服务,xx区有几套房源在租,您想要哪一套呢?”
  • 你问中介:“这些房子的房东是谁?他们的电话号码是多少?”
  • 中介答:“这些你不用管了,你只需要享受我的服务就好,房东是谁不重要,你能找到好住处就是我的职责!”
  • 这里的你就是客户端Client,房东就是服务端Server,中介就是代理Proxy;
  • 房东通过中介向你提供房源,你不知道房源具体是谁的,因为你只能接触到中介;
  • 同理,反向代理将服务端保护了起来,客户端只能通过代理服务器访问服务,无法获得服务端的真实地址。
  • 反向代理是实现负载均衡的基础,同时也支持实现跨域
    在这里插入图片描述

4. 正向代理

反向代理讲完了,那么什么是正向代理呢?还是租房的例子:

  • 你问中介:“给我在xx区找几套好房子。”
  • 中介赶紧联系房东:“有人相中您这套房子了,您什么时候搬走呢?”
  • 房东说:“谁呀,这么着急?我还没收拾完呢!”
  • 中介:“这您就别管是谁问的啦,早点搬走您就早点过上躺着收房租的生活~”
  • 房东:“好,我明天就搬走!”
  • 中介回来对你说:“xx街道xx小区那个房东明天就搬走,这是他的房源信息,您过目。”
  • 这里的房东作为服务端不知道谁在向他发起请求,他只能感受到代理的存在
  • 其实我们的上网的过程也是正向代理,通过代理服务器访问目标网址,vpn会将访问外面的服务器server的网页请求,代理到服务器proxy上,proxy把外面的服务器 server上获取的网页内容,再转发给客户。
    在这里插入图片描述

四、怎么用Nginx

Nginx的使用主要靠nginx.conf配置文件,在这里修改代理转发,以及控制资源大小、响应时间等,以下是一个示例,包括静态文件服务、反向代理、负载均衡等功能:

user nginx; #指定 Nginx 进程的运行用户,这里设置为 nginx 用户。
worker_processes  1; # 设置 Nginx 进程的数量,一般根据服务器性能来设置。这里设置为1,表示只有一个工作进程。

error_log  /var/log/nginx/error.log warn; # 指定错误日志文件的位置和日志级别
pid        /var/run/nginx.pid; # 指定 Nginx 主进程的PID文件

events {
    worker_connections  1024; # 配置Nginx事件模块,设置最大连接数,这里设置每个 worker进程最大连接数为 1024。
}


http { # 配置HTTP服务器的行为,包括监听端口、日志格式、代理、负载均衡等
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # 设置请求体的最大限制 默认是1m;
    client_max_body_size 20m;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'; # 配置日志格式

    access_log  /var/log/nginx/access.log  main; # 配置访问日志的位置和日志格式

    sendfile        on; # 开启 sendfile 功能,用于高效传输文件
    #tcp_nopush     on;

    keepalive_timeout  65; # 设置 HTTP keep-alive 连接的超时时间

    # 开启gzip
    gzip  on;

    # 启用gzip压缩的最小文件
    gzip_min_length 1k;
    
    # gzip 压缩级别, 1-10,数字越大压缩越好,但cpu消耗越高,且压缩效果不会明显提升,一般设置在2-4
    gzip_comp_level 4;

    # 压缩的文件类型
    gzip_types text/html text/css application/javascript application/x-javascript text/javascript  application/octet-stream application/font-woff;
    
    # add_header Access-Control-Allow-Headers Authorization;
    # underscores_in_headers on;

    # 负载配置
    upstream usersvr {
        server 192.168.1.123:8089;
    }

    upstream metasvr { 
        server 192.168.1.124:8087;
    }

    upstream productsvr { 
        server 192.168.1.125:30083;
    }

    # 虚拟机(服务)列表
    server {
        # 监听所有地址的80端口,也可以指定IP
        listen       80;
        server_name  localhost;

        location / {
            # 指定访问的静态文件夹
            root   /app/dist;
            # 指定index页面
            # index  index.html index.htm;
            # 这个字段指定当前uri 访问的文件顺序,
            # 即uri没有的话就访问uri/ 依次到index.html、404.
            try_files $uri $uri/ /index.html =404;
        }

        
        # 用户服务
        location /oauth/ {
            # proxy_set_header Host $host;
            # proxy_set_header  X-Real-IP $remote_addr;
            # proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
            # proxy_set_header HTTP_AUTHORIZATION $http_authorization;
            # proxy_set_header X-NginX-Proxy true;
            proxy_pass http://usersvr/oauth/;
        }
        # 元数据服务
        location /meta/ {
            proxy_pass http://metasvr/;
        }
        # 产品服务
        location /product/ {
            proxy_pass http://productsvr/;
        }
        
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

另外还有一些经常用到的路径:

  1. nginx配置文件路径
/usr/local/etc/nginx/nginx.conf 
  1. nginx服务器默认的根目录
/usr/local/var/www 
  1. nginx的安装路径
/usr/local/Cellar/nginx/1.18.0 
  1. nginx默认的日志路径
/usr/local/var/log/nginx/error.log 

如果nginx服务出现问题,可以通过查看错误日志来进行排查:

tail -fn 200 /usr/local/var/log/nginx/error.log # 实时查看最新200行日志

通常情况下问题出在nginx.conf文件里,可能是里面的某些配置项没配置对,或者upstream、location命名不一致未成功匹配等,找到问题修改好nginx.conf后,重启nginx服务即可:

sudo nginx -s reload  # 热重启nginx

好了,以上就是关于nginx的一些概念和常用配置、指令,写成此文学习记录!

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值