Nginx部署
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,能经受高负载的考验。
Nginx 下载
首先去nginx官网下载nginx的最新稳定版本,
地址:http://nginx.p2hp.com/en/download.html
这里下载最新稳定版本 nginx/Windows-1.22.0
Nginx 配置与部署
下载完成后解压到系统目录,如下图所示:
conf: 配置目录,核心配置为nginx.conf
html: 资源根目录,部署的资源都存放在该目录中
logs: 日志目录,access.log是请求访问日志文件,error.log是错误日志文件
运行nginx.exe,访问http://localhost:80,如果出现如下所示画面,则Nginx成功部署。
如果未出现上述画面,则可能nginx 默认配置的80端口被占用 ,Windows可以使用如下命令查询端口占用情况,“netstat -ano | findstr 80” 查询80端口是否占用,如被占用使用 " tasklist | findstr 4524" (ps: 4524是进程号)查看是哪个进程占用端口,如下图所示
此时可以编辑 nginx.conf 文件修改端口号如下图所示,将80端口改为8088端口。
运行nginx.exe,访问http://localhost:8088出现下图,则部署成功。
Nginx 配置文件
初始配置文件
#配置用户或者组,默认为nobody
#user nobody;
#允许生成的进程数,默认为1
worker_processes 1;
#日志路径、级别,级别依次为:debug|info|notice|warn|error|crit|alert|emerg
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
#最大连接数
worker_connections 1024;
}
http {
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型,默认为text/plain
default_type application/octet-stream;
#定义日志格式
#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 logs/access.log main;
#允许sendfile方式传输文件,默认为off
sendfile on;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
#监听端口
listen 80;
#监听地址
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#请求地址匹配,可以使用正则,~为区分大小写,~*为不区分大小写
location / {
#根目录,可使用绝对路径
root html;
#默认页
index index.html index.htm;
}
#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 servername{
server host 【optional】
}
其中 server 为关键字,host 为服务地址如:127.0.0.1:8088或www.baidu.com, 【optional】为可选项,如下所示:
down:当前server已停用
backup:当前server为备用服务器,只有在其它非backup状态服务无法提供服务时才会分配到请求。
weight:当前server负载权重,权重越大被请求几率越大。默认是1.
max_fails:最大出错次数, 默认为1,如果将max_fails设置为0,则表示取消这项检查。请求在一定时间内超过max_fails次未响应,server会被标记为down
fail_timeout: 故障等待超时时间, 默认为10s ,server被标记为down后在接下来的fail_timeout时间内不会再被请求。
在http模块定义一个updstream模块,模块名为webtest
upstream webtest {
server 127.0.0.1:8088;
server 127.0.0.1:8089 weight=2;
}
在server模块配置路径匹配模块,匹配上 /test 时,ng就会通过webtest进行负载。
location /test {
proxy_pass http://webtest;
proxy_set_header Host $host:$proxy_port;
index index.html index.htm;
}
ps : upstream支持5种分配方式,其中轮询、权重、ip_hash是nginx原生支持的方式,fair、url_hash需要第三方支持
1、轮询: upstream的默认分配方式,每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器状态为down,则自动排除。
upstream webtest {
server 127.0.0.1:8088;
server 127.0.0.1:8089;
}
2、(权重)weight: 指定轮询比率,weight和访问几率成正比
upstream webtest {
server 127.0.0.1:8088 weight=2;
server 127.0.0.1:8089 weight=3;
}
3、ip_hash:每个请求按照访问ip(前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。
upstream webtest {
ip_hash;
server 127.0.0.1:8088;
server 127.0.0.1:8089;
}
4、fair :公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。
upstream backend {
server 127.0.0.1:8088;
server 127.0.0.1:8089;
fair;
}
5、url_hash: 与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。
upstream backend {
server 127.0.0.1:8088;
server 127.0.0.1:8089;
hash $request_uri;
hash_method crc32; #使用算法
}
- location
语法:
location uri {
optionals; #内部属性如:root, index,proxy_pass
}
使用示例:
location /abc {
proxy_pass http://webtest;
proxy_set_header Host $host:$proxy_port;
index index.html index.htm;
}
其中location是关键字,uri为路由,可以使用正则,optionals 是内部属性。
uri正则语法:
/ :通用匹配,任何请求都会匹配到
= :用于不包含正则表达式的uri前,必须与指定的模式精确匹配
~ :用于表示当前uri中包含了正则表达式,并且区分大小写
~* :用于表示当前uri中包含了正则表达式,并且不区分大小写
^~ :用于不包含正则表达式的uri前,效果和不加符号的一致,唯一不同的是:如果模式匹配就停止搜索其他模式
. : 匹配除换行符以外的任意字符
$ :匹配字符串的结束
\w :匹配字母、数字、下划线或汉字
\s :匹配任意的空白符
\d :匹配数字
\b :匹配单词的开始或结束
^ :匹配字符串的开始
\W :匹配任意不是字母,数字,下划线,汉字的字符
\S :匹配任意不是空白符的字符
\D :匹配任意非数字的字符
\B :匹配不是单词开头或结束的位置
[^x] :匹配除了x以外的任意字符
* :重复零次或更多次
+ :重复一次或更多次
? :重复零次或一次
{n} :重复n次
{n,} :重复n次或更多次
{n,m} :重复n到m次
*? :重复任意次,但尽可能少重复
+? :重复1次或更多次,但尽可能少重复
?? :重复0次或1次,但尽可能少重复
{n,m}? :重复n到m次,但尽可能少重复
{n,}? :重复n次以上,但尽可能少重复
[^abc] :匹配除了abc这几个字母以外的任意字符
(exp) :匹配exp,并捕获文本到自动命名的组里
(?exp) :匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) :匹配exp,不捕获匹配的文本,也不给此分组分配组号
(?=exp) :匹配exp前面的位置
(?<=exp) :匹配exp后面的位置
(?!exp) :匹配后面跟的不是exp的位置
(?<!exp) :匹配前面不是exp的位置
optionals:
root : 根目录, 如 root html;
index :默认页,如 index index.html index.htm;
try_files :尝试请求的页面, 如 try_files $uri $uri/ /test2/index.html;
proxy_pass :代理路径, 如 proxy_pass http://webtest;
内置变量
-
$arg_name:请求中的的参数名,即url中?后面的param=value形式的param
-
$args:请求中的参数值
-
$binary_remote_addr:客户端地址的二进制形式, 固定长度为4个字节
-
$body_bytes_sent:传输给客户端的字节数,响应头不计算在内
-
$bytes_sent:传输给客户端的字节数
-
$connection:TCP连接的序列号
-
$connection_requests: TCP连接当前的请求数量
-
$content_length: 请求头字段 Content-Length
-
$content_type:请求头字段 Content-Type
-
$cookie_name:cookie名
-
$document_root:当前请求的文档根目录或别名
-
$document_uri:同 $uri
-
$host:HTTP请求行的主机名>HOST请求头字段>符合请求的服务器名
-
$hostname:主机名
-
$http_name: 匹配任意请求头字段; 如需获取Accept-Language ,只需将accept_language 替换name即可(请求头一律小写 - 替换为 _),例如: $http_accept_language
-
$http_referer :用来记录从那个页面链接访问过来的
-
$http_user_agent :记录客户端浏览器的相关信息
-
$http_x_forwarded_for
-
$https:如果开启了SSL安全模式,值为“on”,否则为空字符串
-
$is_args: 如果请求中有参数,值为“?”,否则为空字符串
-
$limit_rate: 用于设置响应的速度限制
-
$msec: 当前的Unix时间戳
-
$nginx_version: nginx版本
-
$pid: 工作进程的PID
-
$pipe: 如果请求来自管道通信,值为“p”,否则为“.”
-
$proxy_protocol_addr: 获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
-
$query_string: 同 $args
-
$realpath_root: 当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
-
$remote_addr: 客户端地址,可以用于记录ng代理时的内部真实路径
-
$remote_port: 客户端端口
-
$remote_user:用于HTTP基础认证服务的用户名(客户端用户名称)
-
$request:代表客户端的请求地址
-
$request_body:
-
客户端的请求主体,此变量可在location中使用,将请求主体通过proxy_pass, fastcgi_pass, uwsgi_pass, 和 scgi_pass传递给下一级的代理服务器
-
$request_body_file:
将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。开启此功能,只需设置client_body_in_file_only。如果将此文件传递给后端的代理服务器,需要禁用request body,即设置:
proxy_pass_request_body off
fastcgi_pass_request_body off
uwsgi_pass_request_body off
scgi_pass_request_body off -
$request_completion: 如果请求成功,值为OK,如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
-
$request_filename: 当前连接请求的文件路径,由root或alias指令与URI请求生成
-
$request_length: 请求的长度 (包括请求的地址, http请求头和请求主体)
-
$request_method: HTTP请求方法,通常为GET或POST
-
$request_time: 处理客户端请求使用的时间, 从读取客户端的第一个字节开始计时
-
$ request_uri: 包含一些客户端请求参数的原始URI,不包含主机名,例如:/a?param=value
-
$scheme: 协议, http 或 https
-
$ sent_http_name :可以设置任意http响应头字段,如:设置响应头Content-length,只需将content_length替换name即可(响应头一律小写 - 替换为 _),例如 $sent_http_content_length 4096
-
$server_addr: 服务器端地址
-
$server_name: 服务器名
-
$server_port:服务器端口
-
$server_protocol: 服务器的HTTP版本, 通常为 HTTP/1.0 或 HTTP/1.1
-
$status:HTTP响应代码
-
$time_iso8601:服务器时间的ISO 8610格式
-
$time_local: 服务器时间(LOG Format 格式)
-
$ uri:当前URI(不带请求参数,不带主机名,需要参数可以使用$args变量)