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
- http://nginx.org/en/docs
- http://wiki.nginx.org/Pitfalls
- http://wiki.nginx.org/QuickStart
- http://wiki.nginx.org/Configuration
- Nginx 使用及配置
- Nginx 简易教程
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
}
}