Nginx在我的工作中占据着很重要的一部分,因为我们公司的一些后台系统都是通过Nginx代理,才能完成联调或者开发。所以说如果没有Nginx,就不可能完成后续的项目开发。

由于一开始进公司并不了解Nginx,关于一些项目配置也是后端同事配置好发给我的。所以每次我只需要执行一下Nginx,然后在本地输入地址就能启动项目。但是就在前天开发一个项目的时候发现Nginx执行后,启动不了项目。我才开始有了想要更深入的了解Nginx的配置以及其工作原理。

什么是Nginx?

Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器,是一个高性能的HTTP和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。

Nginx可以做什么?

作为前端开发,Nginx最能解决实际问题的功能就是反向代理,其次还有负载均衡等。所以这次主要讲反向代理解决

Nginx反向代理

反向代理就是客户端访问目标服务器之间架设的一层代理服务器,代理服务器接受客户端请求将其转发给目标服务器,这个就是反向代理。

Nginx配置

因为Nginx的配置是非常多的,大部分配置不是非必填的。所以这里我以自己实际工作项目的Nginx配置为例,来解释每个配置文件的作用。

#nginx进程数
worker_processes 1;

events {

    #单个进程最大连接数
    worker_connections  1024;
}

http {
    #文件扩展名与文件类型映射表
    include       mime.types;

    #默认文件类型
    default_type  application/octet-stream;

    #通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #定义本虚拟主机的访问日志
    access_log  logs/access.log  main;

    #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
    sendfile        on;

    #长连接超时时间,单位是秒
    keepalive_timeout 120;

    #负载均衡配置
    upstream dubbo_http_adapter{
        server localhost:9090;
    }

    #虚拟主机的配置(咱们前端主要配置这里面的文件)
    server{

        #监听端口
        listen 80;

        #配置基于名称的虚拟主机,这里是基于本地
        server_name  localhost;

        #对 "/" 启用反向代理
        location / {
            #这里访问location会访问到我本地前端文件
            root F:\company\cmb_merchant\aggplat\aggplat_www
            index  index.html index.htm;
            try_files $uri $uri/ /index.html =404;
        }

        error_page   500 502 503 504  /50x.html;

        #匹配后端以.do结尾的请求
        location ~(\.do)$ {
            proxy_pass http://192.168.1.13:8086;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #以下是一些反向代理的配置,可选。
            proxy_set_header Host $host;
            proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_set_header X-Forwarded-Proto https;
        }
    }

}