1、必要软件准备
为了支持 rewrite功能,我们需要安装pcre
# yum install pcre* //如过你已经装了,请跳过这一步
需要ssl的支持,如果不需要ssl支持,请跳过这一步
# yum install openssl*
2、安装nginx
此处不说明,百度查详细步骤参考:https://blog.csdn.net/tengxing007/article/details/61615234
3、 启动、关闭、重置nginx
启动:直接执行以下命令,nginx 就启动了,不需要改任何配置文件,nginx 配置多域名虚拟主机请参考后续
/usr/local/nginx-1.5.1/sbin/nginx
试试访问:直接使用 curl 命令来读取 web 信息
# curl -s http://localhost | grep nginx.com nginx.com.
关闭:
/usr/local/nginx-1.5.1/sbin/nginx -s stop
重置:当你有修改配置文件的时候,只需要 reload 以下即可
/usr/local/nginx-1.5.1/sbin/nginx -s reload
整个 nginx 的安装就到这里结束了。
1、nginx 编译参数详解
由于参数太多,请参考:http://www.ttlsa.com/nginx/nginx-configure-descriptions/
2、内核参数优化
# vi sysctl.conf
增加以下配置 ,参数详解:https://www.cnblogs.com/Jtianlin/p/4339931.html
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1800
net.ipv4.ip_conntrack_max = 16777216 # 如果使用默认参数,容易出现网络丢包
net.ipv4.netfilter.ip_conntrack_max = 16777216# 如果使用默认参数,容易出现网络丢包
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries =
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.ip_local_port_range = 1024 65535
配置生效
# sysctl –p
修改 iptables 启动脚本,在 star()函数里面加上
# vi /etc/init.d/iptables
/sbin/sysctl -p
3、 nginx.conf配置文件参数说明
下面通过一个简单的例子,来实现一个域名站点访问
(1)先进行nginx.conf文件的配置
# vi nginx.conf
user nobody nobody; # 运行 nginx 的所属组和所有者
worker_processes 2; # 开启两个 nginx 工作进程,一般几个 CPU 核心就写几
error_log logs/error.log notice; # 错误日志路径
pid logs/nginx.pid; # pid 路径
events {
worker_connections 1024; # 一个进程能同时处理 1024 个请求
}
http {
include mime.types;
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 on; keepalive_timeout 65; # keepalive 超时时间
# 开始配置一个域名,一个 server 配置段一般对应一个域名
server {
listen 80; # # 在本机所有 ip 上监听 80,也可以写为 192.168.253.129:80,这样的话,就只监听 192.168.253.129 上的 80 口
server_name www.myweb.com; # 域名,可以写多个
root /www/html/www.myweb.com; # 站点根目录(程序目录)
index index.html index.htm; # 索引文件
location / { # 可以有多个 location
root /www/html/www.myweb.com; # 站点根目录(程序目录)
}
error_page 500 502 503 504 /50x.html;
# 定义错误页面,如果是 500 错误,则把站点根目录下的 50x.html 返回给用户
location = /50x.html {
root /www/html/www.myweb.com;
}
}
}
(2)、nginx重启使配置生效
# ./sbin/nginx -t
# ./sbin/nginx -s reload
(3)、创建服务器本地文件
# mkdir -p /www/html/www.myweb.com
# touch index.html
# echo “welcome to my website!” > /www/html/www.myweb.com/index.html
(4)、绑定hosts测试
把域名指向 192.168.253.129 www.myweb.com
打开 www.myweb.com,如下图:
3、 nginx日志参数说明
ngx_http_core_module 模块在处理请求时,会有大量的变量,这些变量可以通过访问日志来记录下来,也可以用于其它 nginx 模块。在我们对请求做策略如改写等等都会使用到一些变量,顺便对ngx_http_core_module 模块提供的变量总结 了下,如下所示:
本文总结了 nginx 日志相关的配置如 access_log、log_format、 open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log。
nginx 有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过 log_format 命令来定义。ngx_http_log_module 是用来定义请求日志格式的 。
1. access_log指令
语法: access_log path [format [buffer=size [flush=time]]];
access_log path format gzip[=level] [buffer=size] [flush=time];
access_log syslog:server=address[,parameter=value] [format];
access_log off;
默认值: access_log logs/access.log combined;
配置段: http, server, location, if in location, limit_except
gzip 压缩等级。
buffer 设置内存缓存区大小。
flush 保存在缓存区中的最长时间。
不记录日志:access_log off;
使用默认 combined 格式记录日志:access_log logs/access.log 或 access_log logs/access.log combined;
2. log_format指令
语法: log_format name string …;
默认值: log_format combined “…”;
配置段: http
name 表示格式名称,string 表示等义的格式。log_format 有一个默认的无需设置的 combined 日志格式,相当于 apache 的 combined 日志格式,如下所示:
log_format combined '$remote_addr - $remote_user [$time_local] '
' "$request" $status $body_bytes_sent '
' "$http_referer" "$http_user_agent" ';
如果 nginx 位于负载均衡器,squid,nginx 反向代理之后,web 服务器无法直接获取到客户端真实的 IP 地址了。 $remote_addr 获取反向代理的 IP 地址。反向代理服务器在转发请求的 http 头信息中,可以增加 X-ForwardedFor 信息,用来记录 客户端 IP 地址和客户端请求的服务器地址。PS: 获取用户真实 IP 参见 http://www.ttlsa.com/html/2235.html 如下所示:
log_format porxy '$http_x_forwarded_for - $remote_user [$time_local] '
' "$request" $status $body_bytes_sent '
' "$http_referer" "$http_user_agent" ';
日志格式允许包含的变量注释如下:
$remote_addr, $http_x_forwarded_for 记录客户端 IP 地址
$remote_user 记录客户端用户名称
$request 记录请求的 URL 和 HTTP 协议
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与 Apache 模块 mod_log_config 里的 “%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection 连接的序列号。
$connection_requests 当前通过一个连接获得的请求数量。
$msec 日志写入时间。单位为秒,精度是毫秒。
$pipe 如果请求是通过 HTTP 流水线(pipelined)发送,pipe 值为“p”,否则为“.”。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送 给客户端后进行日志写入为止。
$time_iso8601 ISO8601 标准格式下的本地时间。
$time_local 通用日志格式下的本地时间。
3. open_log_file_cache指令
语法: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
默认值: open_log_file_cache off;
配置段: http, server, location
对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用 open_log_file_cache 来设置日志 文件缓存(默认是 off),格式如下: 参数注释如下
max:设置缓存中的最大文件描述符数量,如果缓存被占满,采用 LRU 算法将描述符关闭。
inactive:设置存活时间,默认是 10s
min_uses:设置在 inactive 时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是 1 次
valid:设置检查频率,默认 60s
off:禁用缓存
实例如下:
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
4. log_not_found指令
语法: log_not_found on | off;
默认值: log_not_found on;
配置段: http, server, location
是否在 error_log 中记录不存在的错误。默认是
5. log_subrequest指令
语法: log_subrequest on | off;
默认值: log_subrequest off;
配置段: http, server, location
是否在 access_log 中记录子请求的访问日志。默认不记录。
6. rewrite_log指令
由 ngx_http_rewrite_module 模块提供的。用来记录重写日志的。对于调试重写规则建议开启。
语法: rewrite_log on | off;
默认值: rewrite_log off;
配置段: http, server, location, if
启用时将在 error log 中记录 notice 级别的重写日志。
7. error_log指令
语法: error_log file | stderr | syslog:server=address[,parameter=value] [debug | info | notice | warn | error | crit | alert | emerg];
默认值: error_log logs/error.log error;
配置段: main, http, server, location
配置错误日志
8. 日志切割
nginx 日志默认情况下统统写入到一个文件中,文件会变的越来越大,非常不方便查看分析。以日期来作为日志的切割 是比较好的,通常我们是以每日来做统计的。下面来说说 nginx 日志切割。
1. 定义日志轮滚策略
# vim nginx-log-rotate
/data/weblogs/*.log {
nocompress
daily
copytruncate
create
notifempty
rotate 7
olddir /data/weblogs/old_log
missingok
dateext
postrotate
/bin/kill -HUP `cat /var/run/nginx.pid 2> /dev/null` 2> /dev/null || true
endscript
}
[warning]/data/weblogs/*.log 使用通配符时,/data/weblogs/目录下的所有匹配到的日志文件都将切割。如果要切割特定日志文件,就指定到该文件。[/warning]
2. 设置计划任务
# vim /etc/crontab
59 23 * * * root ( /usr/sbin/logrotate -f /PATH/TO/nginx-log-rotate)
这样每天 23 点 59 分钟执行日志切割。
所谓的代理就是一个代表、渠道。代理又涉及到2个角色被代理角色
和目标角色(代理对象)
。比如用户去耐克专卖店买鞋,那么专卖店就是代理
,被代理角色
是耐克厂家,代理对象就是用户。
正向代理
假设我现在需要去访问facebook,但是由于墙的问题我无法访问。此时大家可能都会用一个操作FQ(番羽 土啬)进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!
上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址
;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息
。
反向代理
明白了什么是正向代理,我们继续看关于反向代理的处理方式,举例如我大天朝的某宝网站,每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用nginx进行反向代理实现的。那么反向代理具体是通过什么样的方式实现的分布式的集群操作呢,我们先看一个示意图:
通过上述的图解大家就可以看清楚了,多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确
的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器
的信息!
--代理信息来源(https://www.jianshu.com/p/79dbbf5e3a63)
前面第二章的nginx.conf配置文件参数说明这节里举的例子就是一个反向代理的简单例子,实际应用中反向代理用的比较多。
那么为什么要使用代理
1)提高访问速度 由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门站点能明显提高请求速度。
2)防火墙作用 由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可在代理服务器上设限,过滤某些不安全信息。
3)通过代理服务器访问不能访问的目标站点 互联网上有许多开发的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问目标站点,通俗说,我们使用的浏览器就是利用了代理服务器,虽然不能出国,但也可直接访问外网。
下面来总结一下两者的特性:
1、安全性
正向代理的客户端能够在隐藏自身的同时访问任意网站,这给网络安全带来了极大的威胁。因此,在使用时必须采取安全的措施,以确保仅为经过授权的客户端提供服务。而反向代理的客户端只能通过外网访问代理服务器,并且用户不知道自己访问的是一个代理服务器,好处就是反向代理将真正的处理放在内网中,有效的提高了网络安全。
2、功能性
正向代理的主要用途是为在防火墙内的局域网用户提供访问Internet的途径。而反向代理是将防火墙后的服务器提供给Internet用户访问,还可以为多个后端服务器提供负载均衡、缓存功能等。
========================持续更新======================