一般公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户。
但是慢慢的,使用我们平台的用户越来越多了,并发量慢慢增大了,这时候一台服务器满足不了我们的需求了。
于是我们横向扩展,又增加了服务器。这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个proxy服务器了,通过proxy服务器来帮我们转发和处理请求。
我们希望这个proxy服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上。
这个过程用户是无感知的,用户并不知道是哪个服务器返回的结果,我们还希望他可以按照服务器的性能提供不同的权重选择。保证最佳体验!所以我们使用了Nginx。
Nginx (engine x)是一个高性能的HTTP和反向proxyweb服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx1.0.4发布。
除了反向proxy,nginx还支持正向proxy、负载均衡以及基于SSL安全证书的HTTPS访问等功能特性.
其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。
Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。
HTTP正向proxy,反向proxy:作为web服务器最常用的功能之一,尤其是反向proxy。
proxy又分为正向proxy和反向proxy。
先看张图
举个例子
某同学喜欢面向搜索引擎编程,想通过 百度 搜索引擎查找一些学习资料,但是有些网站直接访问可能不太安全,会暴露自己的IP,同学比较苦恼,想着怎样才能使用百度 搜索自己想要的学习资料,又不会暴露自己的IP在网站上呢?
这时我告诉该同学,我呢手上刚好有一台proxy服务器,这台proxy服务器通过nginx配置了正向proxy转发http和https请求,你呢,只需要在自己的Windows本地电脑的网关配置一下这台proxy服务器的IP和端口号,就能正常通过proxy服务器访问到百度 并搜索相关的学习资料了,还不会暴露自己真实的IP。
同学非常兴奋,说自己了解过nginx,但是啥是正向proxy啊?
正向proxy,指的是通过proxy服务器 proxy浏览器/客户端去重定向请求访问到目标服务器 的一种proxy服务。 正向proxy服务的特点是proxy服务器proxy的对象是浏览器/客户端,也就是对于目标服务器 来说浏览器/客户端是隐藏的。
同学觉得有点意思,于是又问,那nginx如何实现正向proxy啊?
如何实现nginx正向proxy?
1.正向proxy转发https说明
在实现nginx正向proxy之前,先说明一下,现在的网站基本上都是https,因此要实现nginx正向proxy转发请求,除了要配置转发http80端口的请求,还有配置https443端口的请求~
正向proxy转发http请求很简单,不过正向proxy转发https请求稍微有一点麻烦,目前网上的教程大多都是如下这样配置的(不一定准确)。
一开始我也像上面那样配置,虽然http请求正常转发了,但是发现https并没有转成功,而是报错HTTP/1.1 400 Bad Request
后来才了解到,nginx官方并不支持直接转发https请求,但是阿里的一个大佬对nginx拓展了一个ngx_http_proxy_connect_module模块,并且在github上开源了
https://github.com/chobits/ngx_http_proxy_connect_module
不过维护的ngx_http_proxy_connect_module模块的补丁也是有nginx版本限制的(目前维护了1.4.x~1.19.x版本),如README.md说明
如果你安装的nginx版本不在1.4.x~1.19.x这个范围内,那无法支持正向proxy转发https请求。
2.安装nginx
安装步骤可以参考下面步骤
安装nginx通过install进行编译安装,编译后默认安装目录为/usr/local/nginx
后续配置新模块ngx_http_proxy_connect_module还需要重新install编译一次
3.下载新模块
GitHub上下载ngx_http_proxy_connect_module的zip压缩包源码:
https://github.com/chobits/ngx_http_proxy_connect_module
4. 解压新模块源码
将新模块ngx_http_proxy_connect_module源码压缩包上传到服务器/usr/nginx目录,并解压并重命名
$ mkdir -p /usr/nginx
$ cd /usr/nginx
$ /usr/nginx
$ unzip ngx_http_proxy_connect_module-master.zip
$ mv ngx_http_proxy_connect_module-master ngx_http_proxy_connect_module
5.添加新模块到nginx
使用root用户进入nginx的资源目录/usr/nginx/nginx-1.18.0,给nginx添加新模块ngx_http_proxy_connect_module和并重新编译nginx
$ /usr/nginx/nginx-1.18.0
$ patch -p1 < /usr/nginx/ngx_http_proxy_connect_module/patch/proxy_connect.patch
$ ./configure --add-module=/usr/nginx/ngx_http_proxy_connect_module
$ make && make install
说明:
这里nginx-1.18.0版本对应proxy_connect.patch补丁,其他版本相关补丁支持版本,详情见GitHub~ https://github.com/chobits/ngx_http_proxy_connect_module
使用root用户安装和编译新模块完成后,如果你希望后续不使用root用户运维,可以授权安装目录/usr/local/nginx给nginx用户或者其他普通用户
chown -R nginx:nginx /usr/local/nginx
chown root:root /usr/local/nginx/sbin/nginx
chmod +s /usr/local/nginx/sbin/nginx
说明:
二进制/usr/local/nginx/sbin/nginx文件需要重新归属为root用户,并且权限位添加s权限(权限位+s的二进制文件属于是管道文件,也就是普通用户也可执行该二进制文件,执行后产生的进程属于该文件的权限所有者,这里文件所有者是root)
6.修改nginx的配置
修改nginx的配置分别添加http和https的server,其他配置保持不变~
vi /usr/local/nginx/conf/nginx.conf
这两个server主要配置是对DNS解析和proxy_passproxy进行:
#正向proxy转发http请求
server {
#指定DNS服务器IP地址
resolver 114.114.114.114;
#监听80端口,http默认端口80
listen 80;
#服务器IP或域名
server_name localhost;
#正向proxy转发http请求
location / {
proxy_pass http://$host$request_uri;
proxy_set_header HOST $host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_next_upstream error timeout invalid_header http_502;
}
}
#正向proxy转发https请求
server {
#指定DNS服务器IP地址
resolver 114.114.114.114;
#监听443端口,https默认端口443
listen 443;
#正向proxy转发https请求
proxy_connect;
proxy_connect_allow 443 563;
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
location / {
proxy_pass http://$host;
proxy_set_header Host $host;
}
}
DNS说明:
(国内外)目前比较主流的DNS:
(国外)谷歌:8.8.8.8 developers.google.com
(国外)OpenDNS:208.67.222.222 signup.opendns.com
(国内)114:114.114.114.114 www.114dns.com
(国内)腾讯:119.29.29.29 www.dnspod.cn
(国内)阿里:223.5.5.5 alidns.com
(国内)百度:180.76.76.76 dudns.baidu.com
7.检查和刷新nginx配置
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
8.客户端访问(验证正向proxy)
客户端要proxy访问目标网站示例对象:
http://www.baidu.com 和https://www.baidu.com
客户端–Windows浏览器访问
首先在本地电脑的IE浏览器设置proxy服务器和端口:
IE->右上角 ->工具 ->Internet选项->连接->局域网(LAN)设置 ->配置proxyIP和端口
浏览器访问
http://www.baidu.com/ 和https://www.baidu.com/
实时查看nginx日志
tail -f /usr/local/nginx/logs/access.log
通过实时查看nginx的访问日志,可以看到Windows下设置proxyIP和端口后,本地电脑访问的所有网页会通过proxy服务器进行访问网页,实现了正向proxy的功能,并且隐藏了用户自己真实的IP
客户端–Linuxproxy访问
Linux下也可以验证proxy服务器是否能正常proxy转发http和https请求
curl http://www.baidu.com/ -v -x 127.0.0.1:80
curl https://www.baidu.com/ -v -x 127.0.0.1:443
nginx正向proxy转发https成功:
先来一张图了解下
相比于正向proxy,反向proxy的定义如下:
反向proxy,指的是浏览器/客户端并不知道自己要访问具体哪台目标服务器,只知道去访问proxy服务器 ,proxy服务器再通过反向proxy+负载均衡实现请求分发到应用服务器的一种proxy服务。 反向proxy服务的特点是proxy服务器 proxy的对象是应用服务器,也就是对于浏览器/客户端 来说应用服务器是隐藏的。
nginx实现反向proxy步骤如下
1.修改nginx配置
修改nginx配置vi /usr/local/nginx/conf/nginx.conf在http模块中配置如下:
nginx反向proxy都是结合负载均衡来实现的,这里先直接提供反向proxy+负载均衡的配置,负载均衡接着在后面介绍。
#反向proxy+负载均衡
upstream reverseProxyServer{
#负载均衡应用服务器A: 权重为10,10s内连接请求失败2次,nginx在10s内认为server是不可用的,将不在发送请求给这台服务器
server 应用服务器A的IP:8080 weight=10 max_fails=2 fail_timeout=10s;
#负载均衡应用服务器B: proxy服务器权重为5,10s内连接请求失败2次,nginx在10s内认为server是不可用的,将不在发送请求给这台服务器
server 应用服务器B的IP:8080 weight=5 fail_timeout=10s max_fails=2;
#负载均衡应用服务器C: proxy服务器权重为5,10s内连接请求失败2次,nginx在10s内认为server是不可用的,将不在发送请求给这台服务器
server 应用服务器C的IP:8080 weight=5 fail_timeout=10s max_fails=2;
}
server {
#监听80端口,http默认端口80
listen 80;
#服务器IP或域名
server_name localhost;
#反向proxy请求路径中含有/appname的所有请求到upstream定义的对应反向proxy模块
location /appname {
proxy_pass http://reverseProxyServer;
}
}
2.检查和刷新nginx配置
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
3.浏览器访问
proxy服务器部署了tomcat应用,访问tomcat静态页面验证一波
http://proxy服务器IP:8080/appname/ReverseProxy1.html
什么是负载均衡
再来看下前面介绍反向proxy的这张图
可以看到负载均衡(Load Balance)的主要作用是采用了负载均衡算法将请求分发到集群模式中的应用服务器上,这样即使某个后台应用服务器挂了,其他应用服务器还可以正常接收请求,实现了高可用,并且集群模式模式下的应用服务器支持纵向扩展,可以应对业务快速增长带来的高并发应用场景
负载均衡算法有哪些
负载均衡算法常用的有轮询、权重和ip_hash算法,默认是轮询算法
原理是每一个请求按时间顺序逐一被分发到不同的应用服务器,如果接收请求的应用服务器挂了,并且请求超过最大失败次数max_fails(1次),则在失效时间fail_timeout(10秒)内不会再转发请求到该节点
upstream defaultReverseProxyServer{
server 192.168.0.1:8080;
server 192.168.0.2:8080;
}
转发到每台服务器的权重相同
原理是每一个请求按权重被分发到不同的应用服务器,同样,如果接收请求的应用服务器挂了,并且请求超过最大失败次数max_fails(默认1次或可设置N次),则在失效时间fail_timeout(默认10秒,可设置N秒)内,不会再转发请求到该节点
upstream weightReverseProxyServer{
server 192.168.0.1:8080 weight=10 max_fails=2 fail_timeout=5s;
server 192.168.0.2:8080 weight=5 max_fails=2 fail_timeout=5s;
}
转发到每台服务器的权重不同
原理是每一个请求按用户访问IP的哈希结果分配,如果请求来自同一个用户IP则固定这台IP访问一台应用服务器,该算法可以有效解决动态网页中存在的session共享问题。
upstream ipHashReverseProxyServer{
ip_hash;
server 192.168.0.1:8080;
server 192.168.0.2:8080;
}
一般使用的是基于权重的算法,因为现在很多情况下都是集群部署,而且集群下的各个服务器资源大多都是不均匀的,资源高的则分配权重高一些,资源低的则分配权重低一些,这种情况使用基于权重的负载均衡算法,可以更高效的利用资源和提高并发处理能力.
在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。
让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。
目前,通过使用Nginx大大提高了我们网站的响应速度,优化了用户体验,让网站的健壮性更上一层楼!
1.下载nginx
http://nginx.org/en/download.html
建议下载稳定版本
以nginx/Windows-1.18.0为例,直接下载 nginx-1.18.0.zip。
下载后解压,解压后如下:
2、启动nginx
有很多种方法启动nginx
(1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过
(2)打开cmd命令窗口,切换到nginx解压目录下,输入命令 nginx.exe ,回车即可
3、检查nginx是否启动成功
直接在浏览器地址栏输入网址 http://localhost:80 回车,出现以下页面说明启动成功!
如果你输入地址没有成功,那可能是端口80被占用,可以接着看文章下面修改配置文件里面的默认监听端口号。
4、配置监听
nginx的配置文件是conf目录下的nginx.conf,默认配置的nginx监听的端口为80,如果80端口被占用可以修改为未被占用的端口即可。
我们将原本的80端口改成了8082端口,当我们修改了nginx的配置文件nginx.conf 时,不需要关闭nginx后重新启动nginx,只需要执行命令nginx -s reload即可让改动生效
5、关闭nginx
如果使用cmd命令窗口启动nginx, 关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx
(1)输入nginx命令nginx -s stop(快速停止nginx) 或nginx -s quit(完整有序的停止nginx)
(2)使用taskkilltaskkill /f /t /im nginx.exe
taskkill是用来终止进程的, /f是强制终止 . /t终止指定的进程和任何由此启动的子进程。 /im示指定的进程名称 .
1、安装gcc
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:
yum install gcc-c++
2、PCRE pcre-devel 安装
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:
yum install -y pcre pcre-devel
3、zlib 安装
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
yum install -y zlib zlib-devel
4、OpenSSL 安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
yum install -y openssl openssl-devel
5、下载安装包
手动下载.tar.gz安装包,https://nginx.org/en/download.html
下载完毕上传到服务器上 /root
6、解压
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
7、配置
使用默认配置,在nginx根目录下执行
./configure
make
make install
查找安装路径:whereis nginx
Nginx常用命令
cd /usr/local/nginx/sbin/
./nginx 启动
./nginx -s stop 停止
./nginx -s quit 安全退出
./nginx -s reload 重新加载配置文件
ps aux|grep nginx 查看nginx进程
启动成功访问 服务器ip:80
注意:如何连接不上,检查安全组是否开放端口,或者服务器防火墙是否开放端口!
相关命令:
# 开启
service firewalld start
# 重启
service firewalld restart
# 关闭
service firewalld stop
# 查看防火墙规则
firewall-cmd --list-all
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
# 参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为持久;
3、--add-port:标识添加的端口;
首先更新升级一下库
apt-get update
apt upgrade
安装gcc g++依赖库
sudo apt-get install build-essential
sudo apt-get install libtool
安装pcre依赖库
sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
安装zlib依赖库
sudo apt-get install zlib1g-dev
安装SSL依赖库
sudo apt-get install openssl
这里安了稳定版1.18.0版本Nginx进行安装
#下载安装包
wget http://nginx.org/download/nginx-1.18.0.tar.gz
#解压
tar -zxvf nginx-1.18.0.tar.gz
#进入解压目录
cd nginx-1.18.0
#配置
./configure --prefix=/usr/local/nginx
#编译并且安装:
make && make install
#进入sbin目录启动
cd /usr/local/nginx/sbin
./nginx
配置文件在conf/nginx.conf,按需修改即可。
启动,关闭,重启,命令:
#启动
./nginx
#关闭
./nginx -s stop
#重启
./nginx -s reload
查看进程或端口
netstat -anp|grep nginx
或
netstat -anp|grep 端口号
强制杀死进程
kill -9 进程号(pid)
启动成功访问 服务器ip:80
首先需要停止nginx的服务
sudo service nginx stop
删除Nginx的–purge包括配置文件
sudo apt-get --purge remove nginx
自动移除全部不使用的软件包
sudo apt-get autoremove
列出与nginx相关的软件 并删除显示的软件
dpkg --get-selections|grep nginx
libnginx-mod-http-geoip
libnginx-mod-http-image-filter
libnginx-mod-http-xslt-filter
libnginx-mod-mail
libnginx-mod-stream
nginx-common
sudo apt-get --purge remove libnginx-mod-http-geoip
sudo apt-get --purge remove libnginx-mod-http-image-filter
sudo apt-get --purge remove libnginx-mod-http-xslt-filter
sudo apt-get --purge remove libnginx-mod-mail
sudo apt-get --purge remove libnginx-mod-stream
sudo apt-get --purge remove nginx-common
再次执行
dpkg --get-selections|grep nginx
which nginx # 不在显示nginx
这样就可以完全卸载掉nginx包括配置文件