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的安装并实现来负载均衡。
有什么问题,欢迎留言。
1