1、前言
关于Nginx的介绍网上有很多的文章,总结来说Nginx是一个高性能的http和反向代理web服务器,一般经常用于web网站的反向代理和负载均衡操作,以及进行静态文件的处理操作。
本文只是对自己学习到的内容的总结,会随着使用过程对遇到的问题进行补充说明。
2、Nginx的下载、安装
Nginx下载地址:Nginx下载
根据自己的系统,选择稳定版下载即可,如下图:
下载后解压即可。
3、Nginx的简单配置
解压文件以后,打开文件夹中的conf文件夹,即可看到nginx.conf文件,Nginx的常用配置都放置在该文件中,接下来就对文件中的配置进行介绍:
# user用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
#user nobody;
# worker_processes指定nginx要开启的子进程数量
worker_processes 1;
# error_log定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# pid用来指定进程id的存储文件的位置
#pid logs/nginx.pid;
events {
# worker_connections 指定最大可以同时接收的连接数量;注意,最大连接数量是和worker;
# 注意,最大连接数量是和worker processes共同决定的。
worker_connections 1024;
}
http {
# include用于指定当前的配置文件中包含的另一个文件的指令
# mime.types文件中存储文件扩展名与文件类型的映射,从而提示浏览器来根据文件类型进行处理
include mime.types;
# default_type指定默认处理的文件类型
# 这个类型会让浏览器认为响应是普通的文件流,并提示用户下载
default_type application/octet-stream;
# log_format 自定义日志格式
# $remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址
# $remote_user :用来记录客户端用户名称
# $time_local : 用来记录访问时间与时区;
# $request : 用来记录请求的url与http协议;
# $status : 用来记录请求状态;
# $body_bytes_s ent :记录发送给客户端文件主体内容大小;
# $http_referer :用来记录从那个页面链接访问过来的
# $http_user_agent :记录客户端浏览器的相关信息
#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 设置存储访问记录的日志,日志格式为上述定义的格式,名为【main】
#access_log logs/access.log main;
# sendfile 设置为on表示允许使用sendfile方式来传输文件,sendfile:进行文件传输的方式
sendfile on;
# 设置为on让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发
#tcp_nopush on;
# keepalive_timeout给客户端设置连接超时时间,服务器会在过了这个时间以后关闭连接,一般设置较短,单位:s;默认即可
# 如果设置为0表示禁用keepalive
#keepalive_timeout 0;
keepalive_timeout 65;
# 设置为on表示nginx采用gzip压缩的形式发送数据。
#gzip on;
# 进行服务器访问信息的配置,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息,一个http中可以有多个server
server {
# 监听的端口
listen 80;
# 监听的地址
server_name localhost;
# 编码方式
#charset koi8-r;
# 用于指定该虚拟主机服务器中的访问记录日志存放路径
#access_log logs/host.access.log main;
# 进行访问路由的控制,以及各种页面的情况,"/"表示匹配访问根目录
location / {
# 根目录
root html;
# 不指定访问的具体资源时,默认展示的资源文件列表
index index.html index.htm;
# deny 拒绝的ip
#deny 127.0.0.1; #拒绝的ip
# allow 允许的ip
#allow 172.18.5.54; #允许的ip
}
# 设置error_page页面,根据状态码进行响应
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_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;
# }
#}
# upstream进行负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器
upstream servers {
# server分发服务器的列表配置
server 127.0.0.1:8848;
server 127.0.0.1:8849;
}
server {
listen 8888;
server_name 127.0.0.1;
location / {
proxy_pass http://servers ;
# 用于在浏览器端可以看到所调用的服务地址
add_header backendIP $upstream_addr;
}
}
}
配置完以上的内容以后即可以进行反向代理测试。
4、Nginx的常用命令
启动Nginx :start nginx(在nginx所在的文件夹下)
关闭Nginx:nginx -s stop
重启Nginx:nginx –s reload
检查配置文件:nginx -t
5、location常用的路由匹配规则
在上述的配置文件中,location用于配置进行匹配的URL,即ngnix中的$request_uri变量;proxy_pass配置用于转发URL。location的匹配顺序有以下几种:
1、location = /uri # =号开始精准匹配,只有完全匹配才生效
2、location ^~ /uri # ^~ 开头对URL路径进行前缀匹配,并且在正则之前
3、location ~ pattern # ~开头表示区分大小写的正则匹配
4、location ~* pattern # ~*开头表示不区分大小写的正则匹配
5、location /uri # 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后,如果没有正则命中,命中最长的规则。
6、location / # 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。
几种规则的顺序:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
location与proxy_pass代理规则:
location是否以"/"结尾
没有"/": 模糊匹配 location/abc/def可以匹配/abc/defghi请求,也可以匹配/abc/def/ghi等
有"/": 精确匹配 location/abc/def/不能匹配/abc/defghi请求,只能匹配/abc/def/anything这样的请求
在nginx中配置proxy_pass时,proxy_pass是否以"/"结尾:
有"/": 相当于是绝对路径,则nginx不会把location中匹配的路径部分加入代理uri;
没有"/": 则会把匹配的路径部分加入代理uri
举例说明:
server {
listen 8648;
server_name 127.0.0.1;
location /app1 {
proxy_pass http://127.0.0.1:8888/;
add_header backendIP $upstream_addr;
}
}
# 当请求 http://127.0.0.1:8648/app1/xxx相当于请求http://127.0.0.1:8888/xxx
如果location改为如下:
location /app1 {
proxy_pass http://127.0.0.1:8888;
add_header backendIP $upstream_addr;
}
# 当请求 http://127.0.0.1:8648/app1/xxx相当于请求http://127.0.0.1:8888/app1/xxx