您当前的位置:首页 > 计算机 > 服务器 > Nginx

Nginx入门实用技巧

时间:10-29来源:作者:点击数:
城东书院 www.cdsy.xyz
背景

一般公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户。

在这里插入图片描述

但是慢慢的,使用我们平台的用户越来越多了,并发量慢慢增大了,这时候一台服务器满足不了我们的需求了。

在这里插入图片描述

于是我们横向扩展,又增加了服务器。这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个proxy服务器了,通过proxy服务器来帮我们转发和处理请求。

在这里插入图片描述

我们希望这个proxy服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上。

这个过程用户是无感知的,用户并不知道是哪个服务器返回的结果,我们还希望他可以按照服务器的性能提供不同的权重选择。保证最佳体验!所以我们使用了Nginx。

什么是Nginx

Nginx (engine x)是一个高性能的HTTP和反向proxyweb服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx1.0.4发布。

除了反向proxy,nginx还支持正向proxy、负载均衡以及基于SSL安全证书的HTTPS访问等功能特性.

其特点是占有内存少并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。

Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。

Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。

Nginx作用

HTTP正向proxy,反向proxy:作为web服务器最常用的功能之一,尤其是反向proxy。

proxy服务
在这里插入图片描述

proxy又分为正向proxy和反向proxy。

正向proxy

先看张图

在这里插入图片描述

举个例子

某同学喜欢面向搜索引擎编程,想通过 百度 搜索引擎查找一些学习资料,但是有些网站直接访问可能不太安全,会暴露自己的IP,同学比较苦恼,想着怎样才能使用百度 搜索自己想要的学习资料,又不会暴露自己的IP在网站上呢?

这时我告诉该同学,我呢手上刚好有一台proxy服务器,这台proxy服务器通过nginx配置了正向proxy转发http和https请求,你呢,只需要在自己的Windows本地电脑的网关配置一下这台proxy服务器的IP和端口号,就能正常通过proxy服务器访问到百度 并搜索相关的学习资料了,还不会暴露自己真实的IP。

在这里插入图片描述

同学非常兴奋,说自己了解过nginx,但是啥是正向proxy啊?

正向proxy,指的是通过proxy服务器 proxy浏览器/客户端去重定向请求访问到目标服务器 的一种proxy服务。 正向proxy服务的特点是proxy服务器proxy的对象是浏览器/客户端,也就是对于目标服务器 来说浏览器/客户端是隐藏的。

同学觉得有点意思,于是又问,那nginx如何实现正向proxy啊?

如何实现nginx正向proxy?

1.正向proxy转发https说明

在实现nginx正向proxy之前,先说明一下,现在的网站基本上都是https,因此要实现nginx正向proxy转发请求,除了要配置转发http80端口的请求,还有配置https443端口的请求~

正向proxy转发http请求很简单,不过正向proxy转发https请求稍微有一点麻烦,目前网上的教程大多都是如下这样配置的(不一定准确)。

在这里插入图片描述

一开始我也像上面那样配置,虽然http请求正常转发了,但是发现https并没有转成功,而是报错HTTP/1.1 400 Bad Request

后来才了解到,nginx官方并不支持直接转发https请求,但是阿里的一个大佬对nginx拓展了一个ngx_http_proxy_connect_module模块,并且在github上开源了

https://github.com/chobits/ngx_http_proxy_connect_module

不过维护的ngx_http_proxy_connect_module模块的补丁也是有nginx版本限制的(目前维护了1.4.x~1.19.x版本),如README.md说明

在这里插入图片描述

如果你安装的nginx版本不在1.4.x~1.19.x这个范围内,那无法支持正向proxy转发https请求。

2.安装nginx

安装步骤可以参考下面步骤

安装nginx通过install进行编译安装,编译后默认安装目录为/usr/local/nginx

后续配置新模块ngx_http_proxy_connect_module还需要重新install编译一次

3.下载新模块

GitHub上下载ngx_http_proxy_connect_module的zip压缩包源码:

https://github.com/chobits/ngx_http_proxy_connect_module

在这里插入图片描述

4. 解压新模块源码

将新模块ngx_http_proxy_connect_module源码压缩包上传到服务器/usr/nginx目录,并解压并重命名

$ mkdir -p /usr/nginx
$ cd /usr/nginx
$ /usr/nginx
$ unzip ngx_http_proxy_connect_module-master.zip
$ mv ngx_http_proxy_connect_module-master ngx_http_proxy_connect_module

5.添加新模块到nginx

使用root用户进入nginx的资源目录/usr/nginx/nginx-1.18.0,给nginx添加新模块ngx_http_proxy_connect_module和并重新编译nginx

