Nginx搭建与应用

主要内容: 1)为什么要使用Nginx?
2)什么是Nginx?
3)Nginx能做什么?
4)Nginx安装
5)配置文件简单介绍
6)Nginx配置与使用
7)跨域问题解决思路
8)Nginx的卸载
一.为什么要使用Nginx? 【Nginx搭建与应用】大家都知道,发布一个项目,可以直接发布在tomcat中,客户端输入发布地址,就可以访问我们所发布的服务。那既然如此,我们为什么还要搭建Nginx呢?
举一个最简单的例子:
如果我们的用户数很少,并发量也很小,那我们直接用一个tomcat发布服务,是没有问题的。
那如果用户体量和并发量都很大呢?只用一台服务器很难满足我们的需求。那我们就应该采用负载均衡,在多台服务器部署tomcat,客户端发起的请求,可以分配到各个服务器,将每台服务器的压力减小。
但如果只采用tomcat这种形式的话,存在一个问题。如果客户端上传文件时,发起的请求是在tomcat1,文件就上传到了tomcat1中,这样的话,在tomcat2中访问这个文件就不存在了。这个时候,我们理所当然的想到要建一个文件服务器。
文件服务器上就需要安装一个http服务器了,可以使用tomcat、apache、Nginx。
那我们为什么选择Nginx呢?tomcat一般来讲还是当成应用容器来用,主要用来跑我们的应用服务。Nginx主要是用做静态内容服务和代理服务器,直面外来请求转发给后面的应用服务。apache和Nginx功能重合较多,只不过现在用Nginx相对较多一些,但apache也有像zookeeper之类的也在使用,我们就不再赘述。
当然,tomcat并不是只能用于跑应用服务,Nginx也并不是只能做代理服务器。很详细的区别也不再具体讲解。
二.什么是Nginx? 通过上述的例子,我们也能够知道,Nginx其实就是http服务器和反向代理服务器。
百度百科:Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上Nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用Nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
三.Nginx能做什么? 1.正向代理
Nginx根据接收到的参数,判断出应该到哪个地址,发送什么数据,然后根据这些获取数据,获取后返回给客户端
1)Nginx根据传入参数确定去哪个地址获取数据,而不是根据url地址(在未接收到请求之前,不知道会去连接哪台服务器)
2)Nginx拥有自己的地址,但是这个地址不是数据来源
举个例子:

Nginx搭建与应用
文章图片
image.png
如上图所示,我委托小明去快递站B帮我取一件快递,取件号6-4-3001,小明到快递站获取快递,交给我。在这个过程中,小明是根据我告诉他的信息知道应该去快递站B,告诉快递站取件号是6-4-3001,然后获取快递。在这个过程中,小明是我的代理人,代替我去取快递。这个过程中小明起的作用就是正向代理。
我们是根据小明的手机号联系的小明,不是通过快递站联系的小明。小明与快递站没有关系,他可能去顺丰的快递站,也会帮忙取外卖,也可以帮忙买火车票。快递,外卖,火车票都与小明没有关系,小明只是根据客户要求取指定的东西。
正向代理的应用场景 1)在限制访问外网应用的内网设置一台代理来访问外网某个应用,根据规则限制内网访问的网站
2)两个局域网之间的通信
3)开放一个公司内网的机器到公网做代理,员工通过这台机器访问公司内网
2.反向代理
Nginx根据接收到的请求的端口,域名,url,将请求转发给不同的机器,不同的端口(或者直接返回结果),然后将返回的数据返回给客户端
1)Nginx没有自己的地址,它的地址就是服务器的地址,如www.baidu.com,对外部来讲,它就是数据的生产者
2)Nginx明确的知道应该去哪个服务器获取数据(在未接收到请求之前,已经确定应该连接哪台服务器)
举个例子:

