1. 简介
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,目前互联网主流公司360、百度、新浪、腾讯、阿里等,目前中国互联网企业 70%以上公司都在使用 Nginx 作为自己的 web 服务器。Nginx 特点是占有内存少,并发能力强。
Nginx跟Apache一样都是提供Web服务功能的软件,但却通过nginx模块提供了比Apache更多更强大的功能。它采用的是事件驱动结构,使用异步套接字来接收客户端请求,是一种非阻塞结构,不使用单独的线程处理,极大的减少了服务器内存和CPU的开销
Nginx 相对于 Apache 优点:
1) 高并发响应性能非常好,官方 Nginx 处理静态文件并发 5w/s
2) 反向代理性能非常强。(可用于负载均衡)
3) 内存和 cpu 占用率低。(为 Apache 的 1/5-1/10)
2. 基本架构
一个master进程生成一个或多个worker进程,每个worker基于事件驱动(epoll机制)、消息通知机制响应N个http请求
1) 多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。
2) 一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。
3) 推荐设置 worker 的个数为 cpu 的核数
4) 异步非阻塞 (非阻塞不会让出cpu导致切换浪费)
3. 下载安装(Windows)
1)下载地址http://nginx.org/en/download.html
2)解压文件夹
3)双击运行nginx.exe
4)访问http://localhost/出现Welcome to nginx!则表示安装成功
注意:Windows双击运行之后会弹出窗口后再消失,这是正常现象,不要重复运行,再打开进程查看是否有nginx进程,多个进程也是正常现象(进程个数等于worker_processes + 1个)。
4. 核心文件nginx.conf(./conf/nginx.conf)常用关键字
worker_processes 1;#nginx进程,一般设置为和cpu核数一样
#工作模式及连接数上限
events {
worker_connections 1024;#单个进程最大连接数,最大为1024
}
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#连接超时时间
keepalive_timeout 65;
server {
#端口号
listen 8089;
#本机
server_name localhost;
charset utf-8;
location ~ .*\.(gif|jpg|jpeg|png|pdf|zip)$ {
expires 24h;
root C:/Juson/;#指定图片存放路径
#图片路径
access_log C:/nginx-1.13.2/logs/log_test.log;
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
#存储承载从代理服务器接收到的数据的临时文件定义目录
proxy_temp_path C:/Juson/;
proxy_redirect off;
proxy_set_header Host 127.0.0.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 1280k;
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 40k;
proxy_buffers 40 320k;
proxy_busy_buffers_size 640k;
proxy_temp_file_write_size 640k;
if ($request_filename ~* ^.*?\.(pdf)$){
add_header Content-Disposition: 'attachment;';
}
}
location / {
root html;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
5. 适用场景
1)HTTP服务器
如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。
#配合webpack打包
server {
listen 8989;
server_name localhost;
charset utf-8;
root html/dist;
index index.html;
location ^~ /graph_server/ {
proxy_pass http://10.10.60.35:8888/;
}
location / {
add_header 'Access-Control-Allow-Origin' '*'; #允许来自所有的访问地址
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS'; #支持请求方式
add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
try_files $uri $uri/ @router;
index index.html;
}
location @router {
rewrite ^.*$ /index.html last;
}
}
2)静态资源服务器
在公司中经常会遇到静态服务器,通常会提供一个上传的功能,其他应用如果需要静态资源就从该静态服务器中获取。
server {
#端口号
listen 8089;
#本机
server_name localhost;
charset utf-8;
location ~ .*\.(gif|jpg|jpeg|png|pdf|zip)$ {
expires 24h;
root C:/Juson/;#指定图片存放路径
#图片路径
access_log C:/nginx-1.13.2/logs/log_test.log;
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path C:/Juson/;
proxy_redirect off;
proxy_set_header Host 127.0.0.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 1280k;
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 40k;
proxy_buffers 40 320k;
proxy_busy_buffers_size 640k;
proxy_temp_file_write_size 640k;
if ($request_filename ~* ^.*?\.(pdf)$){
add_header Content-Disposition: 'attachment;';
}
}
location / {
root html;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
3)跨域
前端js中,我们常常遇到XMLHttpRequest cannot loadhttp://www.zjblogs.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.跨域请求错误。如果用Nginx来解决,那就非常简单了。
location ^~ /liems/ {
add_header 'Access-Control-Allow-Origin' '*'; #允许来自所有的访问地址
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS'; #支持请求方式
add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
proxy_pass http://192.168.13.80:6001/Liems/;
}
4)正向代理
正向代理类似一个跳板机,代理访问外部资源。
正向代理的用途:
1. 访问原来无法访问的资源,如google
2. 可以做缓存,加速访问资源
3. 对客户端访问授权,上网进行认证
4. 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
server {
listen 80;
server_name localhost;
resolver 114.114.114.114 8.8.8.8; #指定DNS服务器IP地址
location / {
proxy_pass http://$http_host$request_uri;
}
}
除此之外还要在客户端配置访问代理,IE浏览器-->工具-->Intent 选项-->连接-->局域网设置(如下图)
5)反向代理
反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理的用途:
1. 保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击
2. 负载均衡,通过反向代理服务器来优化网站的负载
#这里的域名要和下面proxy_pass的一样
upstream fengzp.com {
server 192.168.99.100:42000 weight=1;
server 192.168.99.100:42001 weight=2;
}
server {
listen 80;
server_name 192.168.99.100;
location / {
proxy_pass http://fengzp.com;
proxy_redirect default;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
6)代理数据库(需要1.9版本以上)
stream {
upstream backend {
server 127.0.0.1:3306;
}
server {
listen 8081;
proxy_connect_timeout 8s;
proxy_timeout 24h;
proxy_pass backend;
}
}
7)代理 TCP/IP 协议,典型的是 socket 通信
stream {
upstream test-server {
server 192.168.1.249:13000;
}
server {
#so_keepalive=on 保证连接持续
listen 8191 so_keepalive=on;
#listen 12000;
# proxy_connect_timeout 1s;
# # proxy_timeout 3s;
proxy_pass test-server;
}
}
8)思考?
服务器A(有公网IP 130.130.130.130,内网IP 192.168.10.2),服务器B(内网IP 192.168.10.3,部署了应用服务),现在APP需要调用内网服务,WEB应用也需要调用内网服务,资源文件也需要在外网访问,并且服务器A只能开通一个端口,怎样合理部署Nginx呢?
可以通过 Nginx 路径匹配规则,通配符来分别路由。具体可以参考https://blog.csdn.net/jy02149522/article/details/79066574