Nginx搭建与应用

主要内容:

1)为什么要使用Nginx?
2)什么是Nginx?
3)Nginx能做什么?
4)Nginx安装
5)配置文件简单介绍
6)Nginx配置与使用
7)跨域问题解决思路
8)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搭建与应用_第1张图片
image.png

如上图所示,我委托小明去快递站B帮我取一件快递,取件号6-4-3001,小明到快递站获取快递,交给我。在这个过程中,小明是根据我告诉他的信息知道应该去快递站B,告诉快递站取件号是6-4-3001,然后获取快递。在这个过程中,小明是我的代理人,代替我去取快递。这个过程中小明起的作用就是正向代理。
我们是根据小明的手机号联系的小明,不是通过快递站联系的小明。小明与快递站没有关系,他可能去顺丰的快递站,也会帮忙取外卖,也可以帮忙买火车票。快递,外卖,火车票都与小明没有关系,小明只是根据客户要求取指定的东西。

正向代理的应用场景

1)在限制访问外网应用的内网设置一台代理来访问外网某个应用,根据规则限制内网访问的网站
2)两个局域网之间的通信
3)开放一个公司内网的机器到公网做代理,员工通过这台机器访问公司内网

2.反向代理

Nginx根据接收到的请求的端口,域名,url,将请求转发给不同的机器,不同的端口(或者直接返回结果),然后将返回的数据返回给客户端
1)Nginx没有自己的地址,它的地址就是服务器的地址,如www.baidu.com,对外部来讲,它就是数据的生产者
2)Nginx明确的知道应该去哪个服务器获取数据(在未接收到请求之前,已经确定应该连接哪台服务器)
举个例子:

Nginx搭建与应用_第2张图片
image.png

如上图所示,我要查询我的快递在不在快递站,打快递站电话(对外公开的域名),首先由前台小明接受我的请求,然后小明根据我的请求,把查询的任务分配给公司内具体的某人,查询出结果返回给小明,小明再告诉我。在这个过程中,小明把我的请求交给谁,具体谁处理,我是不知道的。而且小明只会处理查询之类与快递公司有关的业务。我只知道快递公司对外的联系电话,不知道公司内有小花、小兰这些员工,他们对我来说是透明的,我只与快递公司的代表小明打交道。
我是根据快递公司电话(域名)联系到小明的,小明对我来说不具有自己的联系方式。对我来说,小明就是数据的生产方,具体小明的数据是从哪获取的,我并不关心。

反向代理的应用场景

1)多个项目要用相同域名对外提供服务
2)负载均衡(与反向代理同时配置)
3)非法请求过滤

3.负载均衡

Nginx根据反向代理规则匹配之后,再根据负载均衡配置的规则,将请求分配给不同的服务器(这些服务器提供的服务都是相同的)

Nginx搭建与应用_第3张图片
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搭建与应用_第4张图片

说明:
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搭建与应用_第5张图片
image.png

修改配置文件,server—location内容

location / {
           # root   html;
           # index  index.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搭建与应用_第6张图片
image.png

我们如果关闭了Nginx的正向代理服务,再次发起请求,就会是404


Nginx搭建与应用_第7张图片
image.png

2.反向代理

修改配置文件,将监听端口对应的链接配置为代理链接即可

#跳转至nginx安装路径下conf文件夹
cd /usr/local/nginx/conf
#修改nginx.conf文件
vim nginx.conf

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


Nginx搭建与应用_第8张图片
image.png

重启nginx后,在浏览器输入nginx的IP:端口,即可访问代理链接。
至此,就是一个反向代理配置的过程。

3.负载均衡

负载均衡其实是基于反向代理的,就是配置多个地址之后,实现访问请求不同的地址。那么当发起请求时,Nginx访问哪个请求是可以有规则设置的。也就是负载均衡的几种模式。

1)轮询

负载均衡默认的模式就是轮询模式。所有请求都会按照时间顺序分配到不同的服务上,如果服务Down掉,可以自动剔除。
我们配置两个不同的服务来观察一下效果


Nginx搭建与应用_第9张图片
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 {
        listen       8111;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
           # root   html;
           # index  index.html index.htm;
           # proxy_pass http://192.168.2.187:8134;
           proxy_pass http://test-server/hello.html;
           proxy_redirect default;
        }

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


image.png

Nginx搭建与应用_第10张图片
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

image.png

2.停止nginx服务:输入命令 service nginx stop 或者用kill将进程杀掉

image.png

3.查找Nginx的相关文件

a.查找Nginx安装目录 whereis nginx


image.png

b.查询相关文件 find / -name nginx


Nginx搭建与应用_第11张图片
image.png

4.删除Nginx相关文件(一定注意复制查找到的文件地址,不要轻易使用rm -rf指令)

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

你可能感兴趣的:(Nginx搭建与应用)