Nginx搭建与应用
文章图片
image.png
如上图所示,我要查询我的快递在不在快递站,打快递站电话(对外公开的域名),首先由前台小明接受我的请求,然后小明根据我的请求,把查询的任务分配给公司内具体的某人,查询出结果返回给小明,小明再告诉我。在这个过程中,小明把我的请求交给谁,具体谁处理,我是不知道的。而且小明只会处理查询之类与快递公司有关的业务。我只知道快递公司对外的联系电话,不知道公司内有小花、小兰这些员工,他们对我来说是透明的,我只与快递公司的代表小明打交道。
我是根据快递公司电话(域名)联系到小明的,小明对我来说不具有自己的联系方式。对我来说,小明就是数据的生产方,具体小明的数据是从哪获取的,我并不关心。
反向代理的应用场景 1)多个项目要用相同域名对外提供服务
2)负载均衡(与反向代理同时配置)
3)非法请求过滤
3.负载均衡
Nginx根据反向代理规则匹配之后,再根据负载均衡配置的规则,将请求分配给不同的服务器(这些服务器提供的服务都是相同的)

Nginx搭建与应用
文章图片
image.png
公司有好多员工,可以提供各种不同的服务,C,D,F,G都可以帮忙查询快递有没有在公司,H只负责发件
客户A来公司发件,小明会将快递交给H,客户B来公司询问快递在不在,那么可以选择CDFG,这样就可以有多个人来处理这种事情,达到加快速度的目的。
负载均衡的应用场景 业务量增长,单台服务器压力过大,不足以支撑业务,需要多台服务器同时工作分担压力。
四.Nginx安装 1.Windows
下载安装包,根据提示安装即可。
2.Linux
在有外网的服务器上进行安装,可采用yum方式直接安装:

#执行如下命令进行yum安装nginx yum install nginx # 查看nginx版本 nginx -v # 查看编译参数 nginx -V #查看安装目录 rpm -ql nginx #查看配置文件 /etc/logrotate.d/nginx

若电脑无外网,则可下载安装包后传输至服务器中:
#跳转要安装的目录 cd /usr/local/ #下载安装包(若无外网,则直接将已下载的包拷贝到该地址下) wget https://nginx.org/download/nginx-1.9.9.tar.gz #解压安装包 tar -zxvf nginx-1.9.9.tar.gz #跳转至解压文件路径 cd nginx-1.9.9 #配置安装路径 ./configure --prefix=/usr/local/nginx #编译并安装 make && make install #进入nginx安装bin路径 cd ../nginx/sbin #运行nginx ./nginx #查询nginx是否启动 ps -ef|grep nginx

启动成功后,可在浏览器中输入服务器IP地址:端口号访问,显示如下图:

Nginx搭建与应用
文章图片

说明:
1)配置nginx服务,配置完成后可通过命令直接启动
a.创建文件
vim /etc/init.d/nginx

b.将如下内容复制到文件中
其中需要修改两个配置:
nginx="/usr/local/nginx/sbin/nginx" 修改成nginx执行程序的路径
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" 修改成nginx.conf文件的路径
#!/bin/sh # nginx - this script starts and stops the nginx daemin # # chkconfig:- 85 15 # description:Nginx is an HTTP(S) server, HTTP(S) reverse \ #proxy and IMAP/POP3 proxy server # processname: nginx # config:/usr/local/nginx/conf/nginx.conf # pidfile:/usr/local/nginx/logs/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/local/nginx/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" lockfile=/var/lock/subsys/nginx start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { configtest || return $? stop start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ; ; stop) rh_status_q || exit 0 $1 ; ; restart|configtest) $1 ; ; reload) rh_status_q || exit 7 $1 ; ; force-reload) force_reload ; ; status) rh_status ; ; condrestart|try-restart) rh_status_q || exit 0 ; ; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac

c.保存后设置文件的执行权限
chmod a+x /etc/init.d/nginx

d.完成以上配置后,就可以通过如下命令启动和停止
cd /etc/init.d nginx start nginx stop

e.将nginx服务加入chkconfig管理列表
chkconfig --add /etc/init.d/nginx

f.设置完成后,可直接通过service命令进行启动
service nginx start service nginx stop service nginx restart

