Nginx代理服务器详解

1. 什么是Nginx

1.1. 介绍

Nginx是一款高性能的http 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev用c语言所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗非常低,运行非常稳定。

1.2. 主要运用场景

http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。

虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。

反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。

2. Nginx的安装与使用

2.1. 准备安装环境

第一步:在Linux系统上安装gcc环境。

yum -y install gcc-c++

第二步:安装第三方开发包PCRE库,nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。

yum install -y pcre pcre-devel

第三步:安装第三方zlib库,nginx使用zlib对http包的内容进行压缩与解压缩。

yum install -y zlib zlib-devel

第四步:安装OpenSSL安全套接字密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议。

yum install -y openssl openssl-devel

2.2. 安装Nginx

第一步:下载Nginx源码包,并解压到自己创建目录。

第二步:进入到解压目录,依次输入指令./configure、make、make install,进行安装,安装完成后Nginx的相关文件在/usr/local/nginx目录下。如需要改变相关路径,首先创建client目录,然后在执行configure命令时,添加配置路径项,指令如下:

mkdir /var/temp/nginx/client -p
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
image.png

第三步:进入安装目录/usr/local/nginx/sbin/,启动nginx,执行命令:

[root@localhost sbin]# ./nginx

第四步:输入指令ps aux|grep nginx检查nginx是否启动成功,并在浏览器中输入ip进行访问。

image.png
image.png

注:访问的默认端口是80端口。注意:看是否关闭防火墙。

2.3. Nginx相关命令

 /usr/local/nginx/sbin/nginx   # 启动服务
 /usr/local/nginx/sbin/nginx -s reload  # 重新加载服务
 /usr/local/nginx/sbin/nginx -s stop    # 停止服务
 /usr/local/nginx/sbin/nginx -s quit    # 停止服务

补充:为Nginx添加开机自动启动。

第一步:修改/etc/rc.local文件,添加一行/usr/local/nginx/sbin/nginx,保存并退出。

image.png

第二步:在/etc目录下执行指令,使其生效。

chmod 755 rc.local

3. Nginx配置多个虚拟主机

虚拟的主机就是在一台服务器启动多个网站。Nginx可以通过端口不同和域名不同来区分不同的网站。

3.1. 通过端口区分虚拟主机

第一步:vim打开配置文件/usr/local/nginx/conf/nginx.conf,添加两个不同端口的Server,并修改listen访问端口和root对应的访问目录,此目录默认为/usr/local/nginx/html,这里改为html1和html2。

image.png

第二步:复制/usr/local/nginx/html文件夹两份,名字分别为html1和html2。注意名字要去第一步root修改的名字一样。

image.png

第四步:为了区分是否为不同虚拟主机,修改html1和html2目录下的index.html文件,如下:

image.png
image.png

第三步:执行Nginx重启命令,重启。

/usr/local/nginx/sbin/nginx -s reload

第四步:在浏览器中输入地址+端口,访问如下,表示配置成功。

image.png

image.png

3.2. 通过域名区分虚拟主机

3.2.1 域名的分类

域名分为一级域名(顶级域名)、二级域名和三级域名。举例如下:

一级域名:又叫顶级域名

Baidu.com

Taobao.com

Jd.com

二级域名:

www.baidu.com

Image.baidu.com

Item.baidu.com

三级域名:

1.Image.baidu.com

Aaa.image.baidu.com

3.2.2 域名访问网站的过程

域名访问网站,其本质还是通过Tcp/ip协议访问,以下为通过域名访问的流程图:

image.png

DNS服务器:把域名解析为ip地址。保存的就是域名和ip的映射关系,可以简单的理解为一个MAP

本地测试可以修改host文件。修改window的hosts文件:(C:\Windows\System32\drivers\etc),可以通过SwitchHosts工具,以管理员权限运行的方式进行修改。

3.2.3 配置域名并访问

第一步:修改Window系统文件C:\Windows\System32\drivers\etc\hosts,添加需要访问的域名,可以通过SwitchHosts工具添加。

image.png

第二步:打开hosts文件,检查是否添加成功。如果没有添加成功,请检查是否开启相关权限控制软件,如360安全卫士。

image.png

第三步:在Linux系统中,vim打开配置文件/usr/local/nginx/conf/nginx.conf,添加两个不同端口的Server,并修改server_name访问域名和root对应的访问目录,这里改为html3和html4。

image.png

第四步:复制/usr/local/nginx/html文件夹两份,名字分别为html3和html4。注意名字要去第三步root修改的名字一样。

