centos7之安装负载均衡服务器Nginx

Nginx (engine x)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx可以在大多数 UnixLinux OS 上编译运行,并有 Windows 移植版。

代理服务器:一般是指局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在客户端。

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

这里讲得很直白。反向代理方式实际上就是一台负责转发的代理服务器,貌似充当了真正服务器的功能,但实际上并不是,代理服务器只是充当了转发的作用,并且从真正的服务器那里取得返回的数据。

负载均衡的作用:

例如一台服务器本身的性能能够支持1w个业务并发处理

如果业务并发少于1w个,机器也能负重前行

但是如果有5w个怎么办呢

简单的办法是使用nginx做前面的类似于堡垒机

10w个并发都打到这个nginx

但是nginx本身不处理业务,所以他能接纳10w个并发,但是他本身没有处理能力

而是把这个10w个并发,按照一定的策略分配给后面的其他机器

这样的好处是

1.通过1个nginx+n个后面的机器组成一个小集群,能处理超过单台机器接纳的上线

2.对外提供服务一般会固定一个ip,而往往你的业务一个ip(也就是单台服务器)不能完全处理,那么找一个性能不错的专门负责转发外面的业务请求(一般这种对服务器的压力不会太大),然后发给真正需要处理业务的后面的例如tomcat去,这样能够对外提供一致的提供服务的点

如果并发有50w个怎么办?

这种即使仅仅是转发,单个nginx都没法处理,性能要求太高,而且即使性能能够跟上,操作系统的端口数也是有限的

这个时候就需要高级的转发服务器了

这方面有硬件的例如f5或者软件的ha

然后将请求分发给nginx,nginx再分发给具体处理业务的例如tomcat

但是功能都是一样的:提供统一的对外访问入口,转发请求给真正的执行者

安装步骤:

1,先安装gcc 等

yum -y install gcc gcc-c++ wget

2,安装一些库

yum -y install gcc wget automake autoconf libtool libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed pcre-devel openssl-devel

3,进入默认的软件目录

cd /usr/local/src/

