轻量级、高性能的 Web 服务器,在现今的大型应用、网站基本都离不开 Nginx,已经成为了一项必选的技术;其实可以把它理解成 入口网关,这里我举个例子可能更好理解:
当你去银行办理业务时,刚走进银行,需要到入门处的机器排队取号,然后按指令到对应的柜台办理业务,或者也有可能告诉你,今天不能排号了,回家吧!
这样一个场景中,取号机器就是 Nginx(入口网关)。一个个柜台就是我们的业务服务器(办理业务);银行中的保险箱就是我们的数据库(存取数据);🤣
/usr/local/etc/nginx/nginx.conf
;nginx
,访问 localhost:8080
就能看到 Welcome...
;nginx -s stop
: 停止服务;nginx -s reload
: 热重启服务;proxy_pass
server {listen 80;location / {proxy_pass http://xxx.xxx.xx.xx:3000;}}
其实 Nginx 可以算一层 代理服务器,将客户端的请求处理一层后,再转发到业务服务器,这里可以分成两种类型,其实实质就是 请求的转发,使用 Nginx 非常合适、高效;
特点
用户访问头条的反向代理网关,通过网关的一层处理和调度后,再由网关将访问转发到内部的服务器上,返回内容给用户;
特点
反向代理的好处:
Upstream
模块, 这样当用户访问 http://xxx
时,流量便会被按照一定的规则分配到upstream
中的 3 台服务器上;http {upstream xxx {server 1.1.1.1:3001;server 2.2.2.2:3001;server 3.3.3.3:3001;}server {listen 8080;location / {proxy_pass http://xxx;}}}
分配策略
服务器权重(weight
):
weight
,例如:upstream xxx {server 1.1.1.1:3001 weight=1;server 2.2.2.2:3001 weight=1;server 3.3.3.3:3001 weight=8;}
时间顺序(默认): 按用户的访问的顺序逐一的分配到正常运行的服务器上;
连接数优先(least_conn
): 优先将访问分配到列表中连接数队列最短的服务器上;
响应时间优先(fair
): 优先将访问分配到列表中访问响应时间最短的服务器上;
ip_hash: 通过 ip_hash 指定,使每个 ip 用户都访问固定的服务器上,有利于用户特异性数据的缓存,例如本地 session 服务等;
url_hash: 通过 url_hash 指定,使每个 url 都分配到固定的服务器上,有利于缓存;
当访问 localhost:80
时,就会默认访问到 /Users/files/index.html
;
server {listen 80;server_name localhost;location / {root /Users/files;index index.html;}}
可以制定一系列的规则进行访问的控制,例如直接通过 ip 限制:
# 屏蔽 192.168.1.1 的访问;# 允许 192.168.1.2 ~ 10 的访问;location / {deny 192.168.1.1;allow 192.168.1.2/10;deny all;}
其实跨域是 浏览器的安全策略,这意味着只要不是通过浏览器,就可以绕开跨域的问题。所以只要通过在同域下启动一个 Nginx 服务,转发请求即可;
location ^~/api/ {# 重写请求并代理到对应域名下rewrite ^/api/(.*)$ /$1 break;proxy_pass https://www.cross-target.com/;}
通过 ngx_http_image_filter_module 这个模块,可以作为一层图片服务器的代理,在访问的时候 对图片进行特定的操作,例如裁剪,旋转,压缩等;
绕过白名单限制: 例如我们在接入一些第三方服务时经常会有一些域名白名单的限制,如果我们在本地通过localhost
进行开发,便无法完成功能。这里我们可以做一层本地代理,便可以直接通过指定域名访问本地开发环境;
server {listen 80;server_name www.toutiao.com;location / {proxy_pass http://localhost:3000;}}
xxx.pem
和 xxx.key
文件拷贝到/etc/ssl/
目录下server {listen 443 ssl http2 default_server;listen [::]:443 ssl http2 default_server;server_name api.yiketiandi.com;root /usr/share/nginx/html;ssl_certificate "/etc/ssl/1_api.yiketiandi.com_bundle.crt";ssl_certificate_key "/etc/ssl/2_api.yiketiandi.com.key";ssl_session_cache shared:SSL:1m;ssl_session_timeout 10m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;# Load configuration files for the default server block.include /etc/nginx/default.d/*.conf;location / {}error_page 404 /404.html;location = /40x.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}# http映射到httpsserver{listen 80;server_name idrex.net;rewrite ^/(.*)$ https://idrex.net:443/$1 permanent;}