$ /usr/nginx/nginx-1.18.0
$ patch -p1 < /usr/nginx/ngx_http_proxy_connect_module/patch/proxy_connect.patch
$ ./configure --add-module=/usr/nginx/ngx_http_proxy_connect_module
$ make && make install

说明:

这里nginx-1.18.0版本对应proxy_connect.patch补丁,其他版本相关补丁支持版本,详情见GitHub~ https://github.com/chobits/ngx_http_proxy_connect_module

使用root用户安装和编译新模块完成后,如果你希望后续不使用root用户运维,可以授权安装目录/usr/local/nginx给nginx用户或者其他普通用户

chown -R nginx:nginx /usr/local/nginx
chown root:root /usr/local/nginx/sbin/nginx
chmod +s /usr/local/nginx/sbin/nginx

说明:

二进制/usr/local/nginx/sbin/nginx文件需要重新归属为root用户,并且权限位添加s权限(权限位+s的二进制文件属于是管道文件,也就是普通用户也可执行该二进制文件,执行后产生的进程属于该文件的权限所有者,这里文件所有者是root)

6.修改nginx的配置

修改nginx的配置分别添加http和https的server,其他配置保持不变~

vi /usr/local/nginx/conf/nginx.conf

这两个server主要配置是对DNS解析proxy_passproxy进行:

#正向proxy转发http请求
server {
    #指定DNS服务器IP地址 
    resolver 114.114.114.114;
    #监听80端口,http默认端口80
    listen 80;
    #服务器IP或域名
    server_name  localhost;
	
    #正向proxy转发http请求
    location / {
        proxy_pass                 http://$host$request_uri;
        proxy_set_header           HOST $host;
        proxy_buffers              256 4k;
        proxy_max_temp_file_size   0k;
        proxy_connect_timeout      30;
        proxy_send_timeout         60;
        proxy_read_timeout         60;
        proxy_next_upstream error  timeout invalid_header http_502;
    }
}

#正向proxy转发https请求
server {
    #指定DNS服务器IP地址 
    resolver 114.114.114.114;
    #监听443端口,https默认端口443
    listen 443;
	
    #正向proxy转发https请求
    proxy_connect;
    proxy_connect_allow            443 563;
    proxy_connect_connect_timeout  10s;
    proxy_connect_read_timeout     10s;
    proxy_connect_send_timeout     10s;
    location / {
        proxy_pass http://$host;
        proxy_set_header Host $host;
    }
}

DNS说明:

(国内外)目前比较主流的DNS:

(国外)谷歌:8.8.8.8 developers.google.com

(国外)OpenDNS:208.67.222.222 signup.opendns.com

(国内)114:114.114.114.114 www.114dns.com

(国内)腾讯:119.29.29.29 www.dnspod.cn

(国内)阿里:223.5.5.5 alidns.com

(国内)百度:180.76.76.76 dudns.baidu.com

7.检查和刷新nginx配置

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload

8.客户端访问(验证正向proxy)

客户端要proxy访问目标网站示例对象:

http://www.baidu.com 和https://www.baidu.com

客户端–Windows浏览器访问

首先在本地电脑的IE浏览器设置proxy服务器和端口:

IE->右上角 ->工具 ->Internet选项->连接->局域网(LAN)设置 ->配置proxyIP和端口

在这里插入图片描述

浏览器访问

http://www.baidu.com/ 和https://www.baidu.com/

实时查看nginx日志

tail -f /usr/local/nginx/logs/access.log

通过实时查看nginx的访问日志,可以看到Windows下设置proxyIP和端口后,本地电脑访问的所有网页会通过proxy服务器进行访问网页,实现了正向proxy的功能,并且隐藏了用户自己真实的IP

客户端–Linuxproxy访问

Linux下也可以验证proxy服务器是否能正常proxy转发http和https请求

curl http://www.baidu.com/ -v -x 127.0.0.1:80
curl https://www.baidu.com/ -v -x 127.0.0.1:443

nginx正向proxy转发https成功:

在这里插入图片描述
反向proxy

先来一张图了解下

在这里插入图片描述

相比于正向proxy,反向proxy的定义如下:

反向proxy,指的是浏览器/客户端并不知道自己要访问具体哪台目标服务器,只知道去访问proxy服务器 ,proxy服务器再通过反向proxy+负载均衡实现请求分发到应用服务器的一种proxy服务。 反向proxy服务的特点是proxy服务器 proxy的对象是应用服务器,也就是对于浏览器/客户端 来说应用服务器是隐藏的。

nginx实现反向proxy步骤如下

1.修改nginx配置

修改nginx配置vi /usr/local/nginx/conf/nginx.confhttp模块中配置如下:

在这里插入图片描述

nginx反向proxy都是结合负载均衡来实现的,这里先直接提供反向proxy+负载均衡的配置,负载均衡接着在后面介绍。

#反向proxy+负载均衡
upstream reverseProxyServer{
    #负载均衡应用服务器A: 权重为10,10s内连接请求失败2次,nginx在10s内认为server是不可用的,将不在发送请求给这台服务器
    server 应用服务器A的IP:8080 weight=10 max_fails=2 fail_timeout=10s; 
    #负载均衡应用服务器B: proxy服务器权重为5,10s内连接请求失败2次,nginx在10s内认为server是不可用的,将不在发送请求给这台服务器
    server 应用服务器B的IP:8080 weight=5 fail_timeout=10s max_fails=2;
    #负载均衡应用服务器C: proxy服务器权重为5,10s内连接请求失败2次,nginx在10s内认为server是不可用的,将不在发送请求给这台服务器
    server 应用服务器C的IP:8080 weight=5 fail_timeout=10s max_fails=2;
}

server {
    #监听80端口,http默认端口80
    listen 80;
    #服务器IP或域名
    server_name  localhost;
    #反向proxy请求路径中含有/appname的所有请求到upstream定义的对应反向proxy模块
    location /appname {
        proxy_pass http://reverseProxyServer;
    }
}

2.检查和刷新nginx配置

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload

3.浏览器访问

proxy服务器部署了tomcat应用,访问tomcat静态页面验证一波

http://proxy服务器IP:8080/appname/ReverseProxy1.html

在这里插入图片描述
负载均衡

什么是负载均衡

再来看下前面介绍反向proxy的这张图

在这里插入图片描述

可以看到负载均衡(Load Balance)的主要作用是采用了负载均衡算法将请求分发到集群模式中的应用服务器上,这样即使某个后台应用服务器挂了,其他应用服务器还可以正常接收请求,实现了高可用,并且集群模式模式下的应用服务器支持纵向扩展,可以应对业务快速增长带来的高并发应用场景

负载均衡算法有哪些

负载均衡算法常用的有轮询、权重和ip_hash算法,默认是轮询算法

1.基于轮询的算法

原理是每一个请求按时间顺序逐一被分发到不同的应用服务器,如果接收请求的应用服务器挂了,并且请求超过最大失败次数max_fails(1次),则在失效时间fail_timeout(10秒)内不会再转发请求到该节点

upstream defaultReverseProxyServer{
    server 192.168.0.1:8080; 
    server 192.168.0.2:8080; 
}

转发到每台服务器的权重相同

在这里插入图片描述
2.基于权重的算法

原理是每一个请求按权重被分发到不同的应用服务器,同样,如果接收请求的应用服务器挂了,并且请求超过最大失败次数max_fails(默认1次或可设置N次),则在失效时间fail_timeout(默认10秒,可设置N秒)内,不会再转发请求到该节点

upstream weightReverseProxyServer{
    server 192.168.0.1:8080 weight=10 max_fails=2 fail_timeout=5s;
    server 192.168.0.2:8080 weight=5 max_fails=2 fail_timeout=5s;
}

转发到每台服务器的权重不同

在这里插入图片描述
3.基于ip_hash的算法

原理是每一个请求按用户访问IP的哈希结果分配,如果请求来自同一个用户IP则固定这台IP访问一台应用服务器,该算法可以有效解决动态网页中存在的session共享问题。

upstream ipHashReverseProxyServer{
    ip_hash;
    server 192.168.0.1:8080;
    server 192.168.0.2:8080;
}
在这里插入图片描述

一般使用的是基于权重的算法,因为现在很多情况下都是集群部署,而且集群下的各个服务器资源大多都是不均匀的,资源高的则分配权重高一些,资源低的则分配权重低一些,这种情况使用基于权重的负载均衡算法,可以更高效的利用资源和提高并发处理能力.

动静分离

在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。

让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。

在这里插入图片描述

目前,通过使用Nginx大大提高了我们网站的响应速度,优化了用户体验,让网站的健壮性更上一层楼!

Nginx的安装
windows下安装

1.下载nginx

http://nginx.org/en/download.html

建议下载稳定版本

在这里插入图片描述

以nginx/Windows-1.18.0为例,直接下载 nginx-1.18.0.zip。

下载后解压,解压后如下:

在这里插入图片描述

2、启动nginx

有很多种方法启动nginx