2)修改nginx监听端口
#跳转nginx安装目录,进入conf目录 cd /usr/local/nginx/conf #编辑nginx.conf文件 vim nginx.conf #修改配置文件中server-listen端口,比如修改成8111,保存后重启端口即变为8111

3)若服务器开启了防火墙,需要放开端口
#放开80端口(端口号根据实际配置修改) firewall-cmd --add-port=80/tcp --permanent #重启防火墙 systemctl restart firewalld

五.配置文件简单介绍 https://www.jianshu.com/p/1593954d5faf
六.Nginx配置与使用 1.正向代理
首先,我们现在服务器上发起一个请求,看一下请求相关信息

Nginx搭建与应用
文章图片
image.png
修改配置文件,server—location内容
location / { # roothtml; # indexindex.html index.htm; # proxy_pass http://192.168.2.187:8134; #配置正向代理参数,其中proxy_set_header 部分的配置,是为了解决如果 URL 中带 "."(点)后 Nginx 503 错误 #proxy_pass配置,不同版本配置可能有所不同,若遇到404问题,则两个配置进行一下切换 #proxy_pass $scheme://$host$request_uri; proxy_pass $scheme://$http_host$request_uri; proxy_set_header Host $http_host; #配置缓存大小,关闭磁盘缓存读写减少I/O,以及代理连接超时时间 proxy_buffers 256 4k; proxy_max_temp_file_size 0; proxy_connect_timeout 30; #配置代理服务器 Http 状态缓存时间 proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m; }

配置完成后,重启Nginx,我们可以尝试在服务器上通过nginx发起请求,观察一下发起请求的头地址
命令:curl --proxy nginx的IP:port 访问链接地址 -I
如下图,发起请求的就是nginx啦

Nginx搭建与应用
文章图片
image.png
我们如果关闭了Nginx的正向代理服务,再次发起请求,就会是404

Nginx搭建与应用
文章图片
image.png 2.反向代理
修改配置文件,将监听端口对应的链接配置为代理链接即可
#跳转至nginx安装路径下conf文件夹 cd /usr/local/nginx/conf #修改nginx.conf文件 vim nginx.conf

修改内容如下:将location原有的root、index等注释掉,增加proxy_pass配置,配置为代理链接

Nginx搭建与应用
文章图片
image.png
重启nginx后,在浏览器输入nginx的IP:端口,即可访问代理链接。
至此,就是一个反向代理配置的过程。
3.负载均衡
负载均衡其实是基于反向代理的,就是配置多个地址之后,实现访问请求不同的地址。那么当发起请求时,Nginx访问哪个请求是可以有规则设置的。也就是负载均衡的几种模式。
1)轮询 负载均衡默认的模式就是轮询模式。所有请求都会按照时间顺序分配到不同的服务上,如果服务Down掉,可以自动剔除。
我们配置两个不同的服务来观察一下效果

Nginx搭建与应用
文章图片
image.png
#http中增加如下upstream(负载均衡服务器设置)配置 upstream test-server { server 192.168.2.158:8222; server 192.168.2.158:8233; } #修改server配置内容:在location中增加proxy_pass 配置为http://test-server/hello.html 其中test-server即为刚刚增加的服务配置项;增加proxy_redirect配置为default server { listen8111; server_namelocalhost; #charset koi8-r; #access_loglogs/host.access.logmain; location / { # roothtml; # indexindex.html index.htm; # proxy_pass http://192.168.2.187:8134; proxy_pass http://test-server/hello.html; proxy_redirect default; }

配置完成后,重启nginx,即可观察效果。

Nginx搭建与应用
文章图片
image.png
Nginx搭建与应用
文章图片
image.png
如上图所示,访问链接时,会按顺序从第一个服务到第二个服务执行。
当然,我们也可以配置多个服务,并非只能配置两个服务。
2)权重 指定每个服务的权重比例,weight和访问比率成正比,通常用于后端服务机器性能不统一,将性能好的分配权重高来发挥服务器最大性能,如下配置后8233服务的访问比率会是8222服务的二倍。
#http中增加如下配置,其中增加weight配置项,代表权重比例值 upstream test-server { server 192.168.2.158:8222 weight=1; server 192.168.2.158:8233 weight=2; }

