1、简介

Nginx 由俄罗斯访问量第二的rambler.ru站点设计开发的,首次发布于2004年10月,是一个高性能的HTTP和反向代理的web服务器,其主要特点为占用内存少,并发能力强,官方测试数据表明能支持50000各并发连接数的响应。安装简单、配置文件简洁(支持perl语法),而且可以做到24小时不间断运行,在不间断服务的情况下进行软件升级。

国内使用nginx的公司很多,如:百度、京东、新浪、淘宝等,虽然前端用到nginx的地方不是很多,大多只是配置个反向代理,但还是有必要学习一下nginx。

2、常见应用
① 正向代理

正向代理,是指客户端将请求发送给服务器,由于服务器在外网或其他原因,导致无法访问时,通过向代理服务器发送请求,并指真正的服务器地址,然后代理服务器代替客户端将请求发送给真正的服务器,返回值也是通过代理服务器进行传递。

特点:此时客户端知道真正的服务器IP,但服务端不知道客户端的IP,只知晓代理服务器的IP。因为与服务器进行交互的全都是代理服务器,相当于代理了客户端的身份,隐藏了客户端,解决了访问限制的问题。

常见应用:翻qiang、解决跨域问题等。

前端本地 nginx 配置 前端使用nginx_代理服务器

② 反向代理

反向代理,是指客户端直接将请求发送到代理服务器,然后由代理服务器根据配置的规则,将请求转发到真正要请求的服务器,服务器将结果返回给代理服务器,再由代理服务器返回给客户端。

特点:此时客户端不知道真正的服务器IP,只知道代理服务器的IP,服务器只知道代理服务器的IP,而不知道客户端的IP,将客户端和服务器分隔开。客户端并不知道自己访问的是代理服务器,但其交互全部来自代理服务器,相当于代理了服务器的身份,隐藏了真正的服务器。

应用:负载均衡(分布式部署)、内网的安全防护等。

前端本地 nginx 配置 前端使用nginx_前端_02

③ 负载均衡

nginx通过反向代理提供的负载均衡策略有两种:内置策略和扩展策略。内置策略包括轮询、加权轮询、Ip hash等。而扩展策略就是天马行空,任何负载均衡算法,都可以使用。

轮询策略: 有多台服务器时,代理服务器将接收的多个请求,按照顺序依次轮着发送给不同的服务器,分担请求压力。

前端本地 nginx 配置 前端使用nginx_学习_03

加权轮询策略: 有多台服务器时,在nginx配置文件中通过weight给所有服务器设置权重,权重越大,被分配到请求的可能越大。在代理服务器将接收的多个请求,按照顺序依次轮着发送给不同的服务器时,根据服务器的权重,决定承担的请求压力。

前端本地 nginx 配置 前端使用nginx_学习_04

Ip hash策略: 根据客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。

前端本地 nginx 配置 前端使用nginx_前端_05

动静分离等等…

3、下载安装

下载地址:http://nginx.org/en/download.html。 进入下载页,选择自己电脑对应的稳定版本(Stable version),点击下载即可。

以windows系统为例:下载完成后,解压压缩包,得到nginx的相关文件,启动nginx的方法有两种:① 双击文件夹中的 nginx.exe 闪烁一下即可,因为启动过程不明显,其启动失败不易查找原因,所以我更推荐第二种方法。 ② 在该目录下,输入cmd,打开控制台,输入 nginx.exe ,回车执行即可。

前端本地 nginx 配置 前端使用nginx_前端本地 nginx 配置_06

进行启动操作后,在浏览器中输入:http://localhost:80 ,如果页面显示下图则说明,nginx启动成功:

前端本地 nginx 配置 前端使用nginx_学习_07

补充: 如果在通过方法二启动nginx时,控制台报错:

前端本地 nginx 配置 前端使用nginx_学习_08

说明80端口被占用,我们只需要在控制台中输入:netsh http show servicestate ,查看共同进程的ID,然后打开任务管理器,选择服务,找到PID为共同进程的ID的服务,然后右键将其停止,最后在启动nginx即可。

前端本地 nginx 配置 前端使用nginx_代理服务器_09

4、配置文件结构

在本地安装好nginx之后,我们可以从conf文件夹中找到名为nginx.conf的配置文件,里面存储的就是nginx的默认配置, 其文件结构如下:

...              #全局块 

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}

# 表示注释。

全局块: 位于配置文件最上方,用来配置nginx全局的指令,如允许生成的进程数、日志存放路径等。

events块: 用来配置影响nginx服务器或与用户的网络连接指令,如进程的最大连接数、是否允许同时接受多个网路连接等。

http块: 用来配置代理,缓存,日志定义等绝大数功能和第三方模块配置,内部可包含多个server。

server块: 用来配置虚拟主机的相关参数,如监听端口、监听地址、location等,内部可包含多个location。

location块: 用来配置拦截不同目录下的请求,以及拦截之后的请求转等操作。

前端开发经常操作的就是server块和location块,通过配置server来监听项目的域名(server_name)和端口(listen),并配置location块,来拦截对应url的请求,进行反向代理等操作。

5、常用配置项
########### 每个指令必须有分号结束。#################
# 全局块
# 配置用户或者组,默认为nobody nobody。
user administrator administrators;  
# 允许生成的进程数,默认为1
worker_processes 2;  		
# 指定nginx进程运行文件存放地址
pid /nginx/pid/nginx.pid;
 # 制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别有debug|info|notice|warn|error|crit|alert|emerg
error_log log/error.log debug;   
# events 块
events {
    accept_mutex on;   			 # 设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  			 # 设置一个进程是否同时接受多个网络连接,默认为off
    worker_connections  1024;    # 最大连接数,默认为512
}
http {
    include       mime.types;   		     # 文件扩展名与文件类型映射表
    default_type  application/octet-stream;  # 默认文件类型
    #access_log off; 						 # 取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';   # 自定义格式
    access_log log/access.log myFormat;          # combined为日志格式的默认值
    sendfile on;   								 # 允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;         # 每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;            # 连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {                      # 定义负载均衡设备的资源
      server 127.0.0.1:7878 weight=3;     # 权重轮询
      server 192.168.10.121:3333 backup;  # 热备
      # down 表示不参与负载 
      # weight 表示分配权重
      # backup 表示热备 在其他机器忙的时候,才会请求热备机器
    }
    error_page 404 https://www.baidu.com; # 错误页
    // 配置虚拟主机
    server {
        keepalive_requests 120;           # 单连接请求上限次数。
        listen       4545;                # 监听端口
        server_name  127.0.0.1;           # 监听地址或域名    
        # 拦截根目录URL下的请求
        location / { 
            root   html;
            index  index.html index.htm;
        }
        # 请求的目录url正则匹配,~为区分大小写,~*为不区分大小写。
        location  ~*^.+$ {                
           #root path;                    # 虚拟主机的网页根目录
           #index vv.txt;                 # 设置默认首页
           proxy_pass  http://mysvr;      # 设置被代理服务器的URL和端口        
        } 
    }
    // 配置http server
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;
    }
    # 配置HTTPS server
    server {
        listen       443 ssl;
        server_name  localhost;  

        ssl_certificate      cert.pem;  # ssl证书的pem 文件
        ssl_certificate_key  cert.key;  # ssl证书的key文件

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /api {
            proxy_set_header Host xapi.xxx.com;  
            proxy_pass http://10.1.1.25;
        }
    }
}
6、nginx常用命令
① nginx — 启动nginx
② nginx -s stop — 停止nginx
③ nginx -s reload —重启nginx(配置文件修改之后,必须重启才能生效)
④ nginx -s quit — 安全的退出nginx