(1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过

(2)打开cmd命令窗口,切换到nginx解压目录下,输入命令 nginx.exe ,回车即可

在这里插入图片描述

3、检查nginx是否启动成功

直接在浏览器地址栏输入网址 http://localhost:80 回车,出现以下页面说明启动成功!

在这里插入图片描述

如果你输入地址没有成功,那可能是端口80被占用,可以接着看文章下面修改配置文件里面的默认监听端口号。

4、配置监听

nginx的配置文件是conf目录下的nginx.conf,默认配置的nginx监听的端口为80,如果80端口被占用可以修改为未被占用的端口即可。

在这里插入图片描述

我们将原本的80端口改成了8082端口,当我们修改了nginx的配置文件nginx.conf 时,不需要关闭nginx后重新启动nginx,只需要执行命令nginx -s reload即可让改动生效

5、关闭nginx

如果使用cmd命令窗口启动nginx, 关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx

(1)输入nginx命令nginx -s stop(快速停止nginx) 或nginx -s quit(完整有序的停止nginx)

(2)使用taskkilltaskkill /f /t /im nginx.exe

taskkill是用来终止进程的, /f是强制终止 . /t终止指定的进程和任何由此启动的子进程。 /im示指定的进程名称 .

linux下安装
centos安装Nginx

1、安装gcc

安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:

yum install gcc-c++

2、PCRE pcre-devel 安装

PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:

yum install -y pcre pcre-devel

3、zlib 安装

zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

yum install -y zlib zlib-devel

4、OpenSSL 安装

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。

nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

yum install -y openssl openssl-devel

5、下载安装包

手动下载.tar.gz安装包,https://nginx.org/en/download.html

在这里插入图片描述

下载完毕上传到服务器上 /root

6、解压

tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
在这里插入图片描述

7、配置

使用默认配置,在nginx根目录下执行

./configure
make
make install

查找安装路径:whereis nginx

在这里插入图片描述

Nginx常用命令

cd /usr/local/nginx/sbin/
./nginx  启动
./nginx -s stop  停止
./nginx -s quit  安全退出
./nginx -s reload  重新加载配置文件
ps aux|grep nginx  查看nginx进程

启动成功访问 服务器ip:80

在这里插入图片描述

注意:如何连接不上,检查安全组是否开放端口,或者服务器防火墙是否开放端口!

相关命令:

# 开启
service firewalld start
# 重启
service firewalld restart
# 关闭
service firewalld stop
# 查看防火墙规则
firewall-cmd --list-all
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
# 参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为持久;
3、--add-port:标识添加的端口;
Ubuntu安装Nginx

首先更新升级一下库

apt-get update
apt upgrade

安装gcc g++依赖库

sudo apt-get install build-essential
sudo apt-get install libtool

安装pcre依赖库

sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev

安装zlib依赖库

sudo apt-get install zlib1g-dev

安装SSL依赖库

sudo apt-get install openssl

这里安了稳定版1.18.0版本Nginx进行安装

#下载安装包
wget http://nginx.org/download/nginx-1.18.0.tar.gz
#解压
tar -zxvf nginx-1.18.0.tar.gz
#进入解压目录
cd nginx-1.18.0
#配置
./configure --prefix=/usr/local/nginx 
#编译并且安装:
make && make install
#进入sbin目录启动
cd /usr/local/nginx/sbin
./nginx

配置文件在conf/nginx.conf,按需修改即可。

启动,关闭,重启,命令:

#启动
./nginx 
#关闭
./nginx -s stop 
#重启
./nginx -s reload 

查看进程或端口

netstat -anp|grep nginx
或
netstat -anp|grep 端口号

强制杀死进程

kill -9 进程号(pid)

启动成功访问 服务器ip:80

在这里插入图片描述
Nginx的卸载

首先需要停止nginx的服务

sudo service nginx stop

删除Nginx的–purge包括配置文件

sudo apt-get --purge remove nginx

自动移除全部不使用的软件包

sudo apt-get autoremove

列出与nginx相关的软件 并删除显示的软件

dpkg --get-selections|grep nginx

libnginx-mod-http-geoip

libnginx-mod-http-image-filter

libnginx-mod-http-xslt-filter

libnginx-mod-mail

libnginx-mod-stream

nginx-common

sudo apt-get --purge remove libnginx-mod-http-geoip				
sudo apt-get --purge remove libnginx-mod-http-image-filter			
sudo apt-get --purge remove libnginx-mod-http-xslt-filter		
sudo apt-get --purge remove libnginx-mod-mail				
sudo apt-get --purge remove libnginx-mod-stream				
sudo apt-get --purge remove nginx-common			

再次执行

dpkg --get-selections|grep nginx

which nginx # 不在显示nginx

这样就可以完全卸载掉nginx包括配置文件

城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门