Nginx 配置解析以及几种常用配置

BBigSun 评论297阅读模式

nginx 中文文档:https://blog.redis.com.cn/doc/

Nginx 正向代理与反向代理的区别

正向代理文章源自十年又十年-https://www.bbigsun.com/67.html

如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理,下面是正向代理的原理图。文章源自十年又十年-https://www.bbigsun.com/67.html

由于工作环境原因,日常工作只能局限于单位的局域网,如果想要访问互联网,怎么办呢?这就需要用到正向代理。(VPN 也是一种正向代理)文章源自十年又十年-https://www.bbigsun.com/67.html

Nginx 配置解析以及几种常用配置文章源自十年又十年-https://www.bbigsun.com/67.html

反向代理文章源自十年又十年-https://www.bbigsun.com/67.html

看下面原理图,就一目了然。其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP地址。文章源自十年又十年-https://www.bbigsun.com/67.html

Nginx 配置解析以及几种常用配置文章源自十年又十年-https://www.bbigsun.com/67.html

正向代理和反向代理的区别,一句话就是:如果我们客户端自己用,就是正向代理。如果是在服务器用,用户无感知,就是反向代理。文章源自十年又十年-https://www.bbigsun.com/67.html

Nginx 配置文件

Nginx 默认配置文件位于安装目录下的 conf 目录下(nginx.conf)。文章源自十年又十年-https://www.bbigsun.com/67.html

Nginx 配置文件可以分为三部分:全局块,events块,http块。文章源自十年又十年-https://www.bbigsun.com/67.html

## 全局块 
# 
# 主进程(master),负责管理子进程(worker)
# worker_processes :表示开启 n 个业务进程(默认为1)
# 
worker_processes  1;

## events块
#
events {
    worker_connections  1024;
}

## http块
#
http {
    # include :引入其他文件,此处表示引入 http mime 类型
    include         mime.types;
    default_type    application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    ## server块 :虚拟主机,可以配置多个
    #
    server {
        listen       80;
        server_name  localhost;

        ## location块
        #
        location / {
            # 路径匹配之后,哪个目录下去匹配相应的网页,html 是相对路径
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

配置反向代理:实例一

使用 Nginx 反向代理,访问 www.example.com(默认监听80端口) 跳转到 127.0.0.1:8080

server {
    listen       80;
    server_name  www.example.com;

    # root 与 proxy_pass 选项不能同时生效,二选一执行。 
    location / {
        root   html;
        index  index.html index.htm;
        proxy_pass  http://127.0.0.1:8080
    }
}

配置反向代理:实例二

使用 Nginx 反向代理,根据访问的路径跳转到不同端口的服务中,监听端口为 9000

  • 访问 www.example.com/one 跳转到 127.0.0.1:8081
  • 访问 www.example.com/two 跳转到 127.0.0.1:8082
server {
    listen       9000;
    server_name  www.example.com;

    location ~ /one/ {
        proxy_pass  http://127.0.0.1:8081
    }

    location ~ /two/ {
        proxy_pass  http://127.0.0.1:8082
    }
}

location 指令说明

location [ = | ~ | ~* | ^~] uri {

}

该指令用于匹配 url:

  • = :用于不含正则表达式的 url 前,要求请求字符串与 url 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求
  • ~ :用于表示 url 包含正则表达式,并且区分大小写
  • ~* :用于表示 url 包含正则表达式,并且不区分大小写
  • ^~ :用于不含正则表达式的 url 前,要求 Nginx 服务器找到标识 url 和请求。字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location块中的正则 url 和请求字符串做匹配。

配置负载均衡

Nginx 配置解析以及几种常用配置

http {
    upstream myapp1 {
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
    }

    server {
        listen 80;
        server_name xiaogd.net;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

Nginx 配置解析以及几种常用配置

如果两台 tomcat 主机的配置不同, 比如一台的性能更强劲些, 还可以调整负载的比例(即权重, weight), 让性能更强的一台承担更多的请求:

如下配置 3:2 的权重比, 让其中一台承担 60% 的请求, 而另一台性能较差的则承担 40%, 也即每 5 个请求, 3 个会被转到 ip 为 20 的主机上, 2 个会转到 ip 为 21 的主机上。

http {
    upstream myapp1 {
        server 192.168.0.20:8080 weight=3;
        server 192.168.0.21:8080 weight=2;
    }

    server {
        listen 80;
        server_name xiaogd.net;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

worker_processes 与 worker_connections 如何设置?

一般一个进程足够了,你可以把连接数设得很大。(worker_processes: 1,worker_connections: 10,000)

如果有SSL、gzip这些比较消耗CPU的工作,而且是多核CPU的话,可以设为和CPU的数量一样。(worker_processes: CPU核心数)

或者要处理很多很多的小文件,而且文件总大小比内存大很多的时候,也可以把进程数增加,以充分利用IO带宽(主要似乎是IO操作有 block)

worker_processes,工作进程数

  1. 默认:worker_processes: 1
  2. 调大:worker_processes: CPU核心数,(双核4线程,可以设置为4)

worker_connections,单个工作进程可以允许同时建立外部连接的数量,数字越大,能同时处理的连接越多

  1. 默认:worker_connections: 1024
  2. 调大:worker_connections: 100000,(调大到10万连接)

worker_connections 解析

  1. connections不是随便设置的,而是与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”。
  2. 内存:每个连接数分别对应一个read_event、一个write_event事件,一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节,通过数学公式可以算出100000个连接数大概会占用 31M = 100000 * 328 / 1024 / 1024,当然这只是nginx启动时,connections连接数所占用的nginx。
  3. 进程最大可打开文件数:进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024,现在是65535,nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如: worker_rlimit_nofile 20960; 设置ulimits:ulimit -SHn 65535

纸上得来终觉浅,绝知此事要躬行。

weinxin
17688689121
我的微信
微信扫一扫
Nginx最后更新:2024-5-11
BBigSun
  • 本文由 BBigSun 发表于 2022年 11月 24日 08:47:51
  • 转载请务必保留本文链接:https://www.bbigsun.com/67.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定