Nginx常用功能
1,负载均衡
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。
2、Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。
- Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。
- Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的配置。
- 并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。
3、web缓存
Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以的进行增删管理。
Nginx 虚拟主机管理
- 虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的Intemet服务器功能(WWW、FTP、Email等),同一台主机上的虚拟主机之间是完全独立的。从网站访问者来看,每一台虚拟主机和一台独立的主机完全一样。
- 利用虚拟主机,不用为每个要运行的网站提供一台单独的Nginx服务器或单独运行一组Nginx进程。虚拟主机提供了在同一台服务器、同一组Nginx进程上运行多个网站的功能。
Nginx 并发优化
Linux下高并发socket最大连接数所受的各种限制
- 修改用户进程可打开文件数限制 :
vim /etc/security/limits.conf
nginx - nofile 65535 # 配置文件末尾添加一行
- Linux系统级的最大打开文件数限制
fs.file-max = 188414 //和内存容量相关 - 修改网络内核对TCP连接的有关限制
net.ipv4.ip_local_port_range = 1024 65535 - 限制接收新 TCP 连接侦听队列的大小
net.core.somaxconn = 2048 - 启用tcp连接timewait快速回收和重用
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1 - Nginx 主要配置文件(nginx.conf)
# 注意每个语句结尾必须 有分隔符 ' ;'
user nginx niinx; # 设置 nginx 用户来执行 nginx 服务,nginx 用户不存在的话需创建
worker_processes 2; # 全局区 有两个工作子进程,一般设置为CPU数 * 核数,或者 设置为 "auto" 自动根据主机内核数设置自工作进程
worker_cpu_affinity 1000 0100; # 当前主机内核数为 4,开启第三、第四个内核来完成两个工作子进程的任务,第一、第二个内核处于闲置状态
events {
# 一般是配置nginx进程与连接的特性
multi_accept on; # 告诉nginx收到一个新连接通知后接受尽可能多的连接
use epoll; # 使用epoll模型
worker_connections 65535; # 单个工作进程 worker 并发连接数 ,一个子进程最大允许连接65535个连接
sendfile on; # 开启文件高效传输模式, 同时设置tcp_nopush 和tcp_nodelay 为on,可以防止网路和磁盘IO阻塞。
tcp_nopush on;
tcp_nodelay on;
keepalived_timeout 65; # 保持尝试连接时间 65s
}
# 配置HTTP服务器配置段
http {
# 配置虚拟主机段
server {
# 定位,把特殊的路径或文件再次定位。
location {
}
}
server {
...
}
}
nginx 作为 http 服务器时:
- max_clients = worker_processes * worker_connections
nginx作为反向代理服务器时:
- max_clients = worker_processes * worker_connections / 2
基于域名的虚拟主机
1、在http大括号中添加如下代码段:
server {
listen 80; # 监听端口 80
server_name www.westos.org; # 监听域名www.westos.org;
location / {
root westos; # 相对路径,相对nginx根目录。也可写成绝对路径
index index.html; # 默认跳转到index.html页面
}
}
2、切换安装目录:cd/usr/local/nginx/
3、创建目录:mkdir westos
4、新建index.html文件:vi /usr/local/nginx/westos/index.html,文件内容: echo “welcom westos”
5、重新读取配置文件:
/usr/local/nginx/sbin/nginx-s reload
kill -HUP进程号
6、配置 CLIENT 测试主机本地解析 hosts:
vim /etc/hosts
172.25.1.2 www.westos.org #Linux服务器IP地址 以及对应域名 解析
7、访问测试:http://westos.org:80/
基于端口的虚拟主机配置
server {
listen 8080;
server_name abc.com;
location / {
root /home;
index index.html;
}
}
基于IP地址虚拟主机配置
server {
listen 80;
server_name 172.25.1.3;
location / {
root ip;
index index.html;
}
}
Location 配置
Location 语法规则:location [=||*|^~] /uri/ {… }
符号 | 含义 |
= | = 开头表示精确匹配 |
^~ | ^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格) |
~ | ~ 开头表示区分大小写的正则匹配 |
~* | ~* 开头表示不区分大小写的正则匹配 |
!和!* | !和!*分别为区分大小写不匹配及不区分大小写不匹配的正则 |
/ | 用户所使用的代理(一般为浏览器) |
$http_x_forwarded_for | 可以记录客户端IP,通过代理服务器来记录客户端的ip地址 |
$http_referer | 可以记录用户是从哪个链接访问过来的 |
匹配规则示例 | 产生的效果 |
location = / { # 规则A } | 访问根目录/,比如http://localhost/将匹配规则A |
location =/login { # 规则B } | 访问 http://localhost/login 将匹配规则B,http://localhost/register则匹配规则H |
location ^~ /static/ { # 规则C } | 访问 http://localhost/static/a.html 将匹配规则C |
location ~ .(gif jpj)$ { # 规则D } | 访问 http://localhost/a.gif,http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而http://localhost/static/c.png则优先匹配到规则C |
location ~* .png$ { # 规则E } | 访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。 |
location !~ .xhtml$ { # 规则F } | 访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到 |
location !~* .xhtml$ { # 规则G } | |
location = / { # 规则H } | 访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(PHP),tomcat(jsp),nginx作为方向代理服务器存在。 |
实际常用规则
1.第一个必选规则
location = / { # 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理。
proxy_passhttp://tomcat:8080/index # 这里是直接转发给后端应用服务器了,也可以是一个静态首页
}
2.第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
# 请求/static/a.txt 将被映射到实际目录文件:/webroot/res/static/a.txt
root /webroot/res/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)${
root /webroot/res/;
}
3.第三个规则就是通用规则,用来转发动态请求到后端应用服务器 (#非静态文件请求就默认是动态请求,带.php,.jsp等后缀的情况)
location / {
proxy_pass http://tomcat:8080/
}
ReWrite语法
- Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。
- rewrite只能放在 server{} , location{} , if{} 语句块中,并且只能对域名后边的除去传递的参数外的字符串起作用。
Rewrite全局变量
变量 | 含义 |
$remote_addr | 客户端的IP地址。 |
$remote_port | 客户端的端口。 |
$request_uri | 包含请求参数的原始URI,不包含主机名,如”/foo/bar.php?arg=baz”。 |
$host | 请求主机头字段,否则为服务器名称。 |
if 指令
if 语法格式
if 空格 (条件) {
重写模式
}
return 指令
应用实例 < 1 >:限制 IP访问
Location / {
Deny 172.25.0.10; # 拒绝来自 172.25.0.10 IP的访问请求
Allow 172.25.0.0/24; # 允许 172.25.0.0/24 这个网段的所有强求
Deny all; # 拒绝所有用户请求
}
If ($remote_addr = 172.25.0.254) { # 来自 172.25.0.254 IP的访问请求后,返回 403 报错信息
return 403;
}
rewrite 重定向 指令
- #判断目录是否存在
- #服务器内部的rewrite和302跳转不一样.跳转的话URL都变了,变成重新http请求index.html,而内部rewrite 重定向,上下文没变。
应用实例 < 2 >:http(80端口) 访问重定向 https(443端口)
- cd /etc/pki/tls/certs
- make cert.pem # 制作 cert.pem (key 文件)
- mv cert.pem /usr/local/nginx/conf/
- vim /usr/local/lnmp/nginx/conf/nginx.conf
- nginx -t
- nginx -s reload
server {
listen 80;
server_name www.westos.org; # 访问 http://www.westos.org
rewrite ^/(.*)$ https://www.westos.org/$1 permanent; # 重定向访问 https://www.westos.org
}
server {
listen 443 ssl; # 监听 443 端口
server_name localhost; # 虚拟服务器 具备https (443端口) 主机为本主机
ssl_certificate cert.pem;
ssl_certificate_key cert.pem; # 加密,密匙访问
...
location / {
root html;
index index.html;
}
}
应用实例 < 3 >:域名www.westos.org/bbs 访问重定向 bbs.westos.org
server {
listen 80;
server_name www.westos.org; # 访问 http://www.westos.org
rewrite ^/bbs$ http://bbs.westos.org permanent; # www.westos.org/bbs 访问重定向 bbs.westos.org (首页)
rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent; # www.westos.org/bbs/(.* 所有) 访问重定向 bbs.westos.org/(所有)
# 注意:两次重定向路径层次不一样
}
应用实例 < 4 >:域名bbs.westos.org 重定向 www.westos.org/bbs
if ($host = "bbs.westos.org"){ # if 请求主机(服务器)域名为 bbs.westos.org
rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent; # 重定向 www.westos.org/bbs/下
}
Nginx 工作原理及安装配置
工作原理:
- Nginx 由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个 location block(location 是 Nginx配置中的一个指令,用于 URL 匹配),而在这个 location 中所配置的每个指令将会启动不同的模块去完成相应的工作。
Nginx 的模块从结构上分为: - 核心模块:HTTP 模块、 EVENT 模块和 MAIL 模块
- 基础模块: HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite模块
- 第三方模块:HTTP Upstream Request Hash 模块、 Notice 模块和 HTTP Access Key模块。
nginx.conf 配置文件结构
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
- main (全局块):main部分配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- server块(主机设置):指令主要用于指定虚拟主机域名、IP和端口等,虚拟主机的相关参数,一个http中可以有多个server。
- location块(URL匹配特定位置后的设置):配置请求的路由( 即匹配网页位置–比如,根目录"/","/images",等等),以及各种页面的处理情况。
备注:server继承main,location继承server;upstream(event+http)既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。