Nginx Web服务器教程
1、Nginx Web 入门简介
Nginx是一个高性能HTTP、反向代理、IMAP、POP3、SMTP服务器
Nginx特点:高性能、轻量级、占有内存少、并发能力强
Nginx相对于Apache优点如下:
- 高并发相应性能非常好,官方nginx处理静态文件并发5w/s
- 负载均衡及反向代理性能非常强
- 系统内存和cpu占用率低
- 可对后端服务进行健康检查
- 支持PHP CGI 方式和 FastCGI 方式
- 可以作为缓存服务器、邮件代理服务器
- 配置代码简洁且容易上手
2、Nginx工作原理
nginx web 服务器主要是有各种模块协同工作,从结构上分为核心模块、基础模块、第三方模块
核心模块:http模块、event模块和mail模块
基础模块:http access模块、http fastcgi模块、http proxy模块和http rewrite模块
第三方模块:http upstream request hash模块、notice模块和http access key 模块、limit\_req模块等
从功能上分为三类:
handlers(处理模块):直接处理请求,并进行输出内容和修改headers信息等操作,handlers处理器模块一般只有一个
files(过滤器模块):主要对其他处理器模块输出的内容进行修改操作,最后由nginx输出、
proxies(代理模块):是nginx的http upstream之类模块,这些模块主要与后端一些服务比如fastcgi等进行交互,实现服务代理和负载均衡
Nginx的高并发得益于采用的epoll模型
Apache采用的select模型
select模型的特点: 当用户发起一次请求,select模型会进行一次遍历扫描,因此效率低下
epoll模型的特点:当用户发起请求,epoll模型会直接进行处理,效率高,并无连接限制
3、nginx应用场景
静态服务:浏览器缓存 ,防资源
html|jpg|png......
代理服务:
正向代理:内访外
反向代理:外访内,和负载均衡是一样,但是工作方式有区别
负载均衡:
安全服务:
访问控制:
基于IP的
基于身份认证
访问限制
WAF
云waf
硬件waf
DDOS攻击
CC攻击
SQL注入
。。。
nginx+lua
架构
LNMP
Linux Nginx Mysql Php
LNMT
Linux Nginx Mysql Tomcat
4、Nginx安装
1)EPEL源
版本低,功能少
2)官方源
官方编译好,封装rpm包,并提供yum源,推荐
3)源代码
自己下载源代码,使用configure/make/make install
安装复杂费时,升级麻烦
1、配置nginx官方yum库,安装官方nginx
[root@localhost ]# vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
直接安装yum install nginx,安装最新的版本的nginx
yum --showduplicates list nginx | expand
![Nginx Web服务器教程](https://www.icode9.com/i/l/?n=20&i=blog/1328126/202012/1328126-20201223191334414-1913353462.png)
选择对应的版本进行安装
例如选择版本是1.6.0的,
[root@localhost yum.repos.d]# yum install nginx-1.16.0
安装完成后,检验安装版本
[root@localhost yum.repos.d]# nginx -v
nginx version: nginx/1.16.0
2、\[root@localhost yum.repos.d\]# rpm -ql nginx
Nginx主配置文件
/etc/nginx
/etc/nginx/nginx.conf
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
Cgi、Fastcgi、Uwcgi配置文件
/etc/nginx/fastcgi\_params
/etc/nginx/scgi\_params
/etc/nginx/uwsgi\_params
Nginx编码转换映射文件
/etc/nginx/koi-utf
/etc/nginx/win-utf
/etc/nginx/koi-win
http协议的Content-Type与扩展名
/etc/nginx/mime.types
配置系统守护进程管理器
/usr/lib/systemd/system/nginx.service
Nginx日志轮询,日志切割
/etc/logrotate.d/nginx
Nginx终端管理命令
/usr/sbin/nginx
/usr/sbin/nginx-debug
Nginx模块命令
/etc/nginx/modules
/usr/lib64/nginx
/usr/lib64/nginx/modules
Nginx默认站点目录
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
Nginx的帮助手册
/usr/share/doc/nginx-1.16.0
/usr/share/doc/nginx-1.16.0/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
Nginx的缓存目录
/var/cache/nginx
Nginx的日志目录
/var/log/nginx
3、官方源nginx带的编译选项
[root@localhost yum.repos.d]# nginx -V
nginx version: nginx/1.16.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx
--sbin-path=/usr/sbin/nginx
--modules-path=/usr/lib64/nginx/modules
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock #程序安装目录合路径
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp #临时缓存文件
--user=nginx
--group=nginx #设置Nginx进程启动用户和组
--with-compat
--with-file-aio
--with-threads
--with-http_addition_module
--with-http_auth_request_module
--with-http_dav_module
--with-http_flv_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_mp4_module
--with-http_random_index_module
--with-http_realip_module
--with-http_secure_link_module
--with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' #设置额外的参数将被添加到CFLAGS变量
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' #设置附加的参数,链接系统库
如果企业之前的Nginx都是通过源码安装,只需要通过nginx -V查看编译选项,部署新的服务器,获得版本号,configure选项
5、Nginx配置文件
-----------
Nginx主配置文件 /etc/nginx/nginx.conf 是一个纯文本类型的文件,整个配置文件是以区块的形式组织的,一般,每个区块以一对大括号{}来表示开始与结束。
1、CoreModule 核心模块 全局模块
2、EventModule 事件驱动模块
3、HttpCoreModule http内核模块 局部模块
需了解扩展项
CoreModule层下可以有Event、http
http模块层允许有多个Server层,Server主要用于配置多个网站
Server层又允许有多个Location,Location主要用于定义网站访问路径#CoreModule核心模块:
user nginx; #Nginx进程所使用的用户
worker_processes 1; #Nginx运行的work进程数量(建议与cpu数量一致或auto)
error_log /var/log/nginx/error.log warn; #Nginx错误日志存放路径
pid /var/run/nginx.pid; #Nginx服务运行后产生的pid进程号
Event模块
events {
worker_connections 1024; #每个worker进程支持的最大连接数<br></br> use epool; #事件驱动模型,epool默认,<br></br>
}
http内核模块
#公共的配置定义在http{}
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 on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;<br></br> #使用server配置网站,每个server{}代表一个网站(简称虚拟主机)<br></br> server {<br></br> listen 80; #监听端口,默认80<br></br> server_name localhost; #提供服务的域名或主机名<br></br> access_log host.access.log; #访问日志<br></br> #控制网站访问路径<br></br> location / {<br></br> root /usr/share/nginx/html; #存放网站代码路径<br></br> index index.php index.html index.htm; #服务器返回的默认页面文件<br></br> }<br></br> #指定错误代码,统一定义错误页面,错误代码重定向到新的location<br></br> error_page 500 502 503 504 /50x.html<br></br><br></br> }
include /etc/nginx/conf.d/*.conf;
}
### 6、Nginx配置网站
1、在/etc/nginx/conf.d/下新建配置文件,要求一定是.conf结尾,然后将默认文件关闭
[root@localhost ]# cd /etc/nginx/conf.d/
[root@localhost conf.d]# mv default.conf default.conf.bak
[root@localhost conf.d]# vim game.conf
server {
listen 80;
server_name game.com;
location / {
root /home/wwwroot/gms;
index index.php;
}
}
配置完,进行语法测试
[root@localhost conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
2、获取网页代码
[root@localhost ~]# cd /home
[root@localhost home]# mkdir wwwroot/ -p
将后台代码上传职wwwroot下
3、启动或重载nginx
systemctl restart nginx / systemctl reload nginx
4、通过域名访问,要修改windows的本地hosts文件
C:\\Windows\\System32\\drivers\\etc
gmsip 域名
有可能出现的错误:
1)解析问题
2)nginx无法启动
端口是否被占用
配置文件写错
3)重载失败
配置文件写错了
一定检测nginx -t
4)日志
### 6、Nginx目录索引
Nginx默认是不允许列出整个目录浏览下载
Syntax: **autoindex** `on` | `off`;
Default: autoindex off;
Context: `http`, `server`, `location`
**\#autoindex常用参数**
autoindex\_exact\_size off;
默认为 on,显示出文件的确切大小,单位bytes;
修改为off,显示出文件的大概大小,单位是kB或MB或GB
autoindex\_localtime on;
默认为off,显示的文件时间为GMT时间。
修改为on,显示的文件时间为文件的服务器时间。
charset utf-8,gbk;
默认中文目录乱码,添加上解决乱码
例如:
1、当我们访问game.com时,打开首页
2、当我们访问game.com/gms时,会打开目录索引列表
在conf.d下修改ame.conf
server {
listen 80;
server_name game.com;
location / { #访问http://game.com时,跳转导服务器/gms_sz下,寻找index.html
root /home/wwwroot/gms_sz;
index index.php index.html;
}
location /gms { #访问http://game.com/gms时,跳转到wwwroot/gms下,开启目录索引防止中文乱码,使用文件自己的时间戳,文件大小以单位的方式显示
root /home/wwwroot;
# index index.php index.html;
#autoindex on;
charset utf-8;
}
}
### 7、Nginx状态监控
1、ngx\_http\_stub\_status\_module 用于展示Nginx连接状态信息,需要 --with-http\_stub\_status\_module模块支持
语法:
Syntax:**stub\_status**;
Default:—
Context:`server`, `location`
2、配置Nginx status
location /nginx\_status {
stub\_status;
access\_log off; #关闭访问日志
}
3、当使用浏览器访问http://ip/nginx\_status
Active connections: 2
server accepts handled requests
34 34 66
Reading: 0 Writing: 1 Waiting: 1
Active connections #当前活动连接数
accepts 34 #当前的总连接数TCP
handled 34 #成功的连接数TCP
requests 64 #总的http请求数
Reading #请求
Writing #响应
Waiting #等待的请求,开启了keepalive
#注意,一次Tcp的连接数,可以发起多次http的请求,如下配置参数可验证
keepalive_timeout 0; #类似于关闭长连接
keepalive_timeout 65; #65 s没有活动则断开连接
注意:
如果使用restart重置服务器,会清空所有的连接数
reload重载服务器,不会清空之前的连接数
通过状态监控,可以区分长连接和短链接
修改vim /etc/nginx/nginx.conf下
keepalive_timeout 0; #将长连接变为短链接
8、Nginx访问控制
基于ip的访问控制 http_access_module
1、Nginx基于IP的访问控制
//允许配置语法
Syntax:allow `
address |
CIDR |
unix: |
all;<br></br> Default:-<br></br> Context:
http,
server,
location,
limit_except
//拒绝配置语法<br></br> Syntax:<strong>deny</strong> ```
<em>address</em>
``` | ```
<em>CIDR</em>
``` | ```
unix:
``` | ```
all
```;<br></br> Default:—<br></br> Context:```
http
```, ```
server
```, ```
location
```, ```
limit_except
访问控制规则查看流程:
从上往下,依次匹配,满足就停止
企业中反问控制的思路:
先写允许,默认拒绝所有
先写拒绝,默认允许所有
例:
只允许allow ip 访问nginx\_status,其它都拒绝访问
2、基于用户登录认证 http_auth_basic_module<br></br><br></br> //配置语法:<br></br> Syntax:<strong>auth_basic</strong> ```
<em>string</em>
``` | ```
off
```;<br></br> Default:auth_basic off;<br></br> Context:```
http
```, ```
server
```, ```
location
```, ```
limit_except<br></br> //用户密码记录配置文件<br></br> Syntax: <strong>auth_basic_user_file</strong> `<em>file</em>`;<br></br> Default: —<br></br> Context: `http`, `server`, `location`, `limit_except<br></br><br></br><br></br> //需要安装依赖组件`<br></br>
[root@localhost nginx]# yum install httpd-tools
[root@localhost nginx]# htpasswd -b -c /etc/nginx/.auth.conf cm 123456
vim /etc/nginx/conf.d/game.conf
location /gms {
root /home/wwwroot;
index index.php index.html;
#autoindex on;
charset utf-8;
auth_basic "don't test!!!";
auth_basic_user_file /etc/nginx/.auth.conf; #和htpasswd -b -c /etc/nginx/.auth.conf cm 123456对应
}
然后重载nginx测试:
<img alt="Nginx Web服务器教程" src="https://www.icode9.com/i/l/?n=20&i=blog/1328126/202101/1328126-20210105201400123-330931343.png"></img>
9、Nginx访问限制<br></br>
经常会遇到这种情况,服务器流量异常,负载过大等等,对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个IP的连接数,并发数进行限制<br></br><br></br>ngx_http_limit_conn_module 模块可以根据定义的key来限制每个键值的连接数,如同一个IP来源的连接数。<br></br>limit_conn_module 连接频率限制<br></br>limit_req_module 请求频率限制<br></br><strong><br></br><br></br></strong>
变量:<br></br>$binary_remote_addr 变量的长度是固定的4字节<br></br>$remote_addr 变量长度是7-15字节<br></br>
<strong><br></br>1、Nginx连接限制配置<br></br></strong>1)Nginx连接限制语法<br></br>Syntax:<strong>limit_conn_zone</strong> ```
<em>key</em>
``` ```
zone
```=```
<em>name</em>
```:```
<em>size</em>
```;<br></br>Default:—<br></br>Context:http<br></br><br></br>Syntax:<strong>limit_conn</strong> ```
<em>zone</em>
``` ```
<em>number</em>
```;<br></br>Default:—<br></br>Context:```
http
```, ```
server
```, ```
location<br></br><br></br>
```<br></br>2)Nginx连接限制实战<br></br><br></br> http {<br></br> //http段配置连接限制,同一时刻只允许一个客户端IP连接<br></br> <strong>limit_conn_zone</strong> $binary_remote_addr ```
zone
}
3)使用ab工具进行压力测试
//压力测试
yum install -y httpd-tools
ab -n 50 -c 20 http://127.0.0.1/index.html
2、Nginx请求限制配置实站
ngx_http_limit_req_module
1)Nginx请求限制语法
![Nginx Web服务器教程](https://www.icode9.com/i/l/?n=20&i=blog/1328126/202101/1328126-20210107164106223-1820006352.png)
![Nginx Web服务器教程](https://www.icode9.com/i/l/?n=20&i=blog/1328126/202101/1328126-20210107164133756-1448543593.png)
2)Nginx请求限制实战
http {
//http段配置请求限制,rate限制速率,限制一秒钟最多一个IP请求
limit_req_zone `
$binary_remote_addr
zone
```=req_zone:10m ```
rate
```=1r/s;
```
```
<em> ...<br></br> server {<br></br> ...<br></br> location / {<br></br> // </em>1r/s只接收一个请求,其余请求拒绝处理并返回错误码给客户端<em><br></br> limit_req zone=</em>req_zone<em id="__mceDel">;<br></br> //</em>请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量,多余的请求返回503<em id="__mceDel"> <br></br> #</em>limit_req zone=req_zone burst=3 nodelay;<em id="__mceDel"><br></br></em>
```
```
<em id="__mceDel"><em id="__mceDel"> }<br></br><br></br> }</em></em>
```
```
}
```
```
3)使用ab工具进行压力测试<br></br> //压力测试<br></br> yum install -y httpd-tools<br></br> ab -n 50 -c 20 http://127.0.0.1/index.html<br></br><strong>3、Nginx连接限制没有请求限制有效<br></br></strong>多个请求可以建立在一次的TCP连接之上,那么我们对请求的精度限制,当然比对一个连接限制会更加的有效<br></br>因为同一时刻只允许一个连接请求进入,但是同一时刻多个请求可以通过一个连接进入,所以请求限制才是比较优的解决方案<br></br><br></br><br></br>
```
```
<br></br>
```
```