10分钟教你入门 Nginx

Nginx 是什么

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

  • 设计思想类似 NodeJS,基于事件驱动的异步非阻塞处理

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

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

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

代理是什么?

代理分为正向代理与反向代理:正向代理隐藏真实客户端,反向代理隐藏真实服务端

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

VPN 也是一个正向代理的例子

10分钟教你入门 Nginx_第1张图片

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

10分钟教你入门 Nginx_第2张图片

Nginx 可以解决什么问题

  • 反向代理,负载均衡。包括解决前端跨域问题

  • 静态资源服务

  • API 服务,如OpenResty

基础操作

安装及路径

  • 查看 Nginx 信息 brew info nginx

  • 常用文件路径(注意,以下为 M1 Mac 配置)

    • 安装路径:/opt/homebrew/Cellar/nginx/1.23.0

    • 默认配置路径:/opt/homebrew/etc/nginx/nginx.conf

常用命令

操作 命令
启动 nginx
热重启 nginx -s reload
停止 nginx -s stop
强制停止 pkill -9 nginx

整体配置一览

下面是在前端本地开发中,使用 Nginx 解决浏览器跨域的配置,我们大致了解一下配置项,先不用关注具体含义:


#进程, 可更具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;
        }

    }

}

进程配置


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;
  • KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for 变…remote_addr用逗号分开,如果没有 X-Forwarded-For 请求头,则 KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for等于remote_addr

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

你可能感兴趣的:(nodejs,nginx,运维,前端,开发语言,职场和发展)