Nginx-基础使用
Nginx
(engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
常用场景
- 静态资源服务器
- 代理服务
- 跨站资源访问
- 适配PC与移动端环境
- 负载均衡调度
- 缓存服务
- 简单的访问控制
- 图片处理
默认配置文件
全局块:nginx
全局配置。比如用户以及用户组 user
,nginx
进程 pid
文件存放路径,日志存放路径 error_log
,工作进程worker process
数等,也可以引入配置文件。
events
块:服务器连接相关配置。比如进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
http
块:可嵌套多个虚拟主机 server
,配置代理,设置缓存,配置日志定义等。支持很多第三方模块的配置。比如文件引入,mime-type
定义,图片压缩,日志自定义,传输文件配置,设置连接超时时间,单个连接请求数等等。
server
块:虚拟主机的相关配置。
location
块:请求的路由相关配置,特殊页面的处理。
# {全局块}# 设置用户组
#user nobody;
# 配置用户或者组,默认为nobody nobody。
#user admin admin; # 设置工作进程的数量
worker_processes 1;# 指定日志路径,日志级别包括 debug | info | notice | warn | error | alert 等
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;# 指定进程文件
#pid logs/nginx.pid;events { # {event块}# 设置一个进程是否同时接受多个网络连接,默认为off#multi_accept on;# 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport#use epoll;# 进程的最大连接数worker_connections 1024;
}http { {#http块}# 文件拓展名查找集合include mime.types;# 默认文件类型为文件流,匹配.*default_type application/octet-stream;# 日志格式定义,main为日志别名#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 off;# 指定日志输入文件#access_log logs/access.log main;# 调用 sendfile 系统传输文件,sendfile on 表示通过文件描述符直接拷贝,而不是用read()/write()sendfile on;# tcp_nopush = on 会设置调用tcp_cork方法,这个也是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。#tcp_nopush on;# 设置连接超时时间#keepalive_timeout 0;keepalive_timeout 65;# 是否启用 gzip 压缩,需要浏览器支持,需要解压缩#gzip on;# 设置gzip所需的http协议最低版本 (HTTP/1.1, HTTP/1.0)#gzip_http_version 1.1;# 设置压缩级别,压缩级别越高压缩时间越长 (1-9)#gzip_comp_level 4;# 设置压缩的最小字节数, 页面Content-Length获取#gzip_min_length 1000;# 设置压缩文件的类型#gzip_types text/plain application/javascript text/css;server { #{server块}# 监听端口listen 80;# 虚拟主机名称server_name localhost;# 设置编码字符集#charset koi8-r;# 指定日志输入文件#access_log logs/host.access.log main;# 监听请求路由location / { #{location块}# 查找根目录root html;# 默认匹配index index.html index.htm;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html# 重定位服务器错误到静态页面 /50x.htmlerror_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}}
复制代码
nginx
内置变量
- $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
,不包含主机名,如:”/foo/bar.php?arg=baz”。 - $uri :不带请求参数的当前
URI
,$uri
不包含主机名,如”/foo/bar.html”。 - $document_uri : 与
$uri
相同
nginx
基本命令
- nginx -t 检查配置文件是否有语法错误
- nginx -s reload 向主进程发送信号,重新加载配置文件
- nginx -s stop 快速关闭
- nginx -s quit 等待工作进程处理完成后关闭
location
匹配规则(优先级递减)
匹配符 | 含义 |
---|---|
= | 进行普通字符精确匹配。也就是完全匹配 |
^~ | 前缀匹配。如果匹配成功,则不再匹配其他location |
v~ | 表示执行一个正则匹配,区分大小写 |
~* | 表示执行一个正则匹配,不区分大小写 |
/xxx/ | 常规字符串路径匹配 |
/ | 通用匹配,任何请求都会匹配到 |
静态资源服务器
常见的静态资源包括图片,文档,视频等文件,所以 nginx
常用来作为静态网站服务器,或者作为 cdn
资源服务器。 例如以下是一个前后端分离的工程的前端工程部署配置:
...
server {...listen 8080;server_name localhost;root html/project;location / {// 按照优先级 '$uri' > '$uri/' > '/index.html' > '=404'依次匹配try_files $uri $uri/ /index.html =404;index index.html index.htm;}
}
复制代码
代理服务
nginx
用作代理服务器可以作为正向代理或者反向代理,而反向代理正是跨站资源访问的解决方案之一。 如下是正向代理配置:
...
server {...listen 8080;server_name localhost;# DNS 域名解析服务器resolver 8.8.8.8;# 解析超时时间resolver_timeout 5s;location / {proxy_pass $scheme://$http_host/$request_uri;proxy_set_header Host $http_host;proxy_buffers 256 4k;proxy_max_temp_file_size 0;proxy_connect_timeout 30;proxy_cache_valid 200 302 10m;proxy_cache_valid 301 1h;proxy_cache_valid any 1m;}
}
复制代码
一次代理,直接在shell执行:
export http_proxy=http://x.x.x.x:8080
复制代码
永久使用:
vim ~/.bashrc
export http_proxy=http://x.x.x.x:8080
source .bashrc # 刷新以加载变量
复制代码
跨站资源访问
反向代理配置如下:
...
server {...listen 80;server_name localhost;location /api {# 代理转发proxy_pass http://localhost:8081;# 路径重写(如果需要)# rewrite /api/(.*) /$1 break;# 请求host传给后端proxy_set_header Host $http_host;# 设置用户ip地址proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $remote_addr;proxy_buffers 256 4k;proxy_max_temp_file_size 0;# 代理超时时间proxy_connect_timeout 30;# 当请求服务器出错去寻找其他服务器proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; }}
复制代码
适配PC与移动端环境
nginx
可以通过内置变量 $http_user_agent
,获取到请求客户端的 userAgent
,从而知道用户处于移动端还是PC,进而控制重定向到H5站还是PC站。
...
server {...listen 80;server_name localhost;location / {# 移动、pc设备适配if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {set $mobile_request '1';}if ($mobile_request = '1') {rewrite ^.+ http://mysite-base-H5.com;}}
}
复制代码
负载均衡调度
RR(round robin:轮询)
...
server {...upstream web_servers { server localhost:8081; server localhost:8082; }server {...listen 80;server_name localhost;#access_log logs/host.access.log main;location / {proxy_pass http://web_servers;# 必须指定Header Hostproxy_set_header Host $host:$server_port;}}
}
复制代码
按权重分配
upstream test {server localhost:8081 weight=1;server localhost:8082 weight=3;server localhost:8083 weight=4 backup;
}
复制代码
按地址分配:ip_hash
upstream test {ip_hash;server localhost:8080;server localhost:8081;
}
复制代码
后端服务器的响应时间来分配:fair(第三方)
upstream backend {fair;server localhost:8080;server localhost:8081;
}
复制代码
按访问url的hash结果来分配:url_hash(第三方)
upstream backend {hash $request_uri;hash_method crc32;server localhost:8080;server localhost:8081;
}
复制代码
缓存服务
对扩展名为 gif
,jpg
,jpeg
,png
,bmp
,swf
,js
,css
的图片,flash
,javascript
,css
文件开启 Web
缓存,其他文件不缓存。配置文件如下:
user www;
worker_processes 8;events {worker_connections 65535;
}http {include mime.types;default_type application/octet-stream;charset utf-8;log_format main '$http_x_forwarded_for $remote_addr $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_cookie" $host $request_time';sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;#要想开启nginx的缓存功能,需要添加此处的两行内容!#设置Web缓存区名称为cache_one,内存缓存空间大小为500M,缓存的数据超过1天没有被访问就自动清除;访问的缓存数据,硬盘缓存空间大小为30Gproxy_cache_path /usr/local/nginx/proxy_cache_path levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=30g;#创建缓存的时候可能生成一些临时文件存放的位置proxy_temp_path /usr/local/nginx/proxy_temp_path;fastcgi_connect_timeout 3000;fastcgi_send_timeout 3000;fastcgi_read_timeout 3000;fastcgi_buffer_size 256k;fastcgi_buffers 8 256k;fastcgi_busy_buffers_size 256k;fastcgi_temp_file_write_size 256k;fastcgi_intercept_errors on;client_header_timeout 600s;client_body_timeout 600s;client_max_body_size 100m; client_body_buffer_size 256k; gzip on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_http_version 1.1;gzip_comp_level 9;gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php;gzip_vary on;upstream LB-WWW {ip_hash;server 192.168.1.101:80 max_fails=3 fail_timeout=30s; #max_fails = 3 为允许失败的次数,默认值为1server 192.168.1.102:80 max_fails=3 fail_timeout=30s; #fail_timeout = 30s 当max_fails次失败后,暂停将请求分发到该后端服务器的时间server 192.168.1.118:80 max_fails=3 fail_timeout=30s;}server {listen 80;server_name www.wangshibo.com;index index.html index.php index.htm;root /var/www/html;access_log /usr/local/nginx/logs/www-access.log main;error_log /usr/local/nginx/logs/www-error.log;location / {proxy_pass http://LB-WWW;proxy_redirect off ;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#跟后端服务器连接超时时间,发起握手等候响应时间proxy_connect_timeout 300;#后端服务器回传时间,就是在规定时间内后端服务器必须传完所有数据proxy_send_timeout 300;#连接成功后等待后端服务器的响应时间,已经进入后端的排队之中等候处理proxy_read_timeout 600;#代理请求缓冲区,会保存用户的头信息以供nginx进行处理proxy_buffer_size 256k;#同上,告诉nginx保存单个用几个buffer最大用多少空间proxy_buffers 4 256k;#如果系统很忙时候可以申请最大的proxy_buffersproxy_busy_buffers_size 256k;#proxy缓存临时文件的大小proxy_temp_file_write_size 256k;proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;proxy_max_temp_file_size 128m;}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { #使用Web缓存区cache_one,已在nginx.conf的缓存配置中命名的。proxy_cache cache_one ;#对不同HTTP状态码缓存设置不同的缓存时间proxy_cache_valid 200 304 12h ;proxy_cache_valid 301 302 1m ;proxy_cache_valid any 1m ;#设置Web缓存的Key值,Nginx根据Key值md5哈希存储缓存,这里根据"域名,URI,#参数"组合成Keyproxy_cache_key $host$uri$is_args$args;}#用于清除缓存的url设置#假设一个URL为http://www.wangshibo.com/test.gif,那么就可以通过访问http://www.wangshibo.com/purge/test.gif清除该URL的缓存。location ~ /purge(/.*) {#设置只允许指定的IP或IP段才可以清除URL缓存allow 127.0.0.1 ;allow 192.168.0.0/16 ;deny all ;proxy_cache_purge cache_one $host$1$is_args$args ;}}
}
复制代码
简单的访问控制
deny
和 allow
是 ngx_http_access_module
模块(已内置)中的语法。采用的是从上到下匹配方式,匹配到就跳出不再继续匹配。上述配置的意思就是,首先禁止 192.168.1.100
访问,然后允许 192.168.1.10-200
ip段内的访问(排除 192.168.1.100
),同时允许 10.110.50.16
这个单独ip的访问,剩下未匹配到的全部禁止访问。实际生产中,经常和 ngx_http_geo_module
模块(可以更好地管理ip地址表,已内置)配合使用。
...
server {...location / {deny 192.168.1.100;allow 192.168.1.10/200;allow 10.110.50.16;deny all;}
}
复制代码
图片处理
满足日常对图片的裁剪/缩放/旋转/图片品质等处理需求。要用到 ngx_http_image_filter_module
模块。这个模块是非基本模块,需要安装。 下面是图片缩放功能部分的 nginx
配置:
...
server {...# 图片缩放处理# 这里约定的图片处理url格式:以 mysite-base.com/img/路径访问location ~* /img/(.+)$ {#图片服务端储存地址alias /Users/cc/Desktop/server/static/image/$1;#图片宽度默认值set $width -;#图片高度默认值set $height -;if ($arg_width != "") {set $width $arg_width;}if ($arg_height != "") {set $height $arg_height;}#设置图片宽高image_filter resize $width $height;#设置Nginx读取图片的最大bufferimage_filter_buffer 10M;#是否开启图片图像隔行扫描image_filter_interlace on;#图片处理错误提示图,例如缩放参数不是数字error_page 415 = 415.png; }
}
复制代码
参考网站以及文章
nginx官网
Nginx与前端开发
前端想要了解的Nginx
Nginx常见使用场景-WEB服务(四)
nginx应用场景
Nginx 之六: Nginx服务器的正向及反向代理功能
nginx之正向代理
nginx的web缓存服务环境部署记录
Nginx-基础使用相关推荐
- Nginx基础应用配置小结 - 运维笔记
Nginx基础应用配置小结 - 运维笔记 在linux系统下使用nginx作为web应用服务,用来提升网站访问速度的经验已五年多了,今天在此对nginx的使用做一简单总结. 一.nginx服务简介 N ...
- nginx基础(七)
文章目录 1. Nginx基础概述 2. Nginx安装启动 3. Nginx配置文件 4. Nginx搭建一个静态资源web服务器 5. Nginx虚拟主机 5.1 多网卡多IP的方式 5.2 基于 ...
- Nginx基础学习笔记(正向/反向代理,Nginx均衡负载和配置)
目录 1. 正向代理和反向代理 1.1 正向代理 (1)什么是正向代理? (2)正向代理的特点 (3)正向代理的用途 1.2 反向代理 (1)什么是反向代理? (2)反向代理的特点 (3)反向代理的用 ...
- linux 安装nginx 详解教程 nginx基础命令
目录 一.nginx 安装 二.nginx 配置 三.nginx 基础命令 1.帮助命令 2.nginx启动命令 3.查看nginx启动进程 4.nginx停止 5.nginx重启 6.重新加载 ...
- Nginx基础篇-Nginx 源码编译安装与平滑升级
Nginx基础篇-Nginx 源码编译安装与平滑升级 Nginx官网下载地址 http://nginx.org/ 1.安装依赖包 yum -y install pcre-devel zlib-deve ...
- Linux nginx 基础介绍与安装版本选择
Linux nginx 基础介绍与安装版本选择 Nginx 版本类型 Nginx yum 安装 了解 Nginx 配置文件 Nginx 编译参数详解(源码编译安装时使用) Nginx 基本配置 创建N ...
- Linux - nginx基础及常用操作
目录 Linux - nginx基础及常用操作 Tengine淘宝nginx安装流程 nginx的主配置文件nginx.conf 基于域名的多虚拟主机实战 nginx的访问日志功能 网站的404页面优 ...
- Nginx学习(一)——Nginx基础知识
目录 1.Nginx学习(一)--Nginx基础知识 2.Nginx学习(二)--配置文件.反向代理与负载均衡 3.Nginx搭建HTTPS服务器 一.初试Nginx 一.下载安装 1.安装必要的一些 ...
- Nginx基础配置实例需求分析
前面我们已经对Nginx服务器默认配置文件的结构和涉及的基本指令做了详细的阐述.通过这些指令的合理配置,我们就可以让一台Nginx服务器正常工作,并且提供基本的web服务器功能. 接下来我们将通过一个 ...
- Nginx 基础(一)
一 .Nginx简述 Nginx是一个开源.高性能.可靠的HTTP中间件.代理服务. 二 .常见的HTTP服务 1. HTTPD-Apache基金会 2. IIS-微软 3. GWS-Google 4 ...
最新文章
- sql获取一张表所有的字段_SQL语句19问
- 浅谈Spring框架注解的用法分析
- 咖啡馆的故事:FTP, RMI , XML-RPC, SOAP, REST一网打尽
- 必要商城高级UED经理张不写:设计师如何规划职业方向
- short s1 = 1; s1 = s1 + 1; 有错吗?short s1 = 1; s1 += 1 有错吗
- vscode / ubuntu 下编译和调试 C/C++ 方法
- HTML5怎么编辑另一个页面,html中嵌套iframe页面 如何将一个html页面中嵌入另一个html页面...
- 消息中间件ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ、Kafka如何选型
- IntelliJ IDEA2017 激活方法 最新的
- iOS9适配(包括APNs)的改变
- nullnullicon 小图标
- 老王讲设计模式(八)——适配器模式
- krpano音量控制(我们已经转移到krpano中国网站 krpano360.com)
- 三维点云数据处理软件供技术原理说明_三维点云处理软件需求说明
- 外卖红包小程序0基础搭建附教程+源码
- stata怎么画分类图_Stata怎么画直方图或折线图-Stata教程
- OA系统四级模块编写测试用例(角色模块)
- java graphics颜色_在Java Graphics对象中设置背景色
- 苹果审核团队_如何才能跟 App Store 审核团队有效沟通?
- crm管理系统是什么意思 crm系统全称是什么 - whale帷幄
热门文章
- Python中常见的语法糖
- onclick如何调用含参函数_在 golang 中如何调用私有函数(绑定隐藏的标识符)
- java库存导出_java生成导出excle文件
- hexo 菜单_Hexo 搭建个人博客教程 - 6 - 设置菜单,发布博客 - 2018
- 12c闪回 oracle_Oracle12.1闪回功能
- idea改成c盘_解决IDEA占用C盘空间过大的问题
- python odoo_odoo开发学习 -- Python2 or Python3 ?
- shell如何解决mysql交互式_shell脚本与mysql交互方法汇总
- 道java_请问这道java里的这几个语句是什么意思
- 圣地亚哥的计算机科学在哪个学院,加州大学圣地亚哥分校计算机科学在哪个学院?...