image.png

第五步:为了区分是否为不同虚拟主机,修改html3和html4目录下的index.html文件,如下:

image.png

image.png

第六步:执行Nginx重启命令,重启。

/usr/local/nginx/sbin/nginx -s reload

第七步:在浏览器中输入域名,访问如下,表示配置成功。

image.png
image.png

4. Nginx代理模式

Nginx代理模式分为正向代理和反向代理。正向代理指的是,用户访问代理服务器,代理服务器直接转发请求到指定服务器;反向代理指的是,用户访问公网ip网站入口,由代理服务器决定内部网络上哪一台服务器提供对应服务。以下正向代理和反向代理通过tomcat服务器演示。

4.1. 配置正向代理

正向代理,需要在客户机中安装代理软件。用户访问网站时,会被代理软件拦截,然后代理软件去请求用户访问的网站,获得网站数据,在返回给用户,在访问过程中,浏览器地址栏网站不会发生改变。

4.2. 配置反向代理

第一步:安装两个tomcat,修改配置文件端口分别为8081和8082。为了进行区分,修改tomcat目录下/ webapps/ROOT/index.jsp文件,然后启动两个tomcat。

image.png
image.png

第二步:修改Window系统文件C:\Windows\System32\drivers\etc\hosts,添加需要访问的域名,可以通过SwitchHosts工具添加。

image.png

第三步:在Linux系统中,vim打开配置文件/usr/local/nginx/conf/nginx.conf,添加两个不同端口的Server,并修改server_name访问域名;分别添加upstream tomcat1和upstream tomcat2;在location中添加proxy_pass 为tomcat1和tomcat2访问地址。(也可不添加upstream,直接在proxy_pass中添加访问地址)

image.png

第四步:执行Nginx重启命令,重启。

第五步:在浏览器中输入指定域名,访问如下,表示配置成功。

image.png
image.png

5. 负载均衡

如果一个服务由多台服务器提供,需要把负载分配到不同的服务器处理,需要配置负载均衡,默认的负载均衡的策略就是轮询的方式。

upstream tomcat2 {
    server 192.168.25.130:8081;
    server 192.168.25.130:8082;
 }

也可以根据服务器的实际情况调整服务器权重。权重越高分配的请求越多,权重越低分配的请求越,默认是都是1。

upstream tomcat2 {
    server 192.168.25.130:8081;
    server 192.168.25.130:8082 weight=2;
 }

其他的负载均衡的策略:1.通过IP地址的hash值 做映射。2.通过URL的方式计算出Hash值 。3.随机策略。4.最少并发量。

查考nginx.conf配置方案:

user  nginx;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
    
    upstream myapp1 {
        server 192.168.25.132:9090 weight=2;
        server 192.168.25.132:9091 weight=10;
    }

    server {
        listen 80;
        server_name www.demon.com;
        location / {
            proxy_pass http://myapp1;
            index index.jsp index.html index.htm;
        }
    }
}

6. 扩展知识

6.1. Nginx解决跨域问题

以下为文件上传的跨域配置方案:

user  nginx;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen 80;
        server_name www.demon.com;
        add_header 'Access-Control-Allow-Origin'  '*';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
        location / {
            proxy_pass  http://192.168.25.134:8888;
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin  *;
                add_header Access-Control-Allow-Headers X-Requested-With;
                add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,PATCH,OPTIONS;
                # 解决假请求问题,如果是简单请求则没有这个问题,但这里是上传文件,首次请求为 OPTIONS 方式,实际请求为 POST 方式
                # Provisional headers are shown.
                # Request header field Cache-Control is not allowed by Access-Control-Allow-Headers in preflight response.
                add_header Access-Control-Allow-Headers DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range;
                return 200;
            }
        }
    }
}

6.2. Keepalived实现Nginx主备

Keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。

Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

6.3 配置HTTPS

编译命令

./configure --prefix=/data/test/nginx/ --with-http_stub_status_module --with-http_ssl_module --with-stream

配置文件:

#user  nobody;
worker_processes  1;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;
        server_name  fin-uatms.vvtechnology.cn;

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

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }


    # HTTPS server
    #
    server {

        listen 443 ssl;
        server_name fin-uatms.vvtechnology.cn;

        ssl_certificate   /data/test/nginx/fin-uatms.vvtechnology.cn.pem;
        ssl_certificate_key  /data/test/nginx/fin-uatms.vvtechnology.cn.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

    }

}

你可能感兴趣的:(Nginx代理服务器详解)