主要内容:
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拥有自己的地址,但是这个地址不是数据来源
举个例子:
如上图所示,我委托小明去快递站B帮我取一件快递,取件号6-4-3001,小明到快递站获取快递,交给我。在这个过程中,小明是根据我告诉他的信息知道应该去快递站B,告诉快递站取件号是6-4-3001,然后获取快递。在这个过程中,小明是我的代理人,代替我去取快递。这个过程中小明起的作用就是正向代理。
我们是根据小明的手机号联系的小明,不是通过快递站联系的小明。小明与快递站没有关系,他可能去顺丰的快递站,也会帮忙取外卖,也可以帮忙买火车票。快递,外卖,火车票都与小明没有关系,小明只是根据客户要求取指定的东西。
正向代理的应用场景
1)在限制访问外网应用的内网设置一台代理来访问外网某个应用,根据规则限制内网访问的网站
2)两个局域网之间的通信
3)开放一个公司内网的机器到公网做代理,员工通过这台机器访问公司内网
2.反向代理
Nginx根据接收到的请求的端口,域名,url,将请求转发给不同的机器,不同的端口(或者直接返回结果),然后将返回的数据返回给客户端
1)Nginx没有自己的地址,它的地址就是服务器的地址,如www.baidu.com,对外部来讲,它就是数据的生产者
2)Nginx明确的知道应该去哪个服务器获取数据(在未接收到请求之前,已经确定应该连接哪台服务器)
举个例子:
如上图所示,我要查询我的快递在不在快递站,打快递站电话(对外公开的域名),首先由前台小明接受我的请求,然后小明根据我的请求,把查询的任务分配给公司内具体的某人,查询出结果返回给小明,小明再告诉我。在这个过程中,小明把我的请求交给谁,具体谁处理,我是不知道的。而且小明只会处理查询之类与快递公司有关的业务。我只知道快递公司对外的联系电话,不知道公司内有小花、小兰这些员工,他们对我来说是透明的,我只与快递公司的代表小明打交道。
我是根据快递公司电话(域名)联系到小明的,小明对我来说不具有自己的联系方式。对我来说,小明就是数据的生产方,具体小明的数据是从哪获取的,我并不关心。
反向代理的应用场景
1)多个项目要用相同域名对外提供服务
2)负载均衡(与反向代理同时配置)
3)非法请求过滤
3.负载均衡
Nginx根据反向代理规则匹配之后,再根据负载均衡配置的规则,将请求分配给不同的服务器(这些服务器提供的服务都是相同的)
公司有好多员工,可以提供各种不同的服务,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地址:端口号访问,显示如下图:
说明:
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.正向代理
首先,我们现在服务器上发起一个请求,看一下请求相关信息
修改配置文件,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的正向代理服务,再次发起请求,就会是404
2.反向代理
修改配置文件,将监听端口对应的链接配置为代理链接即可
#跳转至nginx安装路径下conf文件夹
cd /usr/local/nginx/conf
#修改nginx.conf文件
vim nginx.conf
修改内容如下:将location原有的root、index等注释掉,增加proxy_pass配置,配置为代理链接
重启nginx后,在浏览器输入nginx的IP:端口,即可访问代理链接。
至此,就是一个反向代理配置的过程。
3.负载均衡
负载均衡其实是基于反向代理的,就是配置多个地址之后,实现访问请求不同的地址。那么当发起请求时,Nginx访问哪个请求是可以有规则设置的。也就是负载均衡的几种模式。
1)轮询
负载均衡默认的模式就是轮询模式。所有请求都会按照时间顺序分配到不同的服务上,如果服务Down掉,可以自动剔除。
我们配置两个不同的服务来观察一下效果
#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,即可观察效果。
如上图所示,访问链接时,会按顺序从第一个服务到第二个服务执行。
当然,我们也可以配置多个服务,并非只能配置两个服务。
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
2.停止nginx服务:输入命令 service nginx stop 或者用kill将进程杀掉
3.查找Nginx的相关文件
a.查找Nginx安装目录 whereis nginx
b.查询相关文件 find / -name nginx
4.删除Nginx相关文件(一定注意复制查找到的文件地址,不要轻易使用rm -rf指令)
参考资料(转载链接)
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
: