Nginx是一个高性能的web服务器和反向代理服务器,也可以作为邮件代理服务器。
Nginx特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求。
反向代理(Reverse Proxy) 方式是指以代理服务器来接受internet.的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet.上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;
正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户, 我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来然后返回给我。
比如你现在缺钱,想找马云爸爸去借钱,可想而知人家可能鸟都不鸟你,到最后碰一鼻子灰借不到钱。不过你认识你家隔壁老王,而老王认识马云同志,而且关系还很好。这时候你托老王去找马云借钱,当然这事最后成了,你从马云那里借到了500万!这时候马云并不知道钱是你借的,只知道这钱是老王借的。最后由老王把钱转交给你。在这里,老王就充当了一个重要的角色:代理。
此时的代理,就是我们常说的正向代理。代理客户端去请求服务器,隐藏了真实客户端,服务器并不知道真实的客户端是谁。
比如你现在很无聊,想找人聊天,这时候你拨通了联通客服10010电话,联通的总机可能随机给你分配一个闲置的客服给你接通 。这时候你如愿以偿的和客服聊了起来,问了问她目前有没有结婚、有没有对象、家住哪里、她的微信号、她的手机号。…。此时联通总机充当的角色就是反向代理,你只知道和客服接通并聊了起来,具体为什么会接通这个客服MM,怎么接通的,你并不知道。反向代理隐藏了真正的服务端,就像你每天使用百度的时候,只知道敲打www.baidu.com就可以打开百度搜索页面,但背后成千上万台百度服务器具体是哪一台为我们服务的,我们并不知道。我们只知道这个代理服务器,它会把我们的请求转发到真实为我们服务的那台服务器那里去。
综上所述:正向代理代理对象是客户端,反向代理代理对象是服务端。
一次性安装,执行如下命令:yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
切换到 /home/soft目录下,上传并覆盖文件 rz -y
,选中nginx压缩包上传
解压nginx文件: tar -zxvf /home/soft/nginx-1.18.0 -C /usr/local/
配置前缀,在nginx解压后的主目录下执行 : ./configure --prefix=/usr/local/nginx
执行命令进行编译:make
执行命令进行安装:make install
这时切换到/usr/local目录下,多了一个nginx
里面有conf(nginx的配置,其中主要学习nginx.conf)、html(两个静态页面)、logs(日志)、sbin(只有nginx,启动命令)
切到/usr/local/nginx/sbin目录下:cd /usr/local/nginx/sbin
执行启动命令:./nginx
启动成功后查看进程:
这个时候通过虚拟机ip访问,可以进入nginx欢迎界面
切换到/usr/local/nginx/sbin下执行命令:./nginx -c /usr/local/nginx/conf/nginx.conf
或者在任意位置用绝对路径: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
这里的 -c 表示指定配置文件。
找到nginx的进程号:ps -ef | grep nginx
执行命令: kill -QUIT 主pid
注意:
1、其中的pid 是主进程的pid(master process),其他为子进程(worker process)
2、这种关闭方式会处理完请求再关闭,所以称为优雅的关闭
找到nginx的进程号:ps -ef | grep nginx
执行命令: kill -TERM 主pid
注意:
1、其中的pid 是主进程的pid(master process),其他为子进程(worker process)
2、这种关闭方式不管请求是否处理完成,直接关闭,比较暴力,称之为快速关闭
如果关闭使用: kill -9 主pid ,那么子进程不会被关闭。
执行命令:./nginx -s reload
或者 /usr/local/nginx/sbin/nginx -s reload
常用在更新配置文件后,重启
当修改配置文件后,可以使用Nginx命令检查配置文件是否有语法错误。但无法检查逻辑错误
在启动命令的后面加上-t
也就是: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t
如果配置文件没有问题,再次输入 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
则正常启动
如果配置文件有错误,将配置文件下载到windows下进行修改,再上传到conf/下进行覆盖。
其中 sz 表示下载;rz 表示 上传;-y 表示覆盖(如果没有-y,上传的同名文件后面会加上括号1)
覆盖完成后 正常启动
Linux上查看Nginx版本 : /usr/local/nginx/sbin/nginx -v
-v(小写的v):显示nginx的版本
-V(大写的V):显示nginx的版本、编译器版本和配置参数
学习Nginx首先需要对它的核心配置文件有一定的认识,这个文件位于Nginx的安装目录/usr/local/nginx/conf目录下,名字为nginx.conf。
Nginx的核心配置文件主要由三个部分构成。
#配置worker进程运行用户,nobody也是一个linux用户,一般用于启动程序,没有密码
#user nobody;
#配置工作进程数目,根据硬件调整,通常等于CPU数量或2倍于CPU数量
worker_processes 1;
#配置全局错误日志及类型,[debug|indo|notice|warn|error|crit],默认是error
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; # 配置进程pid文件
#配置工作模式和连接数
events {
# 上限是65535
worker_connections 1024;#配置每个worker进程连接数上限,nginx支持的总连接数就等于worker_connections*worker_processes
}
#配置http服务器,利用它的反向代理功能提供负载均衡支持
http {
#配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型
include mime.types;
#默认文件类型 流类型,可以理解为支持任意类型
default_type application/octet-stream;
#配置日志格式
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#配置access.log日志及存放路径,并使用上面定义的main日志格式
#access_log logs/access.log main;
sendfile on; #开启高效文件传输模式
#tcp_nopush on; #防止网络阻塞
#keepalive_timeout 0;
keepalive_timeout 65; #长连接超时时间,单位是秒
#gzip on; #开启gzip压缩输出
#配置虚拟主机,可以有多个server,不同server的端口和名字不能全部重复
server {
listen 80; #配置监听端口
server_name localhost; #配置服务名
"nginx.conf" 117L, 2656C
推荐这篇:https://www.jianshu.com/p/a7c86efe1987
1、静态网站部署
2、负载均衡
3、静态代理
4、动静分离
5、虚拟主机
后面会详细说到。
在server的location中添加以下代码段。表示当请求路径为ip地址/ace
时,找到/opt/www
下的 /ace/login.html
。
执行指令/usr/local/nginx/sbin/nginx -s reload
在网站创立初期,我们一般都使用单台机器对外提供集中式服务。随着业务量的增大,我们一台服务器不够用,此时就会把多台机器组成一个集群对外提供服务,但是,我们网站对外提供的访问入口通常只有一个,比如 www.web.com。那么当用户在浏览器输入www.web.com进行访问的时候,如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡要做的事情。
负载均衡通常是指将请求"均匀"分摊到集群中多个服务器节点上执行,这里的均匀是指在一个比较大的统计范围内是基本均匀的,并不是完全均匀。
比如 F5、深信服、Array 等
优点是有厂商专业的技术服务团队提供支持,性能稳定
缺点是费用昂贵,对于规模较小的网络应用成本太高
比如 Nginx、LVS、HAProxy 等
优点是免费开源,成本低廉
首先在虚拟上开启两个tomcat
注意:tomcat的端口号不能冲突
在tomcat/conf/server.xml
中将端口号改为不冲突的端口号
tomcat-01:server port=8005 connector port=8085
tomcat-02:server port=8006 connector port=8086
另外,在nginx/conf/nginx.conf
中做修改
启动nginx
执行指令 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
启动tomcat
执行指令 /usr/local/tomcat-01/bin/startup.sh
以及 /usr/local/tomcat-02/bin/startup.sh
查看进程,确认nginx以及tomcat启动
最后,在浏览器输入192.168.xxx.xxx/myweb
刷新页面,会在两个tomcat中进行切换。
注意:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。如果后端服务器down掉,将自动剔除
upstream backserver {
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况
upstream backserver {
server 192.168.0.14 weight=5;
server 192.168.0.15 weight=2;
}
修改nginx.conf
,加上权重
重启nginx:/usr/local/nginx/sbin/nginx -s reload
浏览器访问 查看结果
ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题
算法:hash("124.207.55.82") % 2 = 0, 1
upstream backserver {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
重启nginx:/usr/local/nginx/sbin/nginx -s reload
浏览器访问 查看结果
注意:用户的ip地址不同,hash值也不同。但取模之后会出现hash碰撞,所以在运气不好的情况下,有可能大量的ip取模后都访问了同一个tomcat,导致服务器崩溃。
web请求会被转发到连接数最少的服务器上
upstream backserver {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
配置1:
upstream backserver {
server 127.0.0.1:9100;
#其它所有的非backup机器down的时候,才请求backup机器
server 127.0.0.1:9200 backup;
}
只要在希望成为后备的服务器ip后面多添加一个backup参数,这台服务器就会成为备份服务器。
在平时不使用,nginx不会给它转发任何请求。只有当其他节点全部无法连接的时候,nginx才会启用这个节点。
一旦有可用的节点恢复服务,该节点则不再使用,又进入后备状态。
可以两台机子互为热备,平时各自负责各自的服务。在做上线更新的时候,关闭一台服务器的tomcat后,nginx自动把流量切换到另外一台服务的后备机子上,从而实现无痛更新,保持服务的持续性,提高服务的可靠性。
一般操作是先将备份服务器更新,再关闭一半的正常服务器,将其更新重启,此时有了新的服务器,nginx不会给备份服务器发请求了。此时再关闭另一半服务器,更新重启,回到所有服务器工作的状态。
配置2:
upstream backserver {
server 127.0.0.1:9100;
#down表示当前的server是down状态,不参与负载均衡
server 127.0.0.1:9200 down;
}
一般在项目上线的时候,可以分配部署不同的服务器上,然后对Nginx重新reload。
reload不会影响用户的访问,或者可以给一个提示页面,系统正在升级…
把所有静态资源的访问改为访问nginx,而不是访问tomcat,这种方式叫静态代理。因为nginx更擅长于静态资源的处理,性能更好,效率更高。
所以在实际应用中,我们将静态资源比如图片、css、html、js等交给nginx处理,而不是由tomcat处理。
例如:当访问静态资源,则从linux服务器/opt/static目录下获取(举例)
location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
root /opt/static;
}
说明
~ 表示正则匹配,也就是说后面的内容可以是正则表达式匹配
第一个点 . 表示任意字符
*表示一个或多个字符
. 是转移字符,是后面这个点的转移字符
| 表示或者
$ 表示结尾
整个配置表示以 .后面括号里面的这些后缀结尾的文件都由nginx处理
放置静态资源的目录,要注意一下目录权限问题,如果权限不足,给目录赋予权限;
否则会出现403错误 chmod 755
例如:当访问静态资源,则从linux服务器/opt/static目录下获取(举例)
location ~ .*/(css|js|img|images) {
root /opt/static;
}
xxx/css
xxx/js
xxx/img
xxx/images
我们将静态资源放入 /opt/static 目录下,然后用户访问时由nginx返回这些静态资源
将图片放在/opt/static/myweb/image
下。访问路径的替换:192.168.xxx.xxx/myweb--------/opt/static/myweb
重启nginx:/usr/local/nginx/sbin/nginx -s reload
浏览器访问,静态资源是可以查看到的。
Nginx的负载均衡和静态代理结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景。
动态资源,如jsp由tomcat或其他web服务器完成
静态资源,如图片、css、js等由nginx服务器完成
它们各司其职,专注于做自己擅长的事情
动静分离充分利用了它们各自的优势,从而达到更高效合理的架构
整个架构中,一个nginx负责负载均衡,两个nginx负责静态代理。Nginx在一台Linux上安装一份,可以启动多个Nginx,每个Nginx的配置文件不一样即可
1、拷贝两份nginx配置文件(静态代理)
2、修改新拷贝的nginx81.conf和nginx82.conf配置文件
>Nginx81.conf端口号,因为这两个机器只需要做静态代理,所以删除掉负载均衡的配置
>Nginx82.conf端口号,因为这两个机器只需要做静态代理,所以删除掉负载均衡的配置
>静态代理的配置
3、负载均衡Nginx配置(nginx.conf)
M、动态资源的负载均衡
upstream www.myweb.com {
server 127.0.0.1:9100 weight=5;
server 127.0.0.1:9200 weight=2;
}
location /myweb {
proxy_pass http://www.myweb.com;
}
N、静态资源的负载均衡
upstream static.myweb.com {
server 127.0.0.1:81 weight=1;
server 127.0.0.1:82 weight=1;
}
location ~ .*/(css|js|img|images) {
proxy_pass http://static.myweb.com;
}
4、启动三台nginx服务器,启动两台tomcat服务器
5、浏览器输入http://192.168.xxx.xxx/myweb/
进行测试
基于端口的虚拟主机配置,使用端口来区分
浏览器使用 同一个域名+端口 或 同一个ip地址+端口访问;
server {
listen 8080;
server_name www.myweb.com;
location /myweb {
proxy_pass http://www.myweb.com;
}
}
server {
listen 9090;
server_name www.myweb.com;
location /p2p {
proxy_pass http://www.p2p.com;
}
}
基于域名的虚拟主机是最常见的一种虚拟主机
server {
listen 80;
server_name www.myweb.com;
location /myweb {
proxy_pass http://www. myweb.com;
}
}
server {
listen 80;
server_name www.p2p.com;
location /myweb {
proxy_pass http://www.p2p.com;
}
}
需要修改一下本地的hosts文件,文件位置:C:\Windows\System32\drivers\etc\hosts
在hosts文件配置:
192.168.xxx.xxx www.myweb.com
192.168.xxx.xxx www.p2p.com
前面是Linux的IP,后面是你自定义的域名
1、配置3个Tomcat,每个Tomcat一个站点项目(端口号不能冲突)
将war包放在/usr/local/tomcat-01/webapps/ROOT
目录下。解压 unzip beijing.war
. 防止上下文目录出现。
2、在nginx.conf文件添加三个server节点,用于配置三个虚拟主机
3、nginx.conf中配置每个虚拟主机请求转发所对应的后端服务器(负载均衡,可以配置多个服务器)
4、修改host文件。路径:C:\Windows\System32\drivers\etc\hosts
添加以下内容,将域名与ip地址绑定。
5、重启nginx:/usr/local/nginx/sbin/nginx -s reload
,
测试http://beijing.myweb.com;http://tianjin.myweb.com;http://nanjing.myweb.com
。