快速攻略Nginx的应用配置

2,602 阅读7分钟

nginx的介绍

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,

nginx的简单配置

由于nginx的安装配置网上一堆教程,这里就不一一阐述了。

server {
    server_name localhost;
    listen 80;  #监听的端口

    location / {  #location表示路径匹配
        root /home;  #root表示寻找文件夹的路径
        index index.html index.htm; #index表示在root已经定义的文件夹下面的具体文件
    }
}

#另一种写法
server {
    server_name localhost;
    listen 80;
    root /home;

    location / {
        #try_files是表示寻找文件 $uri表示root已经定义的变量
        #下面用来两个$uri是因为有时候html会引入其他css或者js文件,第一个$uri表示在当前文件夹下面寻找,第二个$uri表示精确找到html文件
        try_files $uri $uri/ /index.html;
    }
}

location用来匹配url地址,语法是:location [ = | ~ | ~* | ^~ ] uri{}  这里会有四种匹配规则:

  • = 该装饰符会精确匹配并终止搜索
  • ~ 该装饰符使用区分大小写的正则表达式匹配
  • ~* 该装饰符使用不区分大小写的正则表达式匹配
  • ^~ 该装饰符使用在不含正则表达式的uri前,当匹配成功以后,将不会再执行其他的正则表达式的location块

nginx的正反向代理概念

**正向代理:**假如你想翻墙出去看YouTube网站,众所周知国内IP是不能直接访问外网网站的,这个时候你就得挂一个vpn才能成功访问。在这里vpn的ip代理了你的国内ip,外网的这个网站也只认vpn的ip,只让vpn的ip通过,故vpn就是中间代理,只有经过成功代理才能正常访问到外网网站。

**反向代理:**现在假设用户是租户,服务器是房子,租户现在想要找一间房屋居住,这时租户就去找房屋中介的人租房屋,房屋中介的工作人员就帮租户去找房东租借房屋,但是租户并不认识房屋的房东是谁,他只认识房屋中介的人。

nginx的正向代理

建议拿两台服务器去测试,效果比较直观,现在我给服务器A设置正向代理,服务器B设置拦截,假设服务器A的IP地址是 1.1.1.1,服务器B的IP地址是2.2.2.2;

先来配置服务器A

server{
    resolver 8.8.8.8;
    listen 80;
    server_name localhost 2.2.2.2;
    location / {
        proxy_pass http://$http_host$request_uri;
    }
}

再去配置服务器B

server{
    server_name localhost;
    listen 80;   

    location / {
        #注意这里if和括号中间有一个空 不然保存会报错
        if ( $remote_addr !~* "1\.1\.1\.1" ){
            return 403;
        }

        root html;
        index index.html;
    }
}

配置完成服务器A和B的nginx后,重启nginx服务 /usr/local/nginx/conf/nginx.conf -s reload

这里保存服务器B的时候可能会报错,修改保存的指令为 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

然后在本地去尝试访问服务器B的80端口,会返回一个403的错误页面,说明拦截已经成功了,再来验证正向代理成功了没,在geogle浏览器里下载一个扩展插件 Proxy SwitchySharp,把网页的代理手动设置为服务器A的IP和80端口,设置成功以后切换到服务器A的代理,再去访问服务器B的80端口发现访问成功了,说明正向代理已经成功!

nginx的反向代理

我只拿了我自己的服务器A测试,用pm2同时开了两个node后端服务(这里有一个小坑,第一次安装成功开启node服务,可能node端口打不开,也不能访问后台服务,但用npm指令能启动node服务,说明node项目没有问题,直接重启服务器再开启pm2监听就行了),端口号分别是4001和4002,我再拿4000端口拿去做反向代理。

server{
    listen 4000;
    server_name localhost;

    location /a/{
        proxy_pass http://localhost:4001/; #这里有个坑,node服务默认是给了/,这里也就需要带,否则将代理失败
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        #后台服务通过x-forward-for知道用户的实际IP
        proxy_set_header X-Forward-For $proxy_add_x_forward_for;
    }

    location /b/{
        proxy_pass http://localhost:4002/;
    }
}

配置完成以后重启nginx服务,通过localhost:4000/a/可以访问到localhost:4001的node服务,通过localhost:4000/b/可以访问到localhost:4002的node服务,到这里反向代理配置成功!

nginx的负载均衡

顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。

使用nginx实现负载均衡需要proxy模块和upstream模块搭配实现,upstream将启用一个新的配置区域,在该区域定义了一组上游服务器。

#1.默认轮询
#每个请求按照时间顺序分别分配到其他后台服务器,如果设置down则表示服务器暂时停机不作使用
#设置backup则表示其他所有非backup状态的主机在down或者忙的时候才会访问这个backup状态的主机
#设置max_fails表示最大失败数,超过次数则暂时停机
#设置fail_timeout表示如果请求受理失败,则暂停指定的多少秒以后重新发起请求
upstream myserver{
    server localhost:4001 down;
    server localhost:4002 max_fails=3 fail_timeout=20s;
    server localhost:4003 backup;
}
#####################################
#2.weight权重分配
#指定轮询几率,权重跟轮询几率成正比,用来解决服务器性能不均的问题
upstream myserver{
    server localhost:4001 weight=3;
    server localhost:4002 weight=5;
    server localhost:4003 weight=3;
}
####################################
#3.ip_hash分配
#每个请求按照ip的hash分配,即每个用户都固定使用一个后台服务器,用来解决session不同的问题
upstream myserver{
    ip_hash;
    server localhost:4001;
    server localhost:4002;
    server localhost:4003;
}
#4.fair(第三方包,需要自己去下载配置)
#按后台服务器的响应时间来分配请求,响应时间少的优先分配
upstream myserver{
    server localhost:4001;
    server localhost:4002;
    server localhost:4003;
    fair;
}

server{

    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://myserver;
    }
}

nginx的静态加载文件

在服务器的文件夹里偶尔会存放文件、图片,这个时候想要在本地直接查看文件但是又不想登录服务器去看,就需要用nginx去静态加载文件。

server{
    server_name localhost;
    listen 80;

    location /image/{
        autoindex on; #打开自动列表
        alias /home/image/; #将/image/映射到/home/image/文件夹
    }
}

nginx的https配置

https是基于http协议的,使用SSL或TLS进行加密处理数据、验证对方身份和数据完整性保护。

  1. https里客户端(浏览器)向服务端发送信息,客户端用服务端的公钥加密,然后传输到服务端以后,服务端用私钥解密。
  2. 服务端向客户端发送信息,服务端通过私钥加密,然后传输到客户端,客户端再用服务端的公钥解密。

一般是需要申请CA的https证书的,我用的是aliyun的服务器,所以需要找aliyun去申请证书,

假设我已经申请证书成功了,证书分别是 /home/test.pem和/home/test.key,我的服务器备案网址是www.example.cn,现在开始配置nginx的https:

server {
       server_name localhost www.example.cn example.cn;
        listen 80;
        listen [::]:80; #配置https2的ipv6地址
        listen 443 ssl http2; #配置443端口监听https加密
        listen [::]:443 ssl http2;

        ssl_certificate  /home/test.pem;
        ssl_certificate_key /home/test.key;

        ssl_session_cache shared:SSL:10m;#配置共享会话缓存大小
        ssl_session_timeout 5m; #配置会话超时时间

        add_header X-xss-Protection 1;#防止xss攻击

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

1.保存的时候可能会提示ipv6模块无法配置,因为是aliyun咱不支持ipv6模块,可将 [::]:80[::]:443还有后缀http2删除掉。

2.保存的时候可能会遇到模块报错nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx,这说明没有nginx没有开启ssl模块,再查看原有模块/usr/local/nginx/sbin/nginx -V会看到下面有一行是configure arguments,如果看到没有http_ssl_modul,则进入源码包cd /usr/local/src/nginx-1.11.3,执行./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module,这时把nginx服务停止/usr/local/nginx/sbin/nginx -s stop,再依次执行 makemake install,再开启nginx服务./usr/local/nginx/sbin/nginx就行了。

nginx优化配置

打包压缩文件

http{

    gzip on; #开启gzip压缩输出
    gzip_min_length 1k;#最小压缩文件大小
    gzip buffers 4 16k;#压缩缓冲区
    gzip_comp_level 9; #压缩的等级,数值为1-9的任意值,9是最慢但压缩比最大
    #压缩的文本类型
    gzip_types  text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_disable "MSIE[1-6]\."; #IE6客户端以下禁用压缩
}

worker机制

每个worker就是一个独立的进程,但每个进程里只有一个主线程,通过异步非堵塞的方式来方式来处理请求,每个worker的线程可以发挥服务器的一个cpu,所以设置worker数和服务器的cpu数相等是最合适的,再设置worker_connection连接数,表示最大的并发数。假如每次服务器要占三个连接,那么最大并发量是worker_processes * woker_connection/3,假如设置了反向代理服务器,则最大并发量是worker_processes * woker_connection/6,因为每个并发会建立前端和后台的连接,占用两个连接。

http{
    worker_processes 4;
    worker_cpu_affinity 0001 0010 0100 1000; #分配cpu块

    pid logs/nginx.pid; #进程文件

    worker_rlimit_nofile 1024; #一个nginx进程最多打开多少文件

    events{
        use epoll;#使用多路复用方式,提高nginx性能
        worker_connection 1024; #单个process的最大并发量
    }

}

如有错误或者缺漏,欢迎指出!