推荐阅读人群:@nginx零基础的小伙伴们。因为最近进行了一次内部分享,所以落实到笔上,记录一番。
nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev.
如官网所说:nginx是一个HTTP和反向代理服务器、邮件代理服务器,也是一个通用的TCP/UDP代理服务器,最初由俄罗斯人Igor Sysoev编写。
nginx的功能有很多,本文旨在让零基础的小伙伴可以搭起nginx服务并进行一些常用的配置。
一、nginx安装
- Homebrew安装:
brew install nginx
- 源码编译安装:可以参考官网,以下是我在服务器上源码安装的过程「环境:CentOS-7」
- 源码包安装略复杂,其实如果只用到nginx的基本配置,那简单安装就够了,可以略过以下安装步骤直接往后看哦😯
- 从官网下载nginx源码包
wget http://nginx.org/download/nginx-1.15.5.tar.gz
- 解压
tar -zxvf /root/Desktop/nginx-1.15.5.tar.gz -C /usr/local/src/
- tar -C 指定解压目录为
/usr/local/src/
- tar -C 指定解压目录为
- 安装
正式开始前,编译环境gcc
gcc-c++
、开发库之类的需要提前装好1) 安装gcc
gcc-c++
:yum install -y gcc gcc-c++
2) 安装pcre
:PCRE(Perl Compatible Regular Expressions即perl语言兼容正则表达式),是一个Perl库,包括 perl 兼容的正则表达式库,作用是使nginx支持HTTP Rewrite模块,让nginx能够兼容正则表达式,实现正则匹配。
3) 安装zlib:为了支持gzip压缩。
4) 安装ssl
5) 安装Nginx
cd /usr/local/src/nginx-1.15.5/ ./configure --prefix=/usr/local/webserver/nginx --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.41 --with-zlib=/usr/local/src/zlib-1.2.11 --with-openssl=/usr/local/src/openssl-1.1.1 # --prefix:指定安装路径,指定了路径后就不会一团糟啦 make && make install
安装目录:
-
- conf:里面是各种配置文件 - html:一些页面(404,50X…) - logs:日志文件 - sbin:sbin目录下有一个nginx,代表nginx应用程序,启动nginx时,需要进入sbin目录下,启动sbin目录下的nginx可执行文件
二、nginx的启停
首先进入nginx安装目录cd /usr/local/webserver/nginx/
- 启动nginx
./sbin/nginx -c conf/nginx.conf
- -c 指定配置文件,不指定则使用默认配置文件/usr/local/webserver/nginx/conf/nginx.conf
- 重新加载nginx
./sbin/nginx -s reload
- 停止nginx
./sbin/nginx -s stop
- 验证nginx是否启动
ps -ef | grep nginx
三、配置文件结构
- 安装完成后,在
/usr/local/webserver/nginx/conf
目录下有一个默认的配置文件nginx.conf
,打开乍一看上去很多内容,我把主要内容抽象出来就明朗很多了,这样一个配置文件就可以满足我们一些简单的功能:
图示:
大致可分如下四部分:
main
(全局配置)、server
(主机配置)、upstream
(负载均衡配置)、location
(URL匹配特定位置的配置)。
main
部分配置的指令将会影响其他所有设置;server
部分的配置主要用于指定主机和端口;upstream
部分的配置用于负载均衡,设置一系列的后端服务器;location
部分的配置用于匹配url;- 它们四大块配置的继承关系是:
server
继承main
的,location
继承server
的,upstream
既不继承其他配置也不会被继承。
四、常用配置
以下,是说起nginx,大家脑海中可能会立刻闪现出的一些名词,我就由此入手,说一下如何进行配置:
反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
🌰:
以YouTube为例,由于YouTube的访问量很大,为了一系列目的,他有很多台服务器,这时就需要代理服务器把来自各个客户端的请求(或者客户端通过正向代理服务器发出的请求)代理到某台服务器上。这个中间服务器就是反向代理服务器。反向代理的特点是客户端不知道他最终访问的是哪个服务器。
- nginx反向代理基础配置
worker_processes 1; events { worker_connections 1024; } http { server { listen 80; location / { #打到这个nginx服务的请求 全被反向代理到https://github.com proxy_pass https://github.com/; } } }
提及反向代理,就连带也说一下正向代理吧
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
🌰:vpn就是典型的正向代理
还以YouTube为例,我(也就是客户端)想要访问YouTube,但是由于YouTube被中国国家防火墙拒之门外,我们无法直接访问到。那我们可以翻墙到国外一个可以访问YouTube的服务器,通过这个服务器去访问YouTube ,那这个中间服务器做的就是正向代理。正向代理的特点是服务器端不会知道最初是哪里来访问的。
负载均衡
- 为什么需要负载均衡?
服务器访问量越大,压力就越大,甚至会奔溃。为了避免服务器崩溃,采用负载均衡的方式,分担服务器的压力。 - Nginx负载均衡的实现
- Nginx是通过反向代理实现负载均衡的。使用nginx实现负载均衡,用户会首先访问到nginx服务器,nginx服务器从服务器集群待选列表中按照某种规则选择一台服务器,将该请求引到这台服务器上
- Nginx会把服务器集群中崩溃的服务器从待选列表中删除,保证不会分配给用户访问到
- HTTP upstream模块:nginx服务器的一个重要模块。实现客户端ip和后端ip之间的负载均衡 。从待选服务器列表中选取服务器的方法:默认使用轮询算法。
- 🌰:
touch upstream_demo.conf
写入如下配置
user nobody; worker_processes 1; events { worker_connections 1024; } http { #设置待负载均衡的服务器列表 upstream summer { #server指令:用来指定服务器的IP地址(后面要写IP地址,而不是域名)支持加参数weight(权重),权重值越大,被访问到的概率就越大,不写weight 权重默认是1 server 192.168.1.7:80 weight=2; server 192.168.1.17:80 weight=1; } server { listen 8080; location / { # 指定一个服务器列表,要与上面upstream后起的名对应上 proxy_pass http://summer; } } }
- nginx支持的负载均衡策略:
- 轮询(default):每个请求按时间顺序逐一分配到不同的后端服务器。
- 加权轮询:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
- ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
- fair按后端服务器的响应时间来分配请求,响应时间短的优先分配。
- url_hash按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
location
- 语法:
location [ = | ~ | ~* | ^~ ] uri { ... }
- 作用域:
server
,location
location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 # 但是最长字符优先匹配 [ configuration B ] } location /documents/ { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration C ] } location ^~ /images/ { # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。 [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 .gif,.jpg或.jpeg 结尾的请求 # 然而,所有请求 /images/ 下的图片会被[configuration D]处理 [ configuration E ] } # = 表示精确匹配。如 A 中只匹配根目录结尾的请求,后面不能带任何字符串; # ^~ 表示uri以某个常规字符串开头,不是正则匹配; # ~ 表示区分大小写的正则匹配; # ~* 表示不区分大小写的正则匹配; # / 通用匹配, 如果没有其它匹配,任何请求都会匹配到。 # 优先级排序: 精确匹配 location =, location完整路径, location ^~, (location ~, location ~*正则匹配的优先级会根据location写的先后顺序) , location 部分前缀匹配, 通用匹配location /
rewrite
- rewrite简介
- rewrite功能:使用PERL标准正则和标志位实现url重写或重定向。
- 作用域:
server
,location
,if
- 语法格式:
rewrite regex replacement [flag];
- flag标志位
last
: 相当于Apache的[L]标记,表示完成rewrite,将rewrite后的地址重新在server标签执行;break
: 停止执行当前虚拟主机的后续rewrite指令集,将rewrite后地址重新在当前的location标签执行;redirect
: 返回302临时重定向,通知客户端重定向到rewrtie后面的地址,地址栏会显示跳转后的地址permanent
: 返回301永久重定向,通知客户端永久重定向到rewrtie后面的地址,地址栏会显示跳转后的地址
if
指令
- 作用域:
server
,location
if
指令不支持嵌套,不支持&&
和||
的处理if
中可以填入的表达式
(1)变量名:变量值为空,或者是以0开头的字符串会当作false
(2)变量比较可以使用=
或!=
(3)可以匹配正则表达式,~
表示匹配区分大小写~*
表示匹配不区分大小写
(4)!~
和!~*
表示取反(不匹配),和上一条正好相反
(5)-f
和!-f
判断本地可访问的文件是否存在
(5)-d
和!-d
判断本地可访问的路径是否存在
(6)-e
和!-e
判断本地可访问的文件或路径是否存在
(7)-x
和!-x
判断本地可访问的文件是否可执行
(8)部分正则表达式可以使用模式,模式的取值可以用$1
…$n
进行取值
🌰
if (request_method = POST) {
return 405;
} //如果请求方法为POST,则返回状态405(Method not allowed)。
if (!-frequest_filename){
break;
proxy_pass http://127.0.0.1;
} //如果请求的文件名不存在,则反向代理到http://127.0.0.1 。这里的break是停止rewrite检查
if ($args ~ xxx=1234){
rewrite ^ http://example.com/ permanent;
} //如果query string中包含"xxx=1234",永久重定向到example.com
五、总结
相信看完本文,大家对nginx都有了初步的了解,也可以轻松搭起Nginx服务并进行一些常用的配置了吧。其实Nginx是一个非常轻便好用的工具,对它稍做了解就会发现,工作中的很多事情可以用Nginx解决呢。我就先抛出这块儿砖,希望能引出大佬们对Nginx深层次、多方面的分享。
附录:
- nginx常用指令:
nginx -V
查看版本,以及配置文件地址nginx -v
查看nginx版本nginx -c
filename 指定配置文件nginx -h
帮助nginx -s reload|reopen|stop|quit
重新加载配置|重启|停止|退出nginxnginx -t
测试nginx.conf配置是否有语法错误
- nginx部分常用变量(ps:想了解全部点这里)
$args
: #这个变量等于请求行中的参数,同$query_string
$content_length
: 请求头中的Content-length字段。$content_type
: 请求头中的Content-Type字段。$document_root
: 当前请求在root指令中指定的值。$host
: 请求主机头字段,否则为服务器名称。$http_user_agent
: 客户端agent信息$http_cookie
: 客户端cookie信息$limit_rate
: 这个变量可以限制连接速率。$request_method
: 客户端请求的动作,通常为GET或POST。$remote_addr
: 客户端的IP地址。$remote_port
: 客户端的端口。$remote_user
: 已经经过Auth Basic Module验证的用户名。$request_filename
: 当前请求的文件路径,由root或alias指令与URI请求生成。$scheme
: HTTP方法(如http,https)。$server_protocol
: 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。$server_addr
: 服务器地址,在完成一次系统调用后可以确定这个值。$server_name
: 服务器名称。$server_port
: 请求到达服务器的端口号。$request_uri
: 包含请求参数的原始URI,不包含主机名。
🌰:以这个url为例:http://localhost:8080/pic/baby/1.png$host
:localhost$server_port
:8080$request_uri
:/pic/baby/1.png$document_root
:/var/www/html$request_filename
:/var/www/html/pic/baby/1.png
文章评论