Nginx
安装
nginx是C语言开发,建议在linux上运行,本教程使用Centos7作为安装环境。
安装依赖
n gcc
安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:
yum install gcc-c++
n PCRE
PCRE是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。
yum install -y pcre pcre-devel
注意:pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。
n zlib
zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。
yum install -y zlib zlib-devel
n openssl
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库
yum install -y openssl openssl-devel
或者直接一键安装以上四个依赖
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
编译安装
将nginx-1.20.1.tar.gz拷贝至linux服务器。
解压:
tar -zxvf nginx-1.20.1.tar.gz
安装:
cd nginx-1.20.1
./configure
make && make install
注意:安装完成后的路径为:/usr/local/nginx
常用命令
注意所有命令都是在usr/local/nginx/sbin目录下执行
[root@localhost ~]# cd /usr/local/nginx/sbin
[root@localhost sbin]# ./nginx #启动
[root@localhost sbin]# ./nginx -s stop #停止
[root@localhost sbin]# ./nginx -s reload #修改过配置文件后,想让配置生效不用再次启动服务,重加载
[root@localhost sbin]# cd /usr/local/nginx/conf
[root@localhost conf]# cat nginx.conf #nginx.conf > nginx服务配置文件
[root@localhost conf]# ps -ef|grep nginx #查看相关进程
注意:linux中默认有防火墙,默认情况下端口号是访问不到的,需要在防火墙中加个规则,让它能访问到你的端口号(nginx配置文件中默认80端口)
启动nginx服务后,在浏览器输入虚拟机地址,即可看到启动界面
反向代理
概述
对于反向代理,客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
实例1
实现效果:
在浏览器地址栏输入地址www.123.com,跳转到liunx 系统tomcat 主页面中
实现步骤:
1.修改Windows中的hosts域名映射
#虚拟机域名 映射的网址
192.168.42.128 www.123.com
2.修改nginx的配置文件,并启动
server {
listen 80;
server_name 192.168.42.128;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://127.0.0.1:8080;
root html;
index index.html index.htm;
}
3.下载安装tomcat,并启动,我这里是apache-tomcat-8.5.70,注意将8080端口开放
效果展示:
实例2
实现效果:
使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中。
如果请求路径中,包含/edu/,则将请求转发给tomcat1,如果请求路径中,包含/vod/,则将请求转发给tomcat2
实现步骤:
1.修改nginx配置文件,并启动
server {
listen 80;
server_name 192.168.42.128;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location ~ /edu/{
proxy_pass http://127.0.0.1:8081;
}
location ~ /vod/{
proxy_pass http://127.0.0.1:8082;
}
#error_page 404 /404.html;
2.拷贝两个tomcat,将端口信息修改为8081和8082,开启防火墙
3.在每一个tomcat的webapps中创建一个文件夹和a.html文件
[root@localhost ~]# mkdir -p /usr/local/tomcat1/webapps/edu
[root@localhost ~]# echo "<h1>This is 8081 Port</h1>" > /usr/local/tomcat1/webapps/edu/a.html
[root@localhost ~]# mkdir -p /usr/local/tomcat2/webapps/vod
[root@localhost ~]# echo "<h1>This is 8082 Port</h1>" > /usr/local/tomcat2/webapps/vod/a.html
4.启动tomcat
实现效果:
负载均衡
概述
由单个服务器处理请求改为多个服务器处理请求,将请求分发到多个服务器上,将负载分发到不同的服务器,就是所说的负载均衡。
实例
实现效果:
浏览器地址栏输入地址 http://192.168.42.128/edu/a.html,负载均衡效果,将请求平均到 8081 和 8082 端口中。
实现步骤:
1.修改nginx的配置文件,并启动
upstream myserver {
server 192.168.42.128:8081;
server 192.168.42.128:8082;
}
server {
listen 80;
server_name 192.168.42.128;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
2.在tomcat2的webapps文件夹中,创建一个edu文件夹,创建a.html, 启动tomcat
[root@localhost ~]# mkdir -p /usr/local/tomcat2/webapps/edu
[root@localhost ~]# echo "<h1>This is 8082 Port</h1>" > /usr/local/tomcat2/webapps/edu/a.html
实现效果:
分配策略:
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
upstream server_pool {
server 192.168.42.21:80;
server 192.168.42.22:80;
}
weight
weight 代表权重,默认为1,权重越高被分配的客户端越多,weight 和访问比率成正比,用于后端服务器性能不均的情况。
upstream server_pool {
server 192.168.42.21 weight=10;
server 192.168.42.22 weight=10;
}
ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
upstream server_pool {
ip_hash;
server 192.168.42.21:80;
server 192.168.42.22:80;
}
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool {
server 192.168.42.21:80;
server 192.168.42.22:80;
fair;
}
高可用集群
概述
如果Nginx挂掉了,那么服务肯定就没有了,有没有一种解决方案,可以保证Nginx挂掉了,服务也可以照常使用,答案肯定是有的,这就是高可用集群。采用的是一主一备的模式,当主节点Nginx挂掉,备份服务器Nginx立刻跟上,这样就保证了服务的高可用性。
实现效果
当主节点Nginx挂掉以后,服务依然可以正常使用。
准备工作
- 两台服务器;
- 每台服务器上均需安装nginx, keeepalived;
实现步骤
1.主节点安装keepalived
命令:
[root@localhost ~]# yum install -y keepalived
删除keepalived的配置文件
[root@localhost ~]# rm -f /etc/keepalived/keepalived.conf
新增keepalived的配置文件
[root@localhost ~]# vi /etc/keepalived/keepalived.conf
配置文件keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
#邮件服务器通知地址(暂不配置,默认即可)
smtp_server 192.168.200.1
#邮件服务器超时时间(暂不配置,默认即可)
smtp_connect_timeout 30
#当前虚拟机的IP地址
router_id 192.168.42.128
}
vrrp_script Monitor_Nginx {
script "/etc/keepalived/nginx_check.sh" #检测脚本执行的路径
interval 2 #检测脚本执行的间隔
weight 2 #检测脚本执行的权重
}
vrrp_instance VI_1 {
state MASTER #标识这个机器是MASTER还是BACKUP
interface ens33 #当前机器的网卡名称
virtual_router_id 51 #虚拟路由的编号,主备必须一致
priority 100 #主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #(VRRP Multicast广播周期秒数)
authentication {
auth_type PASS #(VRRP认证方式)
auth_pass 1111 #(密码)
}
track_script {
Monitor_Nginx #(调用nginx进程检测脚本)
}
virtual_ipaddress {
192.168.42.50 #虚拟IP地址
}
}
新增keepalived的检测脚本
[root@localhost ~]# vi /etc/keepalived/nginx_check.sh
#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process" | grep -v grep )" == "" ]
then
killall keepalived
fi
启动keepalived服务
[root@localhost ~]# systemctl start keeplaived.service
或
[root@localhost ~]# service keepalived start
2.从节点安装keepalived
与上面步骤类似,其中keepalived.conf有所改动
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
#邮件服务器通知地址(暂不配置,默认即可)
smtp_server 192.168.200.1
#邮件服务器超时时间(暂不配置,默认即可)
smtp_connect_timeout 30
#当前虚拟机的IP地址
router_id 192.168.42.129
}
vrrp_script Monitor_Nginx {
script "/etc/keepalived/nginx_check.sh" #检测脚本执行的路径
interval 2 #检测脚本执行的间隔
weight 2 #检测脚本执行的权重
}
vrrp_instance VI_1 {
state BACKUP #标识这个机器是MASTER还是BACKUP
interface ens33 #当前机器的网卡名称
virtual_router_id 51 #虚拟路由的编号,主备必须一致
priority 90 #备份机值小于主备机值
advert_int 1 #(VRRP Multicast广播周期秒数)
authentication {
auth_type PASS #(VRRP认证方式)
auth_pass 1111 #(密码)
}
track_script {
Monitor_Nginx #(调用nginx进程检测脚本)
}
virtual_ipaddress {
192.168.42.50 #虚拟IP地址
}
}
3.修改nginx的配置文件(主备一样)
upstream myserver {
server 192.168.42.128:8081;
server 192.168.42.128:8082;
}
server {
listen 80;
server_name 192.168.42.128;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
4.启动主服务器的tomcat1和tomcat2
测试:发现一主一从、虚拟IP都能正常的进行负载均衡,接下来测试主节点挂掉,从节点会不会自动顶上,打开主节点服务器,查看相关进程,杀死Nginx,然后打开浏览器,输入配置的虚拟IP地址:http://192.168.42.50/edu/a.html,发现负载均衡的效果还在,说明配置成功了