Nginx服务器保姆级的教程,实现nginx服务器的反向代理、动静分离、负载均衡、跨域问题、gzip页面压缩技术
#Ubuntu下的nginx安装与配置 (包括nginx服务器的反向代理、动静分离、负载均衡、跨域问题、gzip页面压缩技术) ##一、执行下面的命令安装Nginx
sudo apt-get install nginx
##二、启动 Nginx ###2.1 执行下面的命令启动Nginx
sudo service nginx start
###2.2 启动之后,我们看一下 Nginx 是否处于运行状态。
sudo service nginx status
#####2.3正常出现active就是启动成功了
sudo service nginx restart
3.1 Nginx 的命令在控制台中输入 nginx -h
就可以看到完整的命令。
systemctl
是 Linux 系统应用管理工具 systemd
的主命令,用于管理系统,我们也可以用它来对 Nginx 进行管理,相关命令如下:
systemctl start nginx # 启动 Nginx
systemctl stop nginx # 停止 Nginx
systemctl restart nginx # 重启 Nginx
systemctl reload nginx # 重新加载 Nginx,用于修改配置后
systemctl enable nginx # 设置开机启动 Nginx
systemctl disable nginx # 关闭开机启动 Nginx
systemctl status nginx # 查看 Nginx 运行状态
#四、Nginx 的反向代理 ##4.1正向代理和反向代理的概念
反向代理(Reverse Proxy)对应的是正向代理(Forward Proxy),他们的区别:
正向代理: 一般的访问流程是客户端直接向目标服务器发送请求并获取内容,使用正向代理后,客户端改为向代理服务器发送请求,并指定目标服务器(原始服务器),然后由代理服务器和原始服务器通信,转交请求并获得的内容,再返回给客户端。正向代理隐藏了真实的客户端,为客户端收发请求,使真实客户端对服务器不可见;
举个具体的例子 ??,你的浏览器无法直接访问谷哥,这时候可以通过一个代理服务器来帮助你访问谷哥,那么这个服务器就叫正向代理。
反向代理: 与一般访问流程相比,使用反向代理后,直接收到请求的服务器是代理服务器,然后将请求转发给内部网络上真正进行处理的服务器,得到的结果返回给客户端。反向代理隐藏了真实的服务器,为服务器收发请求,使真实服务器对客户端不可见。一般在处理跨域请求的时候比较常用。现在基本上所有的大型网站都设置了反向代理。
举个具体的例子 ??,去饭店吃饭,可以点川菜、粤菜、江浙菜,饭店也分别有三个菜系的厨师 ?????,但是你作为顾客不用管哪个厨师给你做的菜,只用点菜即可,小二将你菜单中的菜分配给不同的厨师来具体处理,那么这个小二就是反向代理服务器。
简单的说,一般给客户端做代理的都是正向代理,给服务器做代理的就是反向代理。
正向代理和反向代理主要的原理区别可以参见下图:
vim /etc/nginx/nginx.conf #nginx.conf 默认是安装在/etc/nginx文件夹下的
http
模块的 server
块中的 location /
然后我们去 http
模块的 server
块中的 location /
,增加一行将默认网址重定向到我们自己的ip地址 。即 proxy_pass
配置 :
proxy_pass http://myserver; #这里面的myserver就是我们的ip地址 例如http://123.249.1.68:8080
改完保存退出,nginx -s reload
重新加载,进入默认网址,那么现在就直接http://123.249.1.68:8080 了,实现了一个简单的代理。
实际使用中,可以将请求转发到本机另一个服务器上,也可以根据访问的路径跳转到不同端口的服务中。
比如我们监听 9001
端口,然后把访问不同路径的请求进行反向代理:
http://127.0.0.1:9001/edu
的请求转发到 http://127.0.0.1:8080
http://127.0.0.1:9001/vod
的请求转发到 http://127.0.0.1:8081
这种只要打开nginx.conf
主配置文件,然后在 http 模块下增加一个 server 块:
server {
listen 9001;
server_name localhost;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}
这样就可以根据访问的路径跳转到不同端口的服务中。 server 块可以包含多个 location 块,location 指令用于匹配 uri,语法:
location [ = | ~ | ~* | ^~] uri {
...
}
指令后面:
=
精确匹配路径,用于不含正则表达式的 uri 前,如果匹配成功,不再进行后续的查找;^~
用于不含正则表达式的 uri 前,表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找;~
表示用该符号后面的正则去匹配路径,区分大小写;~*
表示用该符号后面的正则去匹配路径,不区分大小写。跟 ~
优先级都比较低,如有多个location的正则能匹配的话,则使用正则表达式最长的那个;如果 uri 包含正则表达式,则必须要有 ~
或 ~*
标志。
#五、Nginx 的动静分离
##5.1 动静分离的概念
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。
动静分离
一般来说,都需要将动态资源和静态资源分开,由于 Nginx 的高并发和静态资源缓存等特性,经常将静态资源部署在 Nginx 上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。
使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。 ##5.2 动静分离的具体配置
vim /etc/nginx/nginx.conf
http
模块的 server
中添加location:我们找到http
模块的 server
块 添加如下loaction:
#静态资源缓存设置
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
root /opt/gain/;
expires 5m;
}
location ~ .*\.(js|css)?$ {
root /opt/gain/;
expires 5m;
}
#动态资源设置
location / {
#这里面myserver是 upstream中的myserver内容
proxy_pass http://myserver;
}
这样 我们请求静态文件的时候就会指向nginx服务器中路径中的静态文件 动态请求的时候就会指向tomact服务器 可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。
#六、Nginx 的负载均衡 ##6.1 负载均衡的概念 一般情况下,客户端发送多个请求到服务器,服务器处理请求,其中一部分可能要操作一些资源比如数据库、静态资源等,服务器处理完毕后,再将结果返回给客户端。
这种模式对于早期的系统来说,功能要求不复杂,且并发请求相对较少的情况下还能胜任,成本也低。随着信息数量不断增长,访问量和数据量飞速增长,以及系统业务复杂度持续增加,这种做法已无法满足要求,并发量特别大时,服务器容易崩。
很明显这是由于服务器性能的瓶颈造成的问题,除了堆机器之外,最重要的做法就是负载均衡。
请求爆发式增长的情况下,单个机器性能再强劲也无法满足要求了,这个时候集群的概念产生了,单个服务器解决不了的问题,可以使用多个服务器,然后将请求分发到各个服务器上,将负载分发到不同的服务器,这就是负载均衡,核心是「分摊压力」。Nginx 实现负载均衡,一般来说指的是将请求转发给服务器集群。
举个具体的例子 ??,晚高峰乘坐地铁的时候,入站口经常会有地铁工作人员大喇叭“请走 B 口,B 口人少车空....”,这个工作人员的作用就是负载均衡。
##6.2 负载均衡的具体配置
vim /etc/nginx/nginx.conf
http
模块的中添加upstream:我们找到http
模块的,添加如下upstream:
upstream myserver {
server 123.249.1.68:8080;
server 123.249.1.68:81;
}
我们拿一台服务器的不同端口来举例 使用轮询的机制,当我们第一次访问 123.249.1.68:8070
的时候 会指向 8080端口的页面 当再次刷新的时候 会指向81端口的页面
Nginx 提供了好几种分配方式,默认为轮询,就是轮流来。有以下几种分配方式:
vim /etc/nginx/nginx.conf
http
模块的中server
中添加如下命令:add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Methods GET,POST;
具体位置如下图:
这时访问我们的网页,就可以看到请求头了:
vim /etc/nginx/nginx.conf
http
模块的中server
中添加如下命令:gzip on;
gzip_min_length 1k;
gzip_buffers 4 64k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_vary on;
gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml image/jpg image/jpeg image/png;
整体代码如下图:
我们可以看到网页配置之后 response 的 header 里面多了一个 Content-Encoding: gzip,返回信息被压缩了:
稍微解释一下:
.gz
文件内容;Vary:Accept-Encoding
,使代理服务器根据请求头中的 Accept-Encoding
识别是否启用 gzip 压缩;Content-Length
中进行获取。默认值是 0,不管页面多大都压缩。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大;此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。