这时候,我们再去访问,会发现一次请求显示Welcome-One,两次请求显示Welcome-Two的规律。
3)iphash 每个请求都根据访问ip的hash结果分配,经过这样的处理,每个访客固定访问一个后端服务,如下配置(ip_hash可以和weight配合使用)。
#http中增加如下配置,其中增加ip_hash,也可以增加weight配置项,代表权重比例值 upstream test-server { ip_hash; server 192.168.2.158:8222 weight=1; server 192.168.2.158:8233 weight=2; }

现在我们再尝试访问,第一次发起请求时,显示的内容,不论如何刷新,都还是这个内容。那如果我们换一个IP去访问,则也会固定显示某一个后端服务的页面。
4)最少连接 将请求分配到连接数最少的服务上。
#http中增加如下配置,其中增加least_conn,也可以增加weight配置项,代表权重比例值 upstream test-server { least_conn; server 192.168.2.158:8222 weight=1; server 192.168.2.158:8233 weight=2; }

5)fair 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
#http中增加如下配置,其中增加fair,也可以增加weight配置项,代表权重比例值 upstream test-server { server 192.168.2.158:8222 weight=1; server 192.168.2.158:8233 weight=2; fair; }

七.跨域问题解决思路 什么是跨域问题呢?浏览器有同源策略,浏览器基于安全限制,是不能在网站中执行其他网站的脚本的。那我们如果在应用中的确需要访问其他网站内容时,就会出现跨域问题。
一般跨域问题是可以通过设置请求头的方式解决。但我们主要讲一下通过Nginx如何解决。
跨域问题,其实解决的思路就是,只要让浏览器认为是在同一个域中的请求就可以了。Nginx就能很好的解决这个问题。
比如说,我在项目http://192.168.2.158:8222/想访问http://jianshu.com/这个域名的某个接口,直接访问就会报跨域错误。我们在Nginx中可以增加一些配置:
server { listen 8111; server_name localhost; location / { proxy_pass http://192.168.2.158:8222/; }location /apis/ { proxy_pass http://jianshu.com/; } }

在location中增加proxy_pass,为项目地址,当访问nginx端口,即localhost:8111时,会匹配'/'后代理到http://192.168.2.158:8222/地址,但浏览器显示的路径还是localhost:8111。当请求http://jianshu.com/下的接口时,可以通过localhost:8111/apis/这个地址去请求,Nginx匹配到'/apis/时,会代理到http://jianshu.com/这个接口下。这种情况,在浏览器看来是同域请求,自然也就不会报跨域错误了。
八.Nginx卸载 1.查看nginx是否正在运行 ps -ef|grep nginx
Nginx搭建与应用
文章图片
image.png 2.停止nginx服务:输入命令 service nginx stop 或者用kill将进程杀掉
Nginx搭建与应用
文章图片
image.png 3.查找Nginx的相关文件
a.查找Nginx安装目录 whereis nginx

Nginx搭建与应用
文章图片
image.png
b.查询相关文件 find / -name nginx

Nginx搭建与应用
文章图片
image.png 4.删除Nginx相关文件(一定注意复制查找到的文件地址,不要轻易使用rm -rf指令)
Nginx搭建与应用
文章图片
image.png 参考资料(转载链接)
1.为什么要用Nginx?
https://blog.csdn.net/zhishiqi15836010823/article/details/100569635
2.Nginx的搭建
https://www.cnblogs.com/xxoome/p/5866475.html
https://www.cnblogs.com/xxoome/p/7256214.html
3.Nginx设置服务启动模式
https://www.cnblogs.com/gimin/p/8893559.html
4.Nginx中文文档
https://www.nginx.cn/doc/index.html
5.负载均衡实现
https://www.jianshu.com/p/4c250c1cd6cd
6.Nginx配置文件详解
https://www.jianshu.com/p/1593954d5faf

    推荐阅读