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<KEY,VALUE>。

本地测试可以修改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;

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342