4,下载nginx软件(进入下载页面查看最新版本http://nginx.org/download)

wget http://nginx.org/download/nginx-1.13.3.tar.gz

5,解压

tar zxvf nginx-1.13.3.tar.gz

6,进入 nginx1.13.3的源码  如果想改版本号 可以进入源码目录src/core/nginx.h更改

cd nginx-1.13.3/

7,创建一个nginx目录用来存放运行的临时文件夹

mkdir -p /var/cache/nginx

8,开始configure

./configure \

--prefix=/usr/local/nginx \

--sbin-path=/usr/sbin/nginx \

--conf-path=/etc/nginx/nginx.conf \

--error-log-path=/var/log/nginx/error.log \

--http-log-path=/var/log/nginx/access.log \

--pid-path=/var/run/nginx.pid \

--lock-path=/var/run/nginx.lock \

--http-client-body-temp-path=/var/cache/nginx/client_temp \

--http-proxy-temp-path=/var/cache/nginx/proxy_temp \

--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \

--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \

--http-scgi-temp-path=/var/cache/nginx/scgi_temp \

--user=nobody \

--group=nobody \

--with-pcre \

--with-http_v2_module \

--with-http_ssl_module \

--with-http_realip_module \

--with-http_addition_module \

--with-http_sub_module \

--with-http_dav_module \

--with-http_flv_module \

--with-http_mp4_module \

--with-http_gunzip_module \

--with-http_gzip_static_module \

--with-http_random_index_module \

--with-http_secure_link_module \

--with-http_stub_status_module \

--with-http_auth_request_module \

--with-mail \

--with-mail_ssl_module \

--with-file-aio \

--with-ipv6 \

--with-http_v2_module \

--with-threads \

--with-stream \

--with-stream_ssl_module

9,编译

make

10,安装

make install

11,启动nginx

/usr/sbin/nginx

12,配置服务

vi /usr/lib/systemd/system/nginx.service

输入以下内容后保存

[Unit]

Description=nginx - high performance web server

Documentation=http://nginx.org/en/docs/

After=network.target remote-fs.target nss-lookup.target

[Service]

Type=forking

PIDFile=/var/run/nginx.pid

ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf

ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/bin/kill -s QUIT $MAINPID

PrivateTmp=true

[Install]

WantedBy=multi-user.target

文件保存后,刚刚配置的服务需要让systemctl能识别,就必须刷新配置

systemctl daemon-reload

13,设置开机启动

systemctl enable nginx.service

重启电脑,看到nginx已自启。

reboot

ps -ef|grep nginx

14,后面可以用systemctl来操作nginx.service

systemctl start nginx.service

systemctl stop nginx.service

如果使用命令出现如下报错

Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.

修改文件/usr/lib/systemd/system/nginx.service测试是否能启用服务。

vi /usr/lib/systemd/system/nginx.service

输入以下内容后保存

[Unit]

Description=nginx - high performance web server

Documentation=http://nginx.org/en/docs/

After=network.target remote-fs.target nss-lookup.target

[Service]

Type=forking

PIDFile=/var/run/nginx.pid

ExecStartPre=/usr/sbin/nginx

ExecStart=/usr/sbin/nginx

ExecStop=/bin/kill nginx

PrivateTmp=true

[Install]

WantedBy=multi-user.target

15,查看nginx版本

nginx -v

访问nginx,现在你可以通过公网ip (本地可以通过 localhost /或 127.0.0.1 ) 查看nginx 服务返回的信息。

curl -i localhost

16,17,18是修改nginx配置文件的例子,配置文件位于/usr/local/src/nginx-1.13.3/conf/

使用命令

vi /usr/local/src/nginx-1.13.3/conf/nginx.conf

16,常见例子->访问静态文件

#定义Nginx运行的用户和用户组

user  nginx nginx;

#nginx进程数,建议设置为等于CPU总核心数。用lscpu命令查看cou核数

worker_processes  1;

#nginx默认是没有开启利用多核cpu的配置的。需要通过增加worker_cpu_affinity配置参数来充分利用多核cpu。

#worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。

worker_rlimit_nofile 65536;

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

#进程文件

#pid   /var/run/nginx.pid;

events {

#单个进程最大连接数(最大连接数=连接数*进程数)

    worker_connections  65536;

}

#设定http服务器

http {

#文件扩展名与文件类型映射表

    include       mime.types;

#默认文件类型

default_type  application/octet-stream;

    log_format  main  '$remote_addr [$time_local] $upstream_addr $upstream_status $upstream_response_time "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';

    log_format cachelog '$time_local - $upstream_cache_status - Cache-Control:$upstream_http_cache_control - $request($status) - ';

    access_log  logs/access.log  main;

    sendfile        on;

    tcp_nopush     on;

    proxy_ignore_client_abort on;

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

    keepalive_timeout  65;

#默认编码

    charset utf-8;

#gzip模块设置

    gzip on; #开启gzip压缩输出

    gzip_min_length 10k; #最小压缩文件大小

    gzip_buffers 4 16k; #压缩缓冲区

    gzip_comp_level 2; #压缩等级

#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。

    gzip_types text/plain text/javascript application/javascript application/x-javascript text/css  application/xml application/octet-stream;

    gzip_vary on;

#虚拟主机的配置

    server {

#被监听的端口号和网址

        listen       80;

#域名可以有多个,用空格隔开

        server_name  www.test.com;

        #charset koi8-r;

#定义本虚拟主机的访问日志

        access_log  logs/test_access.log  main;

#对 "/" 启用反向代理

        location / {

#这个地方指定被访问的文件夹位置

            root   /data/test;

            index  index.html index.htm;

        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

#图片缓存时间设置

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {

        root /data/test;

        expires 30d;

        }

    }

    #location ~ /purge(/.*){

    #    allow 192.168.0.0/16;

    #    deny all;

    #    proxy_cache_purge resource $host$1$is_args$args;

    #}

}

17,常见例子->一个负载均衡例子

user  nginx nginx;

worker_processes  8;

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

worker_rlimit_nofile 65536;

events {

    worker_connections  65536;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

# log_format日志格式

    log_format  main  '$remote_addr [$time_local] $upstream_addr $upstream_status $upstream_response_time "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';

log_format cachelog '$time_local - $upstream_cache_status - Cache-Control:$upstream_http_cache_control - $request($status) - ';

    access_log  logs/access.log  main;

    sendfile        on;

    tcp_nopush     on;

    proxy_ignore_client_abort on;

    keepalive_timeout  65;

    #keepalive_timeout  1000;

    charset utf-8;

    gzip on;

    gzip_min_length 10k;

    gzip_buffers 4 16k;

    gzip_comp_level 2;

    gzip_types text/plain text/javascript application/javascript application/x-javascript text/css  application/xml application/octet-stream;

    gzip_vary on;

    upstream balance{

        server 192.168.21.77:8080;

    }

    server {

        listen       80;

        server_name www.website.com;

        #charset koi8-r;

        access_log  logs/website.log  main;

    #request proxy server

        location / {

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header REMOTE-HOST $remote_addr;

#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#这里设置代理的位置

            proxy_pass http://balance;

            proxy_redirect default;

        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html

        #

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

#设定查看Nginx状态的地址

    location /nginx_status{

                stub_status on;

access_log off;#指定全局的 log 是否打开

                allow all;

               # deny all;

        }

    }


}

18,常见例子->多个负载均衡,多个服务,多个端口

user  nginx nginx;

worker_processes  8;

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

worker_rlimit_nofile 65536;


#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {

    worker_connections  65536;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    log_format  main  '$remote_addr [$time_local] $upstream_addr $upstream_status $upstream_response_time "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';

    log_format cachelog '$time_local - $upstream_cache_status - Cache-Control:$upstream_http_cache_control - $request($status) - ';

#全局日志记录记录的位置及日志格式

    access_log  logs/access.log  main;

    sendfile        on;

    tcp_nopush     on;

    proxy_ignore_client_abort on;

    keepalive_timeout  65;

    #keepalive_timeout  1000;

    charset utf-8;

    gzip on;

    gzip_min_length 10k;

    gzip_buffers 4 16k;

    gzip_comp_level 2;

    gzip_types text/plain text/javascript application/javascript application/x-javascript text/css  application/xml application/octet-stream;

    gzip_vary on;

#负载均衡示例 1

    upstream balance1{

        server 192.168.21.76:8093 max_fails=3 fail_timeout=30s;

    }

#负载均衡示例 2

    upstream balance2{

        server 192.168.21.76:8070;

        server 192.168.21.76:8071 down;

    }

#负载均衡示例 3

    upstream balance3{

        server 192.168.21.76:8080 max_fails=3 fail_timeout=30s;

    }

#web服务 1

    server {

        listen       80;

        server_name www.website1.com;

        #charset koi8-r;

#当前 web 服务的日志 位置、格式

        access_log  logs/404_access.log  main;

    #request proxy server

        location / {

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header REMOTE-HOST $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_pass http://balance1;

            proxy_redirect default;

        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    location /nginx_status{

                stub_status on;

access_log off;#指定全局的 access_log 是否打开

                allow all;

               # deny all;

        }

    }

    server {

        listen       80;

        server_name website2.com;

        #charset koi8-r;

        access_log  logs/website2.log  main;

    #request proxy server

        location / {

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header REMOTE-HOST $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_pass http://balance3;

            proxy_redirect default;

        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    location /nginx_status{

                stub_status on;

                access_log off;

                allow all;

               # deny all;

        }

    }

    server {

        listen       80;

        server_name www.website3.com;

        #charset koi8-r;

        access_log  logs/website3.log  main;

    #request proxy server

        location / {

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header REMOTE-HOST $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_pass http://balance1;

            proxy_redirect default;

        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    location /nginx_status{

                stub_status on;

                access_log off;

                allow all;

               # deny all;

        }

}

    server {

        listen       8060;

        server_name 192.168.1.111;

        #charset koi8-r;

        access_log  logs/website4.log  main;

    #request proxy server

        location / {

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header REMOTE-HOST $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_pass http://balance2;

            proxy_redirect default;

        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    location /nginx_status{

                stub_status on;

                access_log off;

                allow all;

               # deny all;

        }

    }

}

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

推荐阅读更多精彩内容