1.Nginx 百科
nginx 是一个高性能HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务器Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日
其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文 件和低系统资源的消耗而闻名。2011 年 6 月 1 日,nginx 1.0.4 发布
Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服 务器,在BSD-like协议支持下发行,其特点是占用内存少,并发能力强,事实上 nginx 的 并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有: 百度、京东、新浪、网易、腾讯、淘宝等。
优点
Nginx 是一个很强大的高性能 Web 和反向代理服务,它具有很多非常优越的特性: 在连接高并发的情况下,Nginx 是 Apache 服务不错的替代品:Nginx 在美国是做虚拟 主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响 应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型。
安装
下载之后解压就可以,非常加单。
conf:nginx配置文件目录,发布项目配置文件等都在这
html:存放静态目录的位置,如果需要作为静态资源服务器,可以新建目录也可将文件放在次目录下
命令(nginx -?)
start nginx 启动命令
nginx -t 检查配置文件是否正确
nginx -s reload 重启
nginx -s stop 类似于强制停止
nginx -s quit 正常停止
nginx -c conf/xx.conf 使用指定配置文件
有时候在启动或停止的时候回出现如下的错误 :
nginx: [error] CreateFile() "E:\nginx\nginx-1.9.3/logs/nginx.pid" failed
nginx: [error] Open() "E:\nginx\nginx-1.9.3/logs/nginx.pid" failed
可以使用命令创建/logs/nginx.pid文件: nginx -c conf/nginx.conf
也可以把nginx安装为服务
需要借助"Windows Service Wrapper"小工具,
下载地址: http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/1.18/winsw-1.18- bin.exe 下载后放在 nginx 目录下,
并修改名字为 nginx-service.exe
创建配置文件 nginx-service.exe.config 和 nginx-service.xml nginx-service.xml 的内容如下:
nginx-service.xml的内容如下:
<service>
<id>nginx</id>
<name>Nginx Service</name>
<description>High Performance Nginx Service</description>
<logpath>C:\nginx-1.14.0\logs</logpath>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
<executable>C:\nginx-1.14.0\nginx.exe</executable>
<startarguments>-p C:\nginx-1.14.0</startarguments>
<stopexecutable>C:\nginx-1.14.0\nginx.exe</stopexecutable>
<stoparguments>-p C:\nginx-1.14.0 -s stop</stoparguments>
</service>
nginx-service.exe.config内容如下:
<configuration>
<startup>
<supportedRuntime version="v2.0.50727" />
<supportedRuntime version="v4.0" />
</startup>
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
</configuration>
linux 直接使用yum(没有的可以先安装一下yum)
官方 package 地址:http://nginx.org/en/linux_packages.htm
安装 nginx: [root@localhost ~]# yum install -y nginx 查看当前仓库中nginx的版本
清理并更新 yum 缓存库:
[root@localhost ~]# yum clean all
[root@localhost ~]# yum makecache
查看当前仓库 nginx 版本:
[root@localhost ~]# yum info nginx
[root@iz2ze54xqy28wor27b9yw7z /]# yum info nginx
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Available Packages
Name : nginx
Arch : x86_64
Epoch : 1
Version : 1.16.1
Release : 1.el7
Size : 562 k
Repo : epel/x86_64
Summary : A high performance web server and reverse proxy server
URL : http://nginx.org/
License : BSD
Description : Nginx is a web server and a reverse proxy server for HTTP, SMTP, POP3 and
: IMAP protocols, with a strong focus on high concurrency, performance and low
: memory usage.
-y 表示安装过程选项都是“yes”
安装完成直接访问即可
源码安装
1.安装 pcre(perl compatible regular expressions),中文为 perl 兼容正则表达式,
为 nginx 支持 URI 重写(rewritemok)做准备。
-------------------------------------------系统信息检查------------------------
----------------------
[root@iz2ze54xqy28wor27b9yw7z /]# cat /etc/redhat-release ##查看linux版本
CentOS Linux release 7.6.1810 (Core)
[root@iz2ze54xqy28wor27b9yw7z /]# uname -r #查看linux内核版本
3.10.0-957.10.1.el7.x86_64
[root@iz2ze54xqy28wor27b9yw7z /]# uname -m #系统位数
x86_64
---------------------------------------yum 安装 pcre--------------------------
--------------------------
[root@iz2ze54xqy28wor27b9yw7z /]# rpm -qa prce prce-devel
[root@iz2ze54xqy28wor27b9yw7z /]# yum install pcre pcre-devel -y
2.安装 openssl-devel 包,为支持 https 做为准备
[root@iz2ze54xqy28wor27b9yw7z /]# yum install openssl openssl-devel -y
[root@iz2ze54xqy28wor27b9yw7z /]# rpm -qa openssl
openssl-1.0.1e-57.el6.x86_64
[root@iz2ze54xqy28wor27b9yw7z /]# rpm -qa openssl-devel
openssl-devel-1.0.1e-57.el6.x86_64
[root@iz2ze54xqy28wor27b9yw7z /]#
安装nginx
[root@iz2ze54xqy28wor27b9yw7z /]mkdir nginx #创建nginx目录
[root@iz2ze54xqy28wor27b9yw7z /]#wget -q http://nginx.org/download/nginx-1.6.3.tar.gz #下载 软件包
[root@iz2ze54xqy28wor27b9yw7z /]#tar -zxvf nginx-1.6.3.tar.gz #解压安装包
[root@iz2ze54xqy28wor27b9yw7z /] #./configure -- prefix=/application/nginx-1.6.3/ --with-http_stub_status_module --with-http_ssl_module # 编译
[root@iz2ze54xqy28wor27b9yw7z /]#make #编译
[root@iz2ze54xqy28wor27b9yw7z /]# make install#安装
[root@iz2ze54xqy28wor27b9yw7z /]# ln -s /nginx/nginx-1.6.3 /application/nginx #建立软 连接,方便访问
当 nginx 软件升级编译成带新版本号的版本后,删除原来的软链接,再重新建立新的到 /application/nginx 的软连接就好。 程序中如果有引用 nginx 路径的地方,不需要做任何更改,因为升级后访问路径还是 /applicaton/nginx
#检查 链接以及目录状态
[root@iz2ze54xqy28wor27b9yw7z nginx-1.6.3]# ll /application|grep nginx
lrwxrwxrwx. 1 root root 24 Feb 27 05:50 nginx -> /application/nginx-1.6.3
drwxr-xr-x. 6 root root 4096 Feb 27 05:48 nginx-1.6.3
[root@iz2ze54xqy28wor27b9yw7z nginx-1.6.3]# ls -l /application/nginx
lrwxrwxrwx. 1 root root 24 Feb 27 05:50 /application/nginx -> /application/nginx-1.6.3
[root@iz2ze54xqy28wor27b9yw7z nginx-1.6.3]#
检查nginx config配置是否正确
启动nginx
[root@iz2ze54xqy28wor27b9yw7z sbin]# ./nginx
[root@iz2ze54xqy28wor27b9yw7z sbin]# netstat -lnt|grep 80 #检查 nginx 服务对应的端口是否成功启动
nginx 常用命令
Nginx -t 检查语法
Nginx -s reload 平滑重启
systemctl start nginx 启动
Nginx -s stop 停止
2.4 nginx 的配置文件 配置文件的整体结构
从图中可以看出主要包含以下几大部分内容:
1. 全局块 该部分配置主要影响 Nginx 全局,通常包括下面几个部分
配置运行 Nginx 服务器用户(组)worker process 数 Nginx 进程 PID 存 放路径错误日志的存放路径配置文件的引入
2. events 块
该部分配置主要影响 Nginx 服务器与用户的网络连接,
主要包括: 设置网络连接的序列化是否允许同时接收多个网络连接事件驱动模型 的选择最大连接数的配置
3. http 块 定义 MIMI-Type 自定义服务日志允许 sendfile 方式传输文件连接超时 时间单连接请求数上限
4. server 块 配置网络监听基于名称的虚拟主机配置基于 IP 的虚拟主机配置
5. location 块 location 配置请求根目录配置更改 location 的 URI 网站默认首页配置
nginx 的使用场景
1http 服务器(静态资源服务器)
/usr/share/nginx/html
2 虚拟主机
1、基于域名的虚拟主机,通过域名来区分虚拟主机
server {
listen 80;
server_name shop.fesco.com;
location / { root data/shop; index index.html index.htm; } } #当客户端访问 www.itmayiedu.com,监听端口号为 80,直接跳转到 data/bbs 目录下文件
server {
listen 80;
server_name helo.XXX.com;
location / {
root data/helo;
index index.html index.htm;
}
}
2 基于端口的虚拟主机,通过端口来区分虚拟主机
使用端口来区分,浏览器使用域名或 ip 地址:端口号 访问
server {
listen 8080;
server_name 8080.XX.com;
location / {
root data/shop;
index index.html index.htm;
}
}
server {
listen 8081;
server_name 8081.XX.com;
location / {
root data/helo;
index index.html index.htm;
}
}
基于 ip 的虚拟主机
###当客户端访问 shop.XXX.com,监听端口号为 80 直接跳转到真实 ip 服务器地址 127.0.0.1:8080
server {
listen 80;
server_name shop.XXX.com;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
###当客户端访问 helo.XXX.com,监听端口号为 80 直接跳转到真实 ip 服务器地址 127.0.0.1:8081
server {
listen 80;
server_name helo.XXX.com;
location / {
proxy_pass http://127.0.0.1:8081;
index index.html index.htm;
}
}
4 负载均衡
Upstream Server 负载均衡
Upstream Server 中文翻译 上游服务器,意思就是负载均衡服务器设置,白话文表示(就是被 nginx 代理最后真实访问的服 务器)
负载均衡算法:配置多个上游服务器(真实业务逻辑访问的服务器)的负载均衡机制
失败重试机制:当上游服务器(真实业务逻辑访问的服务器)出现超时或者服务器不存活,是否考虑重试机制(补偿机制) 服务器心跳
检测: 当上游服务器(真实业务逻辑访问的服务器),监控检测|心跳检测
Upstream Server 配置
upstream 主要配置如下:
IP 地址和端口号:配置上游服务器的 IP 地址和端口
###定义上游服务器(需要被 nginx 真实代理访问的服务器) 默认是轮训机制
upstream backServer{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name www.XXX.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
负载均衡算法
1、轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问
不受影响。
2、weight(轮询权值) weight 的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在
主从的情况下设置 不同的权值,达到合理有效的地利用主机资源。
3、ip_hash 每个请求按访问 IP 的哈希结果分配,使来自同一个 IP 的访客固定访问一台后端服务器,并且可以有效解决动态网页
存在的 session 共享问题。俗称 IP 绑定。
4、fair(第三方) 比 weight、ip_hash 更加智能的负载均衡算法,fair 算法可以根据页面大小和加载时间长短智能地进行负载均
衡,也 就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx 本身不支持 fair,如果需要这种调度算法,
则必 须安装 upstream_fair 模块。
5、url_hash(第三方) 按访问的 URL 的哈希结果来分配请求,使每个 URL 定向到一台后端服务器,可以进一步提高后端缓存服
务器的效率。 Nginx 本身不支持 url_hash,如果需要这种调度算法,则必须安装 Nginx 的 hash 软件包。 轮询(默认) 每个请
求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
权重 Weight
upstream backServer{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
}
server {
listen 80;
server_name www.XXX.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
IP 绑定 ip_hash 每个请求按访问 IP 的哈希结果分配,使来自同一个 IP 的访客固定访问一台后端服务器,并且可以有效解决动态
网页存在的 session 共享问题。俗称 IP 绑定。
upstream backServer{
server 127.0.0.1:8080 ;
server 127.0.0.1:8081 ;
ip_hash;
}
server {
listen 80;
server_name www.XXX.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
Nginx 配置故障转移
当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。
upstream backServer{
server 127.0.0.1:8080 ;
server 127.0.0.1:8081 ;
}
server {
listen 80;
server_name www.XXX.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
###nginx 与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 1s;
###nginx 发送给上游服务器(真实访问的服务器)超时时间
proxy_send_timeout 1s;
### nginx 接受上游服务器(真实访问的服务器)超时时间
proxy_read_timeout 1s;
index index.html index.htm;
}
}
Lua 等....
location 的作用 location 指令的作用是根据用户请求的 URI 来执行不同的应用,也就是根据用户请求的网站 URL 进行匹配,
匹配成功即进行相 关的操作。
location 的语法 已=开头表示精确匹配 如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
^~ 开头表示 uri 以某个常规字符串开头,不是正则匹配 ~ 开头表示区分大小写的正则匹配;
~* 开头表示不区分大小写的正则匹配 / 通用匹配, 如果没有其它匹配,任何请求都会匹配到
location 的匹配顺序;参考;https://www.cnblogs.com/zhaof/p/5945576.html
提一下proxy_pass 后面的 url 加与不加/的区别
在 nginx 中配置 proxy_pass 时,
当在后面的 url 加上了/,相当于是绝对根路径,则 nginx 不会把 location 中匹配的路径部分代理 走;
如果没有/,则会把匹配的路径部分也给代理走。 首先是 location 进行的是模糊匹配
1)没有“/”时,location /abc/def 可以匹配/abc/defghi 请求,也可以匹配/abc/def/ghi 等
2)而有“/”时,location /abc/def/不能匹配/abc/defghi 请求,只能匹配/abc/def/anything
这样的请求下面四种情况分别用 http://192.168.1.4/proxy/test.html 进行访问。
第一种: location /proxy/ {proxy_pass http://127.0.0.1:81/;} 结论:会被代理到 http://127.0.0.1:81/test.html 这个 url
第二种(相对于第一种,最后少一个 /) location /proxy {proxy_pass http://127.0.0.1:81;} 结论:会被代理到
http://127.0.0.1:81/proxy/test.html 这个 url
第三种: location /proxy/ {proxy_pass http://127.0.0.1:81/ftlynx/;} 结论:会被代理到 http://127.0.0.1:81/ftlynx/test.html 这个
url。
第四种(相对于第三种,最后少一个 / ): location /proxy/ {proxy_pass http://127.0.0.1:81/ftlynx;} 结论:会被代理到
http://127.0.0.1:81/ftlynxtest.html 这个 url
upstream sso.shichengba.com {
#server 10.0.75.50:18080 weight=1;
server 10.0.75.50:80 weight=1;
}
server {
listen 443;
server_name sso.XXX.com;
#charset koi8-r;
#access_log /data/logs/nginx-log/wx-shishichengba-com-access.log main;
#error_page 404 /404.html;
ssl on;
ssl_certificate /ca/1_sso.shichengba.com_bundle.crt;
ssl_certificate_key /ca/2_sso.shichengba.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location / {
proxy_pass http://sso.XXX.com;
proxy_redirect default;
}
}
nginx rewrite
Nginx 提供的全局变量或自己设置的变量,结合正则表达式和标志位实现 url 重写以及重定向。rewrite 只能放在
server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用。
Rewrite 主要的功能就是实现 URL 的重
写,Nginx 的 Rewrite 规则采用 Pcre,perl 兼容正则表达式的语法规则匹配,如果需要 Nginx 的 Rewrite 功能,在编译 Nginx 之
前,需要编译安装 PCRE 库。 通过 Rewrite 规则,可以实现规范的 URL、根据变量来做 URL 转向及选择配置。
nginx 的 rewrite 规则就是使用正则匹配请求的 url,然后根据定义的规则进行重写和改变,需 ngx_http_rewrite_module 模块 来
支持 url 重写功能,该模块是标准模块,默认已经安装,关于规则自行百度就好。
判断 IP 地址来源
## 如果访问的 ip 地址为 192.168.5.165,则返回 403
if ($remote_addr = 192.168.5.166) {
return 403;
}
限制浏览器访问 ## 不允许谷歌浏览器访问 如果是谷歌
## 不允许谷歌浏览器访问 如果是谷歌浏览器返回 500
if ($http_user_agent ~ Chrome) {
return 500;
}