系统使用的是centos7html
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务linux
我是用的环境是centos 7,系统默认的yum源没有nginx,找到一个使用nginx官方源地址nginx
首先创建nginx的yum仓库,执行下面的命令git
sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
能够看到已经添加上了nginx的源,下面就是下载安装了web
下载安装命令也很简单面试
sudo yum install -y nginx
安装成功^_^正则表达式
查看官方安装文档(https://www.nginx.com/resources/wiki/start/topics/tutorials/install/)上的源不同,不过都是同样的创建本地yum仓库算法
启动nginx服务apache
service nginx start
默认是80端口,但测试访问发现并不能进入欢迎页面,查了一下,centos默认是关闭80端口的,咱们设置一下防火墙后端
开启80端口
sudo firewall-cmd --zone=public --permanent --add-service=http
开启443端口
sudo firewall-cmd --zone=public --permanent --add-service=https
必需要从新加载一下防火墙配置才行哦,下面咱们再来访问一下
完美。
默认的网站目录为: /usr/share/nginx/html
全局的配置文件为:/etc/nginx/nginx.conf
默认的配置文件为: /etc/nginx/conf.d/default.conf
日志文件目录为:/var/log/nginx/
咱们查看具体的配置文件内容,发现其实nginx.conf是主要的配置文件,新增的都在/etc/nginx/conf.d/,nginx.conf将整个目录的配置文件都include了
Nginx配置文件常见结构的从外到内依次是「http」「server」「location」等等,缺省的继承关系是从外到内,也就是说内层块会自动获取外层块的值做为缺省值。
http { #文件扩展名与文件类型映射表 include /etc/nginx/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 /var/log/nginx/access.log main; #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。若是用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,下降系统uptime。 sendfile on; #此选项容许或禁止使用socket的TCP_CORK的选项,此选项仅在使用sendfile的时候使用 #tcp_nopush on; #长链接超时时间,单位是秒 keepalive_timeout 65; #开启gzip压缩输出 #gzip on; #导入其余配置 include /etc/nginx/conf.d/*.conf; }
整个配置文件结构其实大概是这样的
http { #全局的配置 ………… server{ #虚拟主机的配置 ………… location { #每一个请求的处理,如请求转发、静态文件映射、负载均衡等 ………… } } }
下面再具体了解一下每一层的配置
接收请求的服务器须要将不一样的请求按规则转发到不一样的后端服务器上,在 nginx 中咱们能够经过构建虚拟主机(server)的概念来将这些不一样的服务配置隔离。不一样的url会对应不一样的server配置,而转发到相应的后端服务器上作处理。
server { listen 80; #服务监听端口 server_name localhost; #服务的域名或IP root html; #指定服务的页面根目录 index index.html index.htm; #指定访问的默认首页地址 }
一般咱们能够配置多个server,像这样
server { listen 80; server_name host1; root html; index index.html index.htm; } server { listen 80; server_name host2; root /data/www/html; index index.html index.htm; }
咱们能够将不一样的服务在/etc/nginx/conf.d/目录下建立相应的conf以区分,方便管理,而nginx.conf会将这个目录下的conf所有引入的。
每一个 url 请求都会对应的一个服务,nginx 进行处理转发或者是本地的一个文件路径,或者是其余服务器的一个服务路径。而这个路径的匹配是经过 location 来进行的。咱们能够将 server 当作对应一个域名进行的配置,而 location 是在一个域名下对更精细的路径进行配置。
location [匹配规则] { #具体处理配置,如转发、反向代理、负载均衡等 }
location 匹配规则:
~ 波浪线表示执行一个正则匹配,区分大小写 ~* 表示执行一个正则匹配,不区分大小写 ^~ ^~表示普通字符匹配,若是该选项匹配,只匹配该选项,不匹配别的选项,通常用来匹配目录 = 进行普通字符精确匹配
匹配例子:
location = / { # 只匹配"/". [ configuration A ] } location / { # 匹配任何请求,由于全部请求都是以"/"开始 # 可是更长字符匹配或者正则表达式匹配会优先匹配 [ configuration B ] } location ^~ /images/ { # 匹配任何以 /images/ 开始的请求,并中止匹配 其它location [ configuration C ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配以 gif, jpg, or jpeg结尾的请求. # 可是全部 /images/ 目录的请求将由 [Configuration C]处理. [ configuration D ] } 请求: / -> 符合configuration A /documents/document.html -> 符合configuration B /images/1.gif -> 符合configuration C /documents/1.jpg ->符合 configuration D
主要的功能配置都是在location里面的,下面咱们来学习不一样功能的配置方法
访问文件的配置主要有 root 和 alias
alias后跟的指定目录是准确的,而且末尾必须加 /。
location /c/ { alias /a/; }
若是访问站点http://location/c访问的就是/a/目录下的站点信息。
root后跟的指定目录是上级目录,而且该上级目录下要含有和location后指定名称的同名目录才行。
location /c/ { root /a/; }
这时访问站点http://location/c访问的就是/a/c目录下的站点信息。
配置起来很简单好比我要将全部的请求到转移到真正提供服务的一台机器的 8001 端口,只要这样:
location / { proxy_pass 172.16.1.1:8001; }
这样访问host时,就都被转发到 172.16.1.1的8001端口去了。
#负载均衡服务器列表配置在http下面 upstream myserver { ip_hash; server 172.16.1.1:8001; server 172.16.1.2:8002; server 172.16.1.3; server 172.16.1.4; } location / { proxy_pass http://myserver; }
咱们在 upstream 中指定了一组机器,并将这个组命名为 myserver,这样在 proxypass 中只要将请求转移到 myserver 这个 upstream 中咱们就实现了在四台机器的反向代理加负载均衡。
轮询:默认模式,每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端服务器down掉,能自动剔除。
weight:指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的状况。
upstream bakend { server 192.168.0.14 weight=10; server 192.168.0.15 weight=10; }
ip_hash:每一个请求按访问ip的hash结果分配,这样每一个访客固定访问一个后端服务器,能够解决session的问题。
upstream bakend { ip_hash; server 192.168.0.14:88; server 192.168.0.15:80; }
fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend { server server1; server server2; fair; }
url_hash:按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
#例:在upstream中加入hash语句,server语句中不能写入weight等其余的参数,hash_method是使用的hash算法 upstream backend { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
每一个设备的状态设置为: 1.down表示单前的server暂时不参与负载 2.weight为weight越大,负载的权重就越大。 3.max_fails:容许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误 4.fail_timeout:max_fails次失败后,暂停的时间。 5.backup: 其它全部的非back
up机器down或者忙的时候,请求backup机器。因此这台机器压力会最轻。
upstream bakend{#定义负载均衡设备的Ip及设备状态}{ ip_hash; server 127.0.0.1:9090 down; server 127.0.0.1:8080 weight=2; server 127.0.0.1:6060; server 127.0.0.1:7070 backup; }
默认咱们访问不存在的页面时,报错页面上会有nginx的版本信息,这会向黑客提供信息,以方便查找当前版本的漏洞,加以利用
修改ngixn.conf,http层里面添加server_tokens off;
咱们访问不存在的页面试一下
这样没有版本信息了
默认是不容许列出整个目录的,若是不是作下载服务器的,就不要打开这个,避免敏感信息暴露给黑客并下载
若是开启了就会是下面这样的效果
配置关闭便可
autoindex off
有些资源咱们可能不想对外开放,好比一些版本控制的备份文件,如.git/.svn等,这些暴露了可能会将整个项目的结构或是源代码都泄露了,
location /my/ { deny all; }
上面我设置了my这个目录下的全部资源都拒绝,效果以下
因此要识别好公开的资源,限制敏感资源的访问
关闭不必的请求方法,通常都是get|post了
下面配置在server里面,预期以外的会返回500状态
if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 500; }
这个要放到最前面
ngx_http_access_module 模块使有可能对特定IP客户端进行控制. 规则检查按照第一次匹配的顺序
location ~ .*my.html$ { root /usr/share/nginx/html; deny 192.168.0.105; #禁止ip allow 192.168.189.134; #容许ip deny all; #拒绝其余全部 }
限制访问的ip,即限制了服务的客户,防止不容许的人访问,减小风险
能够缓解dos攻击,避免黑客伪造用户访问服务,形成服务器压力过大,带宽占满,备份nginx.conf配置文件。
编辑配置文件,具体设置以下:
client_body_timeout 10; #设置客户端请求主体读取超时时间 client_header_timeout 10; #设置客户端请求头读取超时时间 keepalive_timeout 5 5; #第一个参数指定客户端链接保持活动的超时时间,第二个参数是可选的,它指定了消息头保持活动的有效时间 send_timeout10; #指定响应客户端的超时时间
验证一下设置
避免错误页面提供敏感信息,通常咱们会定制一些通用的错误页面返回给客户端
咱们在http段配置
error_page 500 502 503 504 /50x.html;
相似上面这种配置,将状态码500、50二、50三、504所有重定向到50x.html
若是发生入侵,获取了当前运行nginx的用户,则拥有该用户的全新了,咱们应当使用最下权限运行ngixn,绝对禁止root用户运行!!!
备份nginx.conf配置文件。
编辑配置文件,添加以下一行内容:
user nobody;
保存,而后后重启nginx服务。
说明:nobody在linux中是一个不能登录的账号,一些服务进程如apache,aquid等都采用一些特殊的账号来运行,好比nobody,news,games等等,这是就能够防止程序自己有安全问题的时候,不会被黑客得到root权限