本文主要内容:

  • Nginx 是什么

  • 它能在哪些场景下运用

  • 上手根底装备

Nginx 是什么

  • Nginx是一款轻量级的Web服务器、反向署理服务器

  • 规划思维类似 NodeJS,根据事情驱动的异步非阻塞处理

  • 由于它的内存占用少,发动极快,高并发能力强,经常用于服务端的反向署理负载均衡

web服务器:负责处理和呼应用户恳求,一般也称为http服务器,如 Apache、IIS、Nginx

应用服务器:存放和运行体系程序的服务器,负责处理程序中的事务逻辑,如 Tomcat、Weblogic、Jboss(现在大多数应用服务器也包含了web服务器的功能)

署理是什么?

先上结论:正向署理躲藏实在客户端,反向署理躲藏实在服务端

  • 首先说说正向署理,举个:A 找 C 借一笔钱,但两人关系不熟,必定难借到。所以 A 就找 B 出头,因为 BC 是好朋友,很顺利的拿到钱了。这个例子中 B 向 C 躲藏了真正的借钱人,相当于正向署理。

  • VPN 也是一个正向署理的例子

10分钟入门 Nginx

  • 反向署理在生活中也有例子:我要咨询手机通信问题,打电话到 10086,该体系会分配一个客服人员,我并不需求知道对方性别,年龄等因素,但他们都能提供给我专业服务。10086 总机对我躲藏了服务人员信息,相当于一个反向署理

10分钟入门 Nginx

Nginx 能够处理什么问题

  • 反向署理,负载均衡。包含处理前端跨域问题

  • 静态资源服务

  • API 服务,如OpenResty …

根底运用

常用信息

  • 查看 Nginx 信息 brew info nginx

  • 常用文件途径(留意,以下为 M1 Mac 装备)

  • 装置途径:/opt/homebrew/Cellar/nginx/1.23.0

  • 默认装备途径:/opt/homebrew/etc/nginx/nginx.conf

常见操作命令

  • 发动:ngxin

  • 热重启:nginx -s reload

  • 停止:nginx -s stop

  • 强制停止:pkill -9 nginx,或者:

    • ps -ef | grep nginx

    • kill nginx: master [port]

    • kill -QUIT [port]

进程装备


worker_processes 8; # Nginx 进程数,主张按照CPU数目来指定,一般为它的倍数 (如:2个四核的CPU计为8)
worker_rlimit_nofile 65535; #一个Nginx 进程翻开的最多文件描述符数目
worker_connections 65535;#每个进程答应的最多衔接数

http 相关装备


http {
    sendfile  on                  # 高效传输文件的模式 一定要开启
    keepalive_timeout   65        # 客户端服务端恳求超时时刻
    # 直接恳求nginx也是会报跨域过错,这儿设置答应跨域
    # 假如署理地址已经答应跨域则不需求这些, 不然报错(尽管这样nginx跨域就没含义了)
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Headers X-Requested-With;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}

监听端口

server 模块是 http 模块中的一个子模块,用来定义一个虚拟拜访主机。

当 ng 接纳到恳求后,会匹配 server 模块。

server {
   listen       80; # 监听端口
   server_name  dev1-cd.hongsong.club; # 域名 Host
	 # path
   location / {
       proxy_pass http://127.0.0.1:10086/; # 署理装备
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header REMOTE-HOST $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}

上面的装备表示:当恳求 samdd.club 时,会射中 Nginx 服务器 server 装备,署理到本地服务

server {
	listen       80;   #监听端口
	server_name  www.mingongge.com;  #域名 Host 信息
	location / {
		root   /www/www;   #网站根目录
		index  index.html index.htm;  #默认首页类型
		deny 192.168.2.11;   #禁止拜访的ip地址,能够为all
		allow 192.168.3.44; #答应拜访的ip地址,能够为all
	}
}

静态资源装备

server {
	listen 80;  
	server_name mingongge.com;  
	location /static {      
	  root /wwww/web/web_static_site; 
  }
}

反向署理

  • 当出产环境中不同的项目在同一台服务器上,就能够用反向署理去做恳求转发。

  • 在前端本地开发,也会遇到浏览器跨域问题,能够用 Nginx 转发恳求


http {
    ...
    upstream product_server{
        127.0.0.1:8081;
    }
    upstream admin_server{
        127.0.0.1:8082;
    }
    upstream test_server{
        127.0.0.1:8083;
    }
    server {
        #默认指向 product_server
        location / {
            proxy_pass http://product_server;
        }
        location /product/{
            proxy_pass http://product_server;
        }
        location /admin/ {
            proxy_pass http://admin_server;
        }
        location /test/ {
            proxy_pass http://test_server;
        }
    }
}

负载均衡

upstream server_pools {
	# weigth 参数表示权重:权重越高,被分配到的几率越大
	server 192.168.1.13:8989   weight=6;
  server 192.168.1.11:8880   weight=5;
  server 192.168.1.12:9990   weight=1;
}
server {  
  listen 80; 
  server_name samdd.com;
  location / {    
	  proxy_pass http://server_pools; 
  }
}

其他署理装备

proxy_connect_timeout 90;  # nginx跟后端服务器衔接超时时刻(署理衔接超时)
proxy_send_timeout 90;     # 后端服务器数据回传时刻(署理发送超时)
proxy_read_timeout 90;     # 衔接成功后,后端服务器呼应时刻(署理接纳超时)
proxy_buffer_size 4k;      # 署理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k;       # proxy_buffers缓冲区
proxy_busy_buffers_size 64k;     # 高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;  # 设定缓存文件夹大小
proxy_set_header Host $host; 
proxy_set_header X-Forwarder-For $remote_addr;  # 获取开始发起恳求的客户端 IP 地址
proxy_set_header X-Real-IP $remote_addr; # 获取客户端实在IP
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  • proxy_add_x_forwarded_for 变量包含客户端恳求头中的 X-Forwarded-For ,与remote_addr用逗号分隔,假如没有 X-Forwarded-For 恳求头,则 proxy_add_x_forwarded_for等于remote_addr

  • $remote_addr 变量的值是客户端的 IP

处理浏览器跨域


#进程, 可更具cpu数量调整
worker_processes  1;
events {
    #衔接数
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    #衔接超时时刻,服务器会在这个时刻过后封闭衔接。
    keepalive_timeout  10;
    # gizp紧缩
    gzip  on;
    # 直接恳求nginx也是会报跨域过错的这儿设置答应跨域
    # 假如署理地址已经答应跨域则不需求这些, 不然报错(尽管这样nginx跨域就没含义了)
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Headers X-Requested-With;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    # srever模块装备是http模块中的一个子模块,用来定义一个虚拟拜访主机
    server {
        listen       80;
        server_name  localhost;
        # 根途径指到index.html
        location / {
            root   html;
            index  index.html index.htm;
        }
        # localhost/api 的恳求会被转发到192.168.0.103:8080
        location /api {
            rewrite ^/b/(.*)$ /$1 break; # 去除本地接口/api前缀, 不然会呈现404
            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_pass http://192.168.0.103:8080; # 转发地址
        }
        # 重定向过错页面到/50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

Link

Nginx 常用装备汇总!从入门到干活足矣

Nginx处理前端跨域

反向署理为何叫反向署理?- 知乎