社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
Nginx 的代名词就是 “高负载均衡服务器”。
nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
其特点是占有内存少,并发能力强,能够支持高达 50000 个并发连接响应。这归功于它选择了epoll and kqueue 作为开发模型(socket数量不限制)(Apache采用的 select 开发模型)。它处理请求是异步非阻塞,在高并发下保持低资源低消耗高性能。非常稳定,bug 极少。Apache 使用处理每个连接都需要一个进程,其并发性能不是很好。而Nginx使用多路复用的技术,让一 个进程处理多个连接,所以并发性能比较好。
事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国使用 nginx 网站用户有:新浪、网易、腾讯、京东、淘宝等。
Nginx是一个高性能的HTTP和反向代理服务器
采用 C 语言编写
支持的操作系统众多,windows、linux、MacOS X
安全性高,外界只能访问nginx所在服务器,nginx将请求转发内部服务器。调用后,返回调用的结果
可实现负载均衡
Rewrite功能强大
电商、互联网架构大部分都采用Nginx+Tomcat的架构
(图片来源于 https://w3techs.com/)
根据 w3techs 公布的数据,Nginx 目前已经在 Web 服务器领域有了一定的地位。在排名前100万的网站中,主流服务器仍为Apache,也有很大一部分使用IIS。
这得益于 Nginx 使用了最新的 epoll(Linux 2.6内核)和 kqueue(freebsd)网络 I/O 模型,而 Apache 则使用的是传统的 select 模型。目前 Linux下能够承受高并发访问的 Squid、Memcached 都采用的是epoll网络I/O模型。
处理大量的连接的读写,Apache 所采用的 select 网络 I/O 模型非常低效。下面用一个比喻来解析 Apache 采用的 select 模型和 Nginx 采用的 epoll 模型进行之间的区别:
假设你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。select 版宿管大妈就会带着你的朋友挨个房间去找,直到找到你为止。而 epoll 版宿管大妈会先记下每位同学的房间号,你的朋友来时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满大楼找人。如果来了 10000 个人,都要找自己住这栋楼的同学时,selec t版和 epoll 版宿管大妈,谁的效率更高,不言自明。同理,在高并发服务器中,轮询 I/O 是最耗时间的操作之一,select 和 epoll 的性能谁的性能更高,同样十分明了。
尽量不使用双击 nginx.exe 来启动,因为可能会多次点击,启动多个,造成奇奇怪怪的问题。点击一次即可!
启动:
# 进入 nginx 安装目录
cd c:/softinstall/nginx-1.18.0
# 启动时,命令框会一闪而过
start nginx.exe
停止:
nginx.exe -s stop
重新加载:
nginx.exe -s reload
注意:Windows下有时停止无效,造成开启太多,手工结束进程。
通过前置机(也叫踏板机)将内网和外网隔离,用户只能访问前置机,其他的机器是无法直接访问内网中其他服务器资源,必须通过前置机中转,请求重定向才可以。这样保证了网络的安全。
先通过一个 nginx 进行转发到2个 nginx 上,然后再通过 nginx 进行负载到多个 tomcat 集群上。这样的结构优点是,防止单个节点压力过重。
当用户访问 http://localhost:80,nginx 将这个请求什么也不做,只负责转发到 tomcat 的访问地址 http://localhost:8080。
server {
listen 80;
server_name localhost;
location / { #拦截所有的资源
proxy_pass http://127.0.0.1:8080; #转向 tomcat 的地址
}
}
静态资源:图片、css、js、html(静态资源处理时并发非常高)
动态资源:asp/aspx、php、jsp
nginx默认配置:
location / {
#相对路径,配置了一个html目录,我们可以将网站所用到的所有的静态资源从war中移除,放到这个目录下。
root html;
#配置的欢迎页面
index index.html index.htm;
}
文件服务器: C:WindowsSystem32driversetchosts
server {
listen 80;
# 域名地址,修改hosts文件做一个配置 image.xinlanjian.com 127.0.0.1
server_name image.ifknow.com;
location / {
#图片文件所在目录,按日期来分目录:yyyy/mm/dd/uuid.jpg或者当前时间的毫秒数+随机值.jpg
root c:\serverfile;
}
}
默认配置,tomcat 有 n 个,请求就被平均分配到这 n 个服务器上,请求次数 % n,平均分配到每个服务器。
例如:有三个 tomcat!
修改三个端口,在同一台服务器上启动 3 个 tomcat。修改三个 tomcat webapps/ROOT/index.jsp
文件,分别加上简单区分的标识。当请求 nginx 时,通过这种方法验证得出默认 nginx 轮询这 3 个 tomcat 的 index.jsp 页面,但顺序不一定是配置的顺序。
第一处:更改运行 port 为其他未使用的端口
# 修改前
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
# 修改后
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
第二处:更改 port 为其他未使用的端口(一般在其前面加 1 / 2 )
# 修改前
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
# 修改后
<Connector port="18009" protocol="AJP/1.3" redirectPort="8443" />
第三处:更改 tomcat 关闭 port 为其他未使用的端口
# 修改前
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
# 修改后
<Server port="18005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
打开 webapps/ROOT/index.jsp
文件,找到 一下位置,添加 tomcat 8080 or tomcat 8081 or tomcat8082。
例如:${pageContext.servletContext.serverInfo} tomcat8080
。
然后重启三个 tomcat。
server.xml 配置
server {
listen 80;
server_name localhost;
# 拦截所有的资源
location / {
root html;
index index.html index.htm;
# 引用定义的 upstream
proxy_pass http://ifknow_tomcats;
}
}
upstream ifknow_tomcats {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
启动 nginx, 浏览器访问 http://localhost 。
轮询方式存在的问题:服务器有性能比较好的,有性能比较差的。新的服务器的配置比旧的服务器强悍很多。CPU核也多,内存也大,硬盘容量也大,速度还快。
如果还使用轮询的方式,就会造成新服务器资源的浪费,旧的服务器资源压力大。显然资源分配不合理,应该多劳多得。
server.xml 配置
server {
listen 80;
server_name localhost;
# 拦截所有的资源
location / {
root html;
index index.html index.htm;
# 引用定义的 upstream
proxy_pass http://ifknow_tomcats;
}
}
upstream ifknow_tomcats {
server 127.0.0.1:8080 weight=9; # 访问请求分为10份,这个 tomcat 负责 9 份链接
server 127.0.0.1:8081 weight=1; # 访问请求分为10份,这个 tomcat 负责 1 份链接
server 127.0.0.1:8082 down; # 这个 tomcat 暂时不参加负载
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!