Last Updated on

前言

nginx是一个高性能的http和反向代理服务器。其可以作为http服务器,取代常见的apache。但更多的是作为反向代理服务器,常用于构建web服务集群的负载均衡器,在常见的互联网架构中担任重要的一环。

今天就来记录介绍一下,nginx的安装与配置,以实现负载均衡的功能。

正文

1. 准备环境

为了更好的看到负载均衡的效果,我们之前记录过如果安装tomcat和启动tomcat服务,那么我们就在两台服务器上分别启动tomcat,然后将tomcat的默认页面做一些修改,已标记此tomcat服务,配置负载均衡后,不断刷新nginx,来查看负载均衡的效果。

部署启动tomcat可参考:《centos7 安装Tomcat》

两台服务器ip分别为192.168.0.1,192.168.0.2

# 安装tomcat后,修改默认页面,做一下标示。
# {your-tomcat-dir}改为你tomcat目录的路径
$ vim {your-tomcat-dir}/webapps/ROOT/index.jsp
---------------------------------------------------------------------
# 里面有这样的一行标题,在41行。我们将Congratulations改为Tomcat1,Tomcat2以此来标示两台不同的tomcat
# <h2>If you're seeing this, you've successfully installed Tomcat. Congratulations!</h2>

<h2>If you're seeing this, you've successfully installed Tomcat. Tomcat1!</h2>
---------------------------------------------------------------------

分别在两台tomcat服务器上修改默认页面后,正常启动tomcat, 然后下面进行nginx的安装与负载均衡的配置。

2. 安装nginx

nginx的安装有两种方式::

  • Yum安装,方便快捷,虽然不能装最新版,但默认就已安装了常用的大部分模块,不需要手动执行,推荐此安装方式。
  • 源码安装,可以安装最新版,但是较麻烦,需要指定安装的模块。

下面我就分别记录介绍一下这两种安装方式。

Yum安装

# nginx需要epel源
$ yum install epel-release

# 如果上面的安装不了,可以使用阿里云的epel源
$ rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

# 直接通过yum安装nginx
$ yum install nginx 

# 安装完成后,就可以使用systemctl命令管理nginx
# 启动nginx
$ systemctl start nginx

# 设为开机启动
$ systemctl enable nginx

# 查看nginx状态
$ systemctl status nginx

源码安装

首先去nginx官网下载页面,下载最新稳定版安装包

# 下载最新稳定版nginx源码包。
$ wget http://nginx.org/download/nginx-1.16.0.tar.gz

# 安装编译依赖包
$ yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel

# 解压并移动文件夹到/opt下
$ tar -zxvf nginx-1.16.0.tar.gz
$ mv nginx-1.16.0 /opt/
$ cd /opt/nginx-1.16.0

# 添加无法登录,没有家目录的nginx用户,用户组。
$ groupadd nginx
$ useradd nginx -g nginx -s /sbin/nologin -M

# 编译nginx,指定用户,用户组,并需要指定需要添加的模块
# 查看help信息可以查看有哪里模块可以安装
$ ./configure --help 

# 下面进行编译,这里我没
$ ./configure --user=nginx --group=nginx --with-stream --with-stream_ssl_module

# 执行编译,安装
$ make && make install

# 安装完成后,会在 /usr/local/nginx 下生成nginx的配置文件和执行文件。
# 进去默认生成的nginx的主目录
$ cd /usr/local/nginx

# 配置文件目录为:
$ cat /usr/local/nginx/conf/nginx.conf

# 启动nginx服务
$ /usr/local/nginx/sbin/nginx

# 为方便使用nginx,可以添加环境变量,在文件最后添加如下内容
$ vim /etc/profile
------------------------------------------------------------
export PATH=$PATH:/usr/local/nginx/sbin
------------------------------------------------------------

# 重载环境变量生效
$ source /etc/profile

# 然后就可以使用nginx命令进行启动,停止,重载配置
# 停止nginx
$ nginx -s stop

# 重载配置
$ nginx -s reload

此博文以yum安装方式为准进行记录。也推荐大家使用yum安装,方便快捷。

3. 负载均衡策略介绍

要实现负载均衡,需要使用nginx的负载均衡模块,默认通过yum安装时就安装了,可以通过如下命令,查看nginx版本和所安装的模块

$ nginx -V

负载均衡,顾名思义就是将多个请求分发到不同的服务上,实现均衡的负载,减小单个服务的压力。而nginx以怎样的方式进行负载分发请求呢。

nginx自带4种负载策略:

1.轮询:默认的负载策略,根据时间顺序,依次分配到不同后端。在轮询中,如果服务器down掉了,会自动剔除该服务器,此策略适合服务器配置相当,无状态且短平快的服务使用。

2.weight权重:权重越高分配到需要处理的请求越多。可以和ip_hash和least_conn配合一起使用。此策略比较适合服务器的硬件配置差别比较大的情况。

3.ip_hash:根据客户端IP进行分配,相同的客户端的请求一直发送到相同的后端服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。

4.least_conn最少连接:请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

了解了负载策略后,下面就可以进行配置,实现负载均衡。

4. 修改nginx配置实现负载均衡

# 修改nginx主配置文件,修改为如下的内容
# 其中包括一些常用的配置,可根据实际情况配置
$ vim /etc/nginx/nginx.conf
--------------------------------------------------------------
# 运行nginx的用户,默认为nginx,安装时会自动创建用户
user nginx;

# 工作进程数,推荐设置为你服务器cpu的核心数,默认自动也行,会根据需求调整
worker_processes auto;

# 错误日志路径
error_log /var/log/nginx/error.log;

# pid文件路径
pid /run/nginx.pid;

# 默认的包含模块的配置
include /usr/share/nginx/modules/*.conf;

# 时间处理配置
events {
    # 事件驱动模型,Epoll:使用于Linux内核2.6版本及以后的系统的高效事件模型
    use epoll;
    # 设置网路连接序列化,防止惊群现象发生,默认为on
    accept_mutex on;
    # 设置一个进程是否同时接受多个网络连接,默认为off
    multi_accept on;
    # 单个工作进程的最大连接数量
    worker_connections 1024;
}

# http的配置
http {
    # 日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    # 访问日志路径,格式,这里格式为main为上一行日志格式定义的main
    access_log  /var/log/nginx/access.log  main;
    
    # 开启文件传输
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    # 超时时间
    keepalive_timeout   65;
    types_hash_max_size 2048;
    
    # 启用压缩传输,费一些cpu,加快网络传输
    gzip                on;
    # 压缩文件的最小大小,小雨此大小的文件不压缩
    gzip_min_length     10k;
    # 压缩比率,1-10.越大cpu占用越多,压缩后的大小越小
    gzip_comp_level    2;
    # 指定需要压缩的文件类型
    gzip_types          text/plain application/x-javascript text/css text/xml application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/javascript application/octet-stream;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # 包含conf.d内的所有配置文件,会将配置写到include的这个地方
    include /etc/nginx/conf.d/*.conf;
    
    # 负载均衡的设置,只需要此upstream配置和下面server中的location配置。
    # 负载均衡,需要在先在http下定义上游upstream
    upstream tomcat {
      # 定义负载轮询方式,可设置为ip_hash或least_conn。配合weight权重一起使用
      least_conn;
      # weight为权重
      server 192.168.0.1:8080 weight=5;
      server 192.168.0.2:8080 weight=3;
    }
    
    # server中为监听的服务设置,可以定义多个server监听不同端口或不同域名
    server {
        # 监听端口80,都是默认的
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        
        # 根目录配置
        location / {
          # 反向代理,填上你自己的负载均衡的上游upstream的名称,来实现负载功能。
          proxy_pass    http://tomcat;
          # 下面这几条是常用的,在反向代理时传递真实访问ip和信息的配置。
          proxy_redirect off; 
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

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

# 修改完配置后,检查配置
$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

# 配置检查ok后,不中断服务进行重载配置
$ systemctl reload nginx

# 要想访问nginx,还需要开放nginx监听的端口,这里为80端口,就开放80端口
$ firewall-cmd --add-port=80/tcp --permanent
$ firewall-cmd --reload

5. 验证结果

上面配置完成并重载配置后,我们就可以通过访问nginx的80端口,来跳转到tomcat的服务,并不断刷新,就会发现,出现的页面,一会是Tomcat1,一会是Tomcat2,则证明负载成功,且根据使用的负载策略不同,实现不同的访问效果。

 结束

OK,到此则完成了nginx的安装并实现来负载均衡。

有什么问题,欢迎留言。