nginx配置文件解析
- nginx的组成部分(初始配置)
- nginx主要配置文件优化
- 日志优化
- nginx监控
- 控制访问权限
- 列出linux中的列表
- 设置文件缓存
- 设置请求限制
- 设置IP高并发(限制多少人同时访问)
- nginx伪静态
- nginx加密访问
- htpasswd 命令
- 压力测试
nginx的组成部分(初始配置)
一般nginx配置文件分为三个部分:main全局块(全局设置)、events块(主机设置)、http块(服务器)
worker_processes 1; #最大的线程数,可以设置成auto(根据系统自动获取)
events {
worker_connections 1024; #最大的连接数,他可以是最大文件数除以2也可以写最大65535
}
http {
include mime.types; #引用文件
default_type application/octet-stream;
sendfile on; # 高效传输模式。开启后,传输只需要2步,不开启需要4步,降低阻塞率
keepalive_timeout 65; #从三握开始如果65秒没有动作,,直接断开连接
server {
listen 80; #端口号80
server_name localhost; #域名
location / {
root html; # 定义服务器的默认网站根目录的位置
index index.html index.htm; # 定义首页索引文件的名称
}
error_page 500 502 503 504 /50x.html; #定义错误提示页面
location = /50x.html {
root html;
}
}
}
nginx主要配置文件优化
worker_processes auto;
#最大线程数
worker_cpu_affinity auto;
#线程优化auto也行
worker_rlimit_nofile 65535;
#打开最大文件数,一般是65535
events {
#这是他输入main配置里面处理线程连接的配置
worker_connections 65535;
#最大连接数,最大文件数除2或者直接是65535
use epoll;
#事件模型nginx就用这个
}
http {
include mime.types;
#请求的文件类型在请求头能看见,include是引用文件
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"';
#日志格式,log_format(表示日志格式前缀)main(引用日志格式名称)后面是日志格式
log_format sjb '$remote_addr - $remote_user';
#添加了一个日志格式,只显示IP地址和用户
access_log logs/80_log main;
访问日志,日志保存目录,日志名字,引用的日志格式
#access_l;
sendfile on;
#高效传输模式 开启后 传输文件只需要2步 不开启传数文件要4步...降低阻塞率
#keepalive_timeout 0;
keepalive_timeout 45;
#TCP长连接 就是你进来之后我就给你打开一个大门 让你随便拿东西 45秒直到你断开 这是你三次握手之后开始计时
send_timeout 15;
#监听如果45内 你没有动作了 超过15秒就给你四次挥手 是你停止动作了开始计时
tcp_nodelay on;
#ON 会增加小包的数量,但是可以提高响应速度。在及时性高的通信场景中应该会有不错的效果
#OFF 会增加通信的延时,但是会提高带宽利用率。在高延时、数据量大的通信场景中应该会有不错的效果
gzip on;
#开启压缩就是浏览器烟的文件,是压缩之后再输出,如果没有下边的指定,会自动不压缩
gzip_types text/plain application/x-javascript text/css application/xml application/javascript ;
#指定压缩类型
gzip_comp_level 6;
#压缩等级,最大是9,默认是5,越大越狠,但是CPU消耗比较大
server {
#这是一个网站
listen 80;
#默认端口是80
server_name localhost;
#域名
rewrite /sohu www.sohu.com permanent;
#这里是跳转,搜狐网站
location ~ \ *.jpg$ {
#是网页里面查找图片
root /2020;
#默认在什么地方查找
error_log logs/404_log sjb;
#访问图片时,报错日志,引用的是sjb格式,
}
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
#服务器报错,自动跳转文件
location = /50x.html {
#文件名称
root html;
#文件所处的位置
#deny all;
#拒绝所有人访问该文件
}
location ~ \.php$ {
#访问PHP文件的格式
root /2020;
#访问的PHP格式的文件默认地址
fastcgi_pass 127.0.0.1:9000;
#默认,跟PHP进行通讯
# fastcgi_index index.php;
#默认访问的文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#$document_root 是你的网站根目录的路径 是你请求的文件的名字 意思就是去你的网站根目录下找你要的php文件并解析给他
include fastcgi_params;
#fastcgi 配置文件
}
}
日志优化
location = /robots.txt { access_log off; log_not_found off; error_log /dev/null; }
location = /favicon.ico { access_log off; log_not_found off; error_log /dev/null; }.
#这里是把强制刷新的访问、找不到日志关闭,错误日志扔掉垃圾桶
nginx监控
1.首先看一看nginx -V 有哪些模块
2.然后到nginx安装包中找到configure
./configure --with-http_gzip_static_module --http-client-body-temp-path=/var/temp/nginx/client --http-proxy-temp-path=/var/temp/nginx/proxy --http-fastcgi-temp-path=/var/temp/nginx/fastcgi --http-uwsgi-temp-path=/var/temp/nginx/uwsgi --http-scgi-temp-path=/var/temp/nginx/scgi --with-pcre --with-http_stub_status_module
#--with-http_stub_status_module这个是监控模块,一定记住,不能漏掉之前nginx拥有的模块
3.去nginx配置文件添加一个
location ***{
stud_status on;
#打开监控
}
4.对原有的命令进行备份
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
#安装包里有objs文件去找nginx
cp ./nginx /usr/local/nginx/sbin/nginx
5.关闭nginx服务,启动服务
nginx -s stop
nginx -c /usr/local/nginx/conf/nginx.conf
6.查看模块是否添加
nginx -V # 添加成功后启动服务
systemctl start nginx
控制访问权限
#在任何的界面都可以设置限制访问权限
allow IP地址 ;#让某个IP地址不能访问
deny IP地址 ; #限制这个IP地址不能访问
allow all ; #让所有IP地址都不能访问
deny all ; #限制所有IP地址都不能访问,包括自己
列出linux中的列表
location =1.html { # on打开,off关闭
root /html ;
autoindex on; # 还是自动打开index
autoindex_exact_size on; # 列出目录并显示大小
autoindex_localtime on; # 修改显示时间
}
设置文件缓存
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
#过期时间为30天,
#图片文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d; # d是天,m是分钟,s是秒,一般在网页显示的是多少秒
}
设置请求限制
# 注:必须在http里面,不能再server和location里面
limit_req_zone $binary_remote_addr zone=allips:10m rate=5r/s; # 这里是每秒可以请求5次
# 在location里面调用
limit_req zone=allips ;#也可添加允许超过次数 burst=5 nodelay
设置IP高并发(限制多少人同时访问)
# 注:必须在http里面,不能再server和location里面
limit_conn_zone $binary_remote_addr zone=one:10m;
# 在location里面调用
limit_conn one 2;# 连接数限制
limit_rate 300k; #单个连接限制带宽
nginx伪静态
+ # 表示匹配前面的子表达式一次或多次(大于等于1次)
. # 匹配除换行符以外的任意字符 (.+) 匹配任意字符最少一次
\d # 匹配数字 (\d+) 匹配数字最少一次
\w # 匹配字母或数字或下划线或汉字 (\w+) 匹配字母或数字或下划线或汉字最少一次
# 在location里面添加
rewrite /(.+)-(d+).get /get.php?name=$1&age=$2 last ;
nginx加密访问
- 安装 htpasswd 工具
> yum install httpd-tools -y
- 设置用户名和密码,并把用户名、密码保存到指定文件中:
> mkdir /usr/local/nginx/conf/passwd # 创建密码文件夹
> htpasswd -c passwd/passwd 用户名 # 创建密码
New password:
Re-type new password:
Adding password for user 用户名
> cat passwd/passwd
用户名:$apr1$J5Sg0fQD$KDM3Oypj8Wf9477PHDIzA0
- 修改 nginx 配置文件
server {
listen 80;
server_name localhost;
.......
#新增下面两行
auth_basic "Please input password"; #这里是验证时的提示信息
auth_basic_user_file /usr/local/nginx/conf/passwd/passwd; # 这里是密码文件,可以填写绝对路径
location /{
.......
}
htpasswd 命令
- htpasswd命令选项参数说明:
-c 创建一个加密文件
-n 不更新加密文件,只将htpasswd命令加密后的用户名密码显示在屏幕上
-m 默认htpassswd命令采用MD5算法对密码进行加密
-d htpassswd命令采用CRYPT算法对密码进行加密
-p htpassswd命令不对密码进行进行加密,即明文密码
-s htpassswd命令采用SHA算法对密码进行加密
-b htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码
-D 删除指定的用户
- htpasswd例子
> htpasswd -bc passwd sandu pass # htpasswd命令添加用户 在当前目录下生成一个.passwd文件,用户名sandu,密码:pass,默认采用MD5加密方式 添加用户不推荐上面
> htpasswd -b passwd 用户名 后面跟着密码 # 在原有密码文件中增加下一个用户
> htpasswd -D passwd 用户名 # 删除用户
压力测试
- 安装
> wget http://120.53.7.204/webbench-1.5.tar.gz
- 解压并且 make && maike install
> mkdir -p /usr/local/man/man1
> make && make install
- 使用
webbench -c 1000 -t 10 域名
-c 并发多少量
-t 运行测试多长时间
####
1000 clients, running 10 sec.
# 1000个并发 运行了10秒
Speed=11964 pages/min, 10327965 bytes/sec.
Requests: 1994 susceed, 0 failed
# Pages/min:指的输出页数/分
# bytes/sec:是指字节/秒
# 这两个指标能反应网站的访问速度。susceed和failed表示请求的成功数目和失败数目,失败的原因虽然没有日志但是应该能猜出是get请求得不到200的响应。
- 抵挡恶意的压力测试攻击
if ($http_user_agent ~ “WebBench”) {
set $block_user_agents 1;
}
if ($block_user_agents = 1) {
return 444;
}
# 加上这个 然后再做一个限流