Nginx

Nginx 简介

Nginx 是一款轻量级的 Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。相较于 Apache,Apache 是同步多线程模型,一个连接对应一个线程,而 Nginx 是异步的,多个连接(万级别)可以对应一个线程。Nginx 的优势是处理静态请求,CPU、内存使用率低,Apache 适合处理动态请求,所以现在一般前端用 Nginx 作为反向代理抗住压力,Apache 作为后端处理动态请求。

Nginx 主要能够代理的协议:

  • http/https (http srver)
  • icmp/pop/imap (mail server)
  • rtmp (media server)

代理根据被代理对象的不通,一般分为成两种:

  • 反向代理 (Reverse Proxy): 反向代理代理的是服务器端,为服务器收发请求,使真实处理请求的服务器对客户端不可见、无感知。例如:一个稍微复杂些的系统其实是有很多服务构成的,不同的服务分布在不同的服务器上,客户端其实根本不需要知道这些,他只要把请求统一发到反向代理服务器的地址,代理就会根据配置自动找到能处理该请求的服务地址,并把处理结果返回给客户端。
  • 正向代理: 正向代理代理的是客户端,为客户端收发请求,使真实发送请求的客户端对服务器端不可见。最典型的就是 VPN,比如你想访问谷歌,国内 IP 想出去肯定是被拦截的,但是如果我把电脑的对外公网 IP 换成美国的 IP 地址就不会被拦截了。所以我们把请求先发到 VPN 服务器上,这样客户端对外的 IP 就是 VPN 服务器的 IP,第三方并不知道当前请求的真实客户端是国内的 IP,这样就能顺利访问了。举个更简单的栗子,假如你没有护照不可以出国,但你可以找代购帮你买。

Reference

Download

download

Install

$ rpm -ivh nginx-1.17.3-1.el7.ngx.x86_64.rpm

Usage

$ nginx [options]

# -------- options --------
# -?, -h: help
# -v : Print version.
# -V : Print NGINX version, compiler version and configure parameters.
# -t : Don’t run, just test the configuration file. NGINX checks configuration for correct syntax and then try to open files referred in configuration.
# -q : Suppress non-error messages during configuration testing.
# -s : signal, Send signal to a master process: `stop`, `quit`, `reopen`, `reload`. (version >= 0.7.53)
# -p : prefix, Set prefix path (default: /usr/local/nginx/). (version >= 0.7.53)
# -c : filename, Specify which configuration file NGINX should use instead of the default.
# -g : directives, Set global directives. (version >= 0.7.4)

Configure

# nginx default global conf
$ /etc/nginx/nginx.conf

# default server conf file diretory path
$ /etc/nginx/conf.d

# default server conf
$ /etc/nginx/conf.d/default.conf

# defalut resource store path
$ /usr/share/nginx/html

Start

$ systemctl start nginx
# 或者
$ nginx
# 或者
$ nginx -c my_nginx.conf

Examples

File Server

$ vim /etc/nginx/conf.d/file_server.conf
server {
    # 监听端口
    listen 80;
    # 用于匹配当前请求的 IP/Host
    server_name 192.168.0.1;
    # 指定服务器路径
    root /data/nginx/;
    location / {
        # 显示目录
        autoindex on;
        # 显示文件大小
        autoindex_exact_size on;
        # 显示文件时间
        autoindex_localtime on;
    }
}

$ ls -l /data/nginx/
drwxr-xr-x  1 root root        5810 Sep  3 11:20 images

$ ls -l /data/nginx/images
-rw-r--r--  1 root root        5810 Sep  3 11:20 1.jpg
-rw-r--r--  1 root root        5810 Sep  3 11:20 2.jpg
-rw-r--r--  1 root root        5810 Sep  3 11:20 3.jpg

# 浏览器访问
http://192.168.0.1/images/1.jpg

Reverse Proxy

$ vim /etc/nginx/conf.d/reverse_proxy.conf
# 假设当前 Nginx 服务器 IP 为 192.168.0.10
server {
    # 监听端口,监听所有发送到 192.168.0.10:80 的请求
    listen 80;
    # 用于匹配当前请求的 IP/Host,当 DNS 或者 /etc/hosts 中配置了多个 host 指向 Nginx 服务器时,
    # Nginx 会解析 Request Header 中的 Host 信息进行规则匹配,匹配上的请求就会走该 server 配置
    # 关于 server_name 可以详细可参考:https://nginx.org/en/docs/http/server_names.html
    server_name "*arch-long.cn";
    # 请求 *arch-long.cn/ 时转发到 192.168.0.11:8080 处理
    location / {
       // 反向代理地址
       proxy_pass 192.168.0.11:8080
    }
    # 请求 *arch-long.cn/api 时转发到 192.168.0.12:8080 处理
    location /api {
       // 反向代理地址
       proxy_pass 192.168.0.12:8080
    }
}

Config Superset Reverse Proxy

$ vim conf.d/superset-dlink-bj.sensetime.com             
upstream superset-dlink-bj_web {
        server 10.53.5.59:44399  max_fails=3 fail_timeout=30s;
        server 10.53.5.134:44399  max_fails=3 fail_timeout=30s;
        server 10.53.5.152:44399  max_fails=3 fail_timeout=30s;
        server 10.53.6.23:44399  max_fails=3 fail_timeout=30s;
        server 10.53.6.37:44399  max_fails=3 fail_timeout=30s;
        server 10.53.7.99:44399  max_fails=3 fail_timeout=30s;
        server 10.53.7.100:44399  max_fails=3 fail_timeout=30s;
        server 10.53.7.159:44399  max_fails=3 fail_timeout=30s;
}
server {
        listen 80;
        server_name superset-dlink-bj.sensetime.com;
        return 302 https://$host$request_uri;
}
server {
        listen 443 ssl;
        server_name superset-dlink-bj.sensetime.com;
 
        ssl_certificate /etc/nginx/ssl/sensetime.com/server.crt;
        ssl_certificate_key /etc/nginx/ssl/sensetime.com/server.key;
        access_log /var/log/nginx/superset-dlink-bj-prod.log access;
        error_log  /var/log/nginx/superset-dlink-bj-prod_error.log;
 
        location  / {
            allow 172.16.0.0/12;
            allow 10.0.0.0/8;
            allow 192.168.0.0/16;
            deny all;
            # proxy_redirect off;
            proxy_pass http://superset-dlink-bj_web;
            proxy_http_version 1.1;
            proxy_connect_timeout 86400s;
            proxy_read_timeout 1200s;
            proxy_send_timeout 1200s;
            # proxy_set_header Upgrade $http_upgrade;
            # proxy_set_header Connection $connection_upgrade;
            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;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_next_upstream error timeout http_502 http_503;
        }
}

Load Balance

$ vim /etc/nginx/conf.d/load_balance.conf
server {
    # 监听端口
    listen 80;
    # 指定 ip/host
    server_name 192.168.0.1;
    # 指定一组服务器,组名为`backend`
    upstream backend {
        # 按照用户 IP 地址的 hash 值进行分配
        ip_hash;    
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
        server backend4.example.com;
    }
    location / {
       // 反向代理地址
       proxy_pass https://backend
    }
}

qin

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏

打开支付宝扫一扫,即可进行扫码打赏哦