零、前导知识
使用源码安装配置Linux上的Web服务器——Nginx文章浏览阅读96次。本文主要是关于Nginx的简介及其各个版本说明;同时还有保姆级的下载Nginx源码进行配置、编译、安装操作;最后还启动该Nginx服务并设置开机自启,实现生产环境下的Nginx部署上线。https://blog.csdn.net/xiaochenXIHUA/article/details/150780215Nginx的主要配置文件nginx.conf详细解读——及其不间断重启nginx服务等操作文章浏览阅读424次。本文主要是关于对Nginx的主要配置文件nginx.conf内容的详细解析【全局配置、HTTP配置、压缩内容配置、server配置】的常用项目说明及其配置。最后对如何查看正在运行的Nginx版本及其配置参数查看;如何实现优雅的关闭nginx服务、不间断服务地重启nginx服务等操作。
https://blog.csdn.net/xiaochenXIHUA/article/details/150980344Nginx的反向代理与正向代理及其location的配置说明文章浏览阅读55次。本文主要是关于【Nginx中location的匹配优先级与location配置示例详解】及其重点讲解【Nginx的反向代理内容及其示例】与【正向代理】内容,帮助我们更好的配置使用Nginx。
https://blog.csdn.net/xiaochenXIHUA/article/details/151022106
一、Nginx中的内置变量
1.1、Nginx中的常见内置变量及其示例
序号 | Nginx中的常见内置变量 | 说明 |
1 | $args | 表示请求行中的参数 |
2 | $document_root | 等同于当前请求的root指令指定的值(可理解为虚拟主机的资源根目录) |
3 | $uri | 表示不带请求参数的当前URL,$uri不包含主机名。 |
4 | $document_uri | 与$uri含义一样(表示不带请求参数的当前URL,$uri不包含主机名)。 |
5 | $host | 请求头部中“Host”行指定的值一致。 |
6 | $limit_rate | 用来设置限制连接的速率。 |
7 | $request_method | 等同于request的method,通常是“GET”或“POST”。 |
8 | $remote_addr | 表示客户端IP地址。 |
9 | $remote_port | 表示客户端端口。 |
10 | $remote_user | 表示用户名,由ngx_http_auth_basic_module认证。 |
11 | $request_filename | 表示当前请求的文件的路径名,由root或alias和URI request组合而成。 |
12 | $request_uri | 表示含有参数的完整的初始URI(不包含主机名,由客户端请求决定,不能修改)。 |
13 | $query_string | 与$args含义一致(表示请求行中的参数)。 |
14 | $server_addr | 表示请求的服务器地址。 |
15 | $server_name | 表示请求到达的服务器名。默认是localhost。 |
16 | $server_port | 表示请求到达的服务器的端口号。 |
内置变量的示例说明:
#示例一:以【http://188.19.236.18:8000/abc?test=123&test2=abc】为例解析
$args:test=123&test2=abc
$uri: /abc
$server_addr:188.19.236.18
$server_port:8000
$request_filename:abc
$request_uri:/abc?test=123&test2=abc
#示例二以【http://172.16.213.199:88/test1/test2/test.php】(假定虚拟主机根目录为/var/www/html)为例解析:
$host:172.16.213.199
$server_port:88
$request_uri: /test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php
1.2、if 指令解析及其示例
if 指令用于判断一个条件,如果条件成立,则后面的大括号内的语句将执行,相关配置从上级继承 默认情况下,if指令默认值(none)为空,可在nginx配置文件的server、location部分使用;而且if指令可以在判断语句中指定正则表达式或通过nginx内置变量匹配条件等,相关匹配条件如下表所示: |
||
序号 | 正则表达式匹配规则 | 说明 |
1 | ~ | 区分大小写匹配 |
2 | !~ | 区分大小写不匹配 |
3 | ~* | 不区分大小写匹配 |
4 | !~* | 不区分大小写不匹配 |
序号 | 文件及目录匹配 | 说明 |
1 | -f | 存在文件。 【!-f】(表示不存在文件) |
2 | -d | 存在目录。 【!-d】(表示不存在目录) |
3 | -e | 存在文件或目录。 【!-e】(表示不存在文件或目录) |
4 | -x | 文件可执行。 【!-x】(表示文件不可执行) |
if指令的示例:
#如下表示【不区分大小写匹配】以【gif、jpg、jepg、bmp、swf、htm、html、css、js】结尾的内容
#首先从【/usr/local/nginx/www/img】路径查找,若查找不到在从【/var/www/html/imgs】路径下查找
#若还查找不到再从【/apps/images】路径下查找;还找不到就报404
location ~*\.(gif|jpg|jpeg|png|bmp|swf|htm|html|css|js)$ {
root /usr/local/nginx/www/img;
if(!-fsrequest_filename)
{
root /var/www/html/imgs;
}
if(!-fsrequestfilename)
{
root /apps/images;
}
}
#示例二:【不区分大小写匹配】以【.jsp】结尾的文件是否在【/webdata/webapp/www/ROOT】路径下存在
#若不存在则从【/usr/local/nginx/www/jsp】路径下查找,若还查找不到则报404
location ~*\.(jsp)$ {
root /webdata/webapp/www/ROOT;
if(!-f $requestfilename)
{
root /usr/local/nginx/www/jsp;
}
proxy_passhttp://127.0.0.1:8888;
}
二、Nginx中的URL重写功能
2.1、rewrite 指令解析
Nginx通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但要使用rewrite功能,需要PCRE支持,应在编译nginx时指定PCRE源码目录。 rewrite指令的最后一项参数为flag标记,其支持的flag标记主要有以下四种: |
||
序号 | rewrite的flag标记 | 说明 |
1 | last | 相当于Apache里的[L]标记,表示完成rewrite之后搜索相应的URI或location。 |
2 | break | 表示终止匹配, 不再匹配后面的规则。 |
3 | redirect | 将返回302临时重定向,在浏览器地址栏会显示跳转后的URL地址。 |
4 | permanent | 将返回301永久重定向,在浏览器地址栏会显示跳转后的URL地址。 |
last和break用来实现URL重写,浏览器地址栏中的URL地址不变。 |
2.2、rewrite 指令示例
#示例一:新域名访问旧网址且新域名及其uri不变
location ~ ^/new/ {
rewrite ^/new/(.*)$ /article/$1 break;
proxy_pass https://coffeemilk.blog.csdn.net;
}
假定访问的域名是【www.newck.com】那么当访问【www.newck.com/new/web.html】时,nginx可以通过rewrite将页面重定向到w【ww.ck.com/old/web.html】,由于是通过反向代理实现了重定向,因此页面重写后不会引起浏览器地址栏中URL的变化。这个功能在新旧网站交替的时候非常有用。
#示例二:当前域名的所有请求都会重定向到【https://coffeemilk.blog.csdn.net】地址且地址会改变
location / {
rewrite ^/(.*)$ https://coffeemilk.blog.csdn.net/$1 permanent;
}
新旧网站交替的详细操作流程如下:
实现修改Windows系统的主机文件自定义指定ip与域名操作:
#修改windows本地主机文件指定域名为指定IP操作流程
#1-进入Windows本地host主机文件路径
C:\Windows\System32\drivers\etc
#2-将该路径(Windows本地host主机文件路径)下的hosts文件复制一份到桌面,且在本地复制一份原本的文件做备份(选中hosts文件同时按下ctrl+c复制后又按下ctrl+v粘贴一份即可作为备份)
#3-修改复制到桌面上的hosts文件(使用文本编辑器打开)添加域名与ip的对应内容后保存
#4-将桌面上修改后保存后的hosts文件复制到【C:\Windows\System32\drivers\etc】路径下替换原来的hosts文件
比如我们想在想要通过现有的【www.newck.com】域名访问原有的【coffeemilk.blog.csdn.net/article/details/151022106】文章,使用现有的域名访问完整地址是【www.newck.com/new/details/151022106】即可。
三、Nginx中的set 指令与break 指令
3.1、set 指令解析及其示例
set指令可以设置一个变量并为其赋值,其值可以是文本、变量或它们的组合。 也可以使用set定义一个新的变量,但是不能使用set设置$http_xxx头部变量的值。 |
|
序号 | 说明 |
1 |
|
2 |
|
set 指令示例:
#示例一:
location / {
if ($query_string ~ "id=(.*)") {
set $myid $1;
rewrite ^/app.php$ /m-$myid.html?;
}
}
这是配置一个伪静态的示例;假如访问的域名是www.abc.com,那么上面这个配置要实现的功能是将请求为www.abc.com/app.php?id=100重定向到www.abc.com/m-100.html。
这里用到了if指令和set指令,并且还使用了$query_string变量,此变量用于获取请求行中的参数,if指令用来判断请求参数中的id值,然后通过set指令定义了一个变量$myid,并将$query_string变量中获取到的id值赋给$myid,最后通过rewrite指令进行了url重写。
这里需要注意的是:rewrite只能针对请求的uri进行重写,而对请求参数无能为力,/app.php问号后面的“id=100”是请求参数,要获取到参数,需要使用nginx的一个内部变量$query_string,这样在重写的时候只需把$query_string变量追加到重写的uri后面即可,另外,为了防止uri中的参数追加到重写后的uri上,需要在rewrite最后面加个问号。
3.2、break 指令解析及其示例
break 指令表示完成当前设置的规则后,不再匹配后面的重写规则。
|
break示例:
#示例:
server {
listen 80;
server_name www.ck.cn;
if ($host != 'www.ck.cn') {
rewrite ^/(.*)$ http://www.ck.cn/error.txt
break;
rewrite ^/(.*)$ http://www.ck.cn/$1 permanent;
}
}
在这个示例中,定义了一个域名【www.ck.cn】,当访问的域名不是www.ck.cn时,会将请求重定向到“http://www.ck.cn/error.txt” 页面, 由于设置了break指令,因此下面的rewrite规则不再被执行,直接退出。而当访问的域名是www.ck.cn时,将直接执行最后一个rewrite指令。
这里需要重点掌握一下break的功能,它表示完成当前设置的规则后,不再匹配后面的重写规则,也就是当满足if指令后,直接退出,而不会去执行最后一个rewrite指令的规则。
四、Nginx中的虚拟主机(实现多网站配置)
虚拟主机功能是Nginx经常用到的一个特性,每个虚拟主机就是一个独立的站点,对应一个域名,如果需要多个域名指向到一个IP上时,通过虚拟主机功能可以轻松实现。
#示例:在Nginx中创建三个虚拟主机(注意:这里仅仅列出了虚拟主机配置部分)
http {
server {
listen 80;
server_name www.ck1.com;
access_log logs/ck1.access.log main;
location / {
index index.html;
root /data/www/ck1;
}
}
server {
listen 80;
server_name www.ck2.com;
access_log logs/ck2.access.log main;
location / {
index index.html;
root /data/www/ck2;
}
}
#通过包含文件的方式将第三个网站的虚拟主机配置包含到nginx中
include /usr/local/nginx/conf/www.ck3.conf;
}
《1》创建三个网站的资源目录
#创建ck1、ck2、ck3网站的资源目录
mkdir -p /data/www/ck1
mkdir -p /data/www/ck2
mkdir -p /data/www/ck3
《2》分别给这三个网站设置index.html内容
#设置ck1网站的index.html内容
vi /data/www/ck1/index.html
this is ck1 web
#设置ck2网站的index.html内容
vi /data/www/ck2/index.html
this is ck2 web
#设置ck3网站的index.html内容
vi /data/www/ck3/index.html
this is ck3 web
《3》在nginx的配置文件设置三个网站的虚拟主机内容
#1-进入nginx的配置文件设置三个网站的虚拟主机配置
cd /usr/local/nginx/conf
#2-编辑nginx的主配置文件
vi nginx.conf
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#keepalive_timeout 0;
keepalive_timeout 65;
server_names_hash_bucket_size 128;
client_max_body_size 20m;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
server {
listen 80;
server_name www.ck1.com;
access_log logs/ck1.access.log main;
location / {
index index.html;
root /data/www/ck1;
}
}
server {
listen 80;
server_name www.ck2.com;
access_log logs/ck2.access.log main;
location / {
index index.html;
root /data/www/ck2;
}
}
#通过包含文件的方式将第三个网站的虚拟主机配置包含到nginx中
include /usr/local/nginx/conf/www.ck3.conf;
}
#3-单独创建ck3网站的虚拟主机配置
vi www.ck3.conf
server {
listen 80;
server_name www.ck3.com;
access_log logs/ck3.access.log main;
location / {
index index.html;
root /data/www/ck3;
}
}
#4-验证修改的配置文件是否正确(注意:若验证后提示不正确一定要根据提示修改后再验证直到正确为止)
/usr/local/nginx/sbin/nginx -t
《4》在不影响业务的情况下重启nginx
#1-查看到现有运行的nginx的父进程PID编号
ps -ef | grep nginx
#2-在不影响业务运行的情况下重启nginx服务
kill -HUP 6781
《5》修改Windows本机的hosts文件
#1-进入Windows本地host主机文件路径
C:\Windows\System32\drivers\etc
#2-将该路径(Windows本地host主机文件路径)下的hosts文件复制一份到桌面,且在本地复制一份原本的文件做备份(选中hosts文件同时按下ctrl+c复制后又按下ctrl+v粘贴一份即可作为备份)修改复制到桌面的hosts文件
192.168.1.11 www.ck1.com
192.168.1.11 www.ck2.com
192.168.1.11 www.ck3.com
#3-将桌面修改好的hosts文件粘贴一份到【C:\Windows\System32\drivers\etc】路径下替换即可
《6》在浏览器上分别访问这三个网站会显示不同的内容如下图所示
Nginx上配置多个网站_nginx配置多个网站https://coffeemilk.blog.csdn.net/article/details/140356631
五、Nginx的负载均衡配置解析及其示例
Nginx的负载均衡模块目前支持5种调度算法(后两项属于第三方的调度方法) | ||
序号 | Nginx的负载均衡调度配置 | 说明 |
1 | 轮询 | 是Nginx的默认配置; 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器死机,故障系统被自动剔除,使用户访问不受影响。 |
2 | weight | 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。 |
3 | ip_hash | 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。 |
4 | fair | 更加智能的负载均衡算法。 此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。 Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。 |
5 | url_hash | 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。 Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。 |
在HTTP Upstream模块中,除了可以通过server指令指定后端服务器的IP地址和端口; 同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的四种状态如下: |
||
序号 | Nginx负载均衡的状态 | 说明 |
1 | down | 当前的server暂时不参与负载均衡。 |
2 | backup | 预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。 |
3 | max_fails | 允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。 |
4 | fail_timeout | 在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。 |
注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。 |
负载均衡的配置示例:
#负载均衡的配置示例一
http
{
upstream reverseProxyServer {
server 192.168.1.18:80 weight=3 max_fails=3 fail_timeout=20s;
server 192.168.1.19:80 weight=1 max_fails=3 fail_timeout=20s;
server 192.168.1.20:80 weight=4 max_fails=3 fail_timeout=20s;
}
server
{
listen 80;
server_name www.ck.com 192.168.1.11;
index index.htm index.html;
root /data/www/ck;
location / {
proxy_pass http://reverseProxyServer;
proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
include /usr/local/nginx/conf/proxy.conf;
}
}
#负载均衡的配置示例二
http
{
upstream reverseProxyServer {
server 192.168.1.18:80 max_fails=3 fail_timeout=20s;
server 192.168.1.19:80 max_fails=3 fail_timeout=20s;
server 192.168.1.20:80 max_fails=3 fail_timeout=20s;
ip_hash;
}
server
{
listen 80;
server_name www.ck.com 192.168.1.11;
index index.htm index.html;
root /data/www/ck;
location / {
proxy_pass http://reverseProxyServer;
proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
include /usr/local/nginx/conf/proxy.conf;
}
}