linux高级运维之nginx
Nginx -one:
基本了解
Nginx搭建
用户认证
基于域名的虚拟主机
安全的ssl虚拟主机
基本了解
常见的web服务器比较:
Unix和Linux平台:Apache Nginx tengine Tomcat Lighttpd
Windows:IIs(Internet information server)
Tengine 淘宝引擎 优化了Nginx
server:"tarena" 请求头文件中显示的版本 改过的
不要暴露自己的服务器软件及版本容易被×××。
网页类型:
php python: apache nginx tengine lighttpd
java : tomcat IBM WebSphere Jboss
Nginx搭建: 1、安装:
yum -y install gcc pcre-devel openssl-devel
pcre-devel redhat中以-devel结束的包通常是代表依赖包 这个是支持兼容Perl语言的正则
redhat中@anaconda/7.4通常是代表这个已经装上了没有这个的代表是在Yum中而没有装。
useradd -s /sbin/nologin nginx
tar -xf nginx-1.10.3.tar.gz
cd nginx-1.10.3
./configure:
--prefix=/usr/local/nginx \ //指定安装路径
> --user=nginx \ //指定用户
> --group=nginx \ //指定组
以普通用户来启动服务!更安全 被×××以后也只会获得普通用户权限而且是/sbin/nologin 不能登陆的用户。
> --with-http_ssl_module //开启SSL加密功能
模块话设计:尽可能多的人的需求
100个功能 相互独立 可以选择需求功能安装 设计为100个模块。
不知道模块就可以安默认
/.configure时就相当于windows下装软件时选择功能后下一步下一步。可以选路径模块 功能
第一次装的时候可以直接confiure 它会告诉你有哪些依赖包你没装。gcc 没有就装gcc
什么没有装什么。
make && make install
make 把src的c语言的转为二进制的格式 生成一个程序 但是在家目录下
make install 把make生成的程序拷贝到可执行路径下 等等操作。
nginx -V 能看到别人安装软件时是怎么confgiure的了可以照着安装。
nginx version: nginx/1.10.3
configure arguments: --prefix=/usr/local/nginx
--user=nginx --group=nginx --with-http_ssl_module
ln -s /usr/local/nginx/sbin/nginx /sbin/
做了个快捷方式到可执行程序路径下,可以直接nginx后Tab了方便管理服务
ll /sbin/nginx 可以看到软链接情况。
nginx 启动服务
/usr/local/nginx/sbin/nginx -s reload //重新加载配置文件
必须在服务开启时才能用。不关服务时重读配置文件!!! 不会影响别人的服务访问。
setenforce 0
firewall-cmd --set-default-zone=trusted
curl http://127.0.0.1 访问测试
2、平滑升级:
cd nginx-1.12.2
./configure
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_ssl_module
make 千万不要make install 这样就覆盖安装了,不是平滑升级了。
conf html logs 都希望保留
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
sbin 把这个下面的程序升级。升级有风险最好备份一下老的程序nginxold 想用老的就用nginxold。
cp objs/nginx /usr/local/nginx/sbin/
objs里放的是make出来的新的可执行绿色程序。
make upgrade 杀死老程序 重新启动升级后的新程序。
make upgrade 失败了就
netstat -natulp | egrep nginx 看进程号 7035
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7035/nginx
kill 7035 或者killall nginx 再启动服务即可
nginx
nginx -V
nginx version: nginx/1.12.2
程序、进程、线程:
程序program (下载到硬盘的) 很多是多进程的程序 可以同时访问多个页面(并发高些,占内存高)
进程process(内存里启动的程序,进程之间是独立的不会相互影响)
线程thread (进程下面再启动的加线程 更省内存一些 进程挂了下面的8个线程全挂了 进程线程结合着用
pstree
├─polkitd───5*[{polkitd}] 这个进程中启动了5个线程。
worker_processes 1; 双击时启动1个进程。
用户认证:
vim /usr/local/nginx/conf/nginx.conf (配置文件框架)
<VirtualHost *:80>
ServerName www0.example.com
DocumentRoot /var/www/nsd01
</VirtualHost> nginx的虚拟主机和Apache的虚拟主机类似
全局配置
(进程所有者;启动进程数量;日志文件;pid文件;单进程最大并发量;...)
http{ 配置容器
server{ 虚拟主机
listen 80;
server_name localhost;
root html; 发布目录(位置)
location / {
root html;
index index.html index.htm;
}
}
server{
listen 80;
server_name www.xyz.com;
root www;
}
}
server中添加:
auth_basic "Input Password:"; //认证提示符
auth_basic_user_file "/usr/local/nginx/pass"; //认证密码文件 怎么敲都没有!要在这个路径下建一样的文件 写上密码和用户名。
install httpd-tools
htpasswd -c /usr/local/nginx/pass tom 第一个用户要-c
cat /usr/local/nginx/pass
tom:$apr1$0fBOo/ZS$lIw/0axG5oQ7kELEb5D1K1
htpasswd /usr/local/nginx/pass lisi 第二个用户不要c
删除用户就直接vim进去删除。
nginx -s reload
firefox http://192.168.4.5
基于域名的virtualhost
理论概述:
用户没用域名直接用IP的话出来的页面为配置文件中的第一个server的页面
容器配置中 域名 IP 端口 总有一个不一样,哪个不一样就是基于哪个的虚拟主机。
ctrl + v 选了以后再x就可以批量去注释了。
nginx 的配置文件 /usr/local/nginx/conf/nginx.conf
nginx 的(root)默认网页根目录 /usr/local/nginx/html
改配置:
第一个sever
server_name www.a.com;
location:root html;
第二个sever
server_name www.b.com;
location:root www;
mkdir /usr/local/nginx/www
echo "www" > /usr/local/nginx/www/index.html
nginx -s reload
vim /etc/hosts
192.168.4.5 www.a.com www.b.com
firefox http://www.a.com
firefox http://www.b.com
安全的ssl虚拟主机
理论概述:
ssl 加密网站部署
http协议是明文协议
https协议是加密协议
对称加密
加123 解123 同一把钥匙
非对称
加123 解dkfgjhdlk (随机) 无任何规律 不是同一把钥匙。
md5: 网上的所有妙传都是基于这个原理 压根都没传 核对md5 一样的就不用传了。
鉴黄师 删除的是md5 相关的所有文件 就把这个视频都在网上删除了。
校验文件内容是否有变化 网站上东西时会提供md5码 用于检验下载文件是否完整。
不安全 被破解了。 山东大学 王小东
码是用内容来决定的 内容不变码不变 只于文件内容有关。
非对称加密:
浏览器自动下载了公钥 浏览器自动用公钥加密了数据 网站自动用私钥来解密
openssl req -new -x509 -key cert.key > cert.pem //生成证书
请求生成 一个新的证书 格式为509 钥匙是刚刚生成的私钥匙。
第一个必须两个字母其他的随便。
实验:
生成私钥与证书
cd /usr/local/nginx/conf
openssl genrsa > cert.key
openssl req -new -x509 -key cert.key > cert.pem
改Nginx配置
vim /usr/local/nginx/conf/nginx.conf
server里location外:
listen 443 ssl;
server_name www.c.com;
ssl_certificate cert.pem; #这里是证书文件
ssl_certificate_key cert.key; #这里是私钥文件
nginx -s reload
vim /etc/hosts
192.168.4.5 www.c.com www.a.com www.b.com
firefox https://www.c.com
nginx-two:
LNMP平台搭建及地址重写:
主流端企业网站平台之一:LNMP(LAMP)
lnmp:linux nginx (mariadb | mysql) (php | python | perl )新项目多数是这个
lamp:linux apache(mariadb | mysql) (php | python | perl )老项目用的这个能不动就不动
动态页面:java php python perl ruby
静态页面:html
一、lnmp平台搭建:
安装步骤:按照lnmp这几个字母的顺序进行安装避免出错。
1安装源码包的依赖包
yum -y install gcc openssl-devel pcre-devel(地址重写要这个包) zlib-devel
2安装完成nginx并启服务
cd nginx-1.12.2/ 进入解压后的位置
useradd -s /sbin/nolgin/ nginx 创建一个不能登录端用户
./configure --help 模块不记得了就help
./configure --prefix=/usr/local/nginx/ --user=nginx --group=nginx
--with-http_ssl_module --with-stream --with-http_stub_status_module
--without-http_autoindex_module --without-http_ssi_module
--with-http_ssl_module 加密模块
--with-stream 代理模块
--with-http_stub_status_module 查看nginx状态模块
--without-http_autoindex_module 禁用文件索引模块
--without-http_ssi_module
以上是常用模块可以根据需要自行选择
make && make install
ln -s /usr/local/nginx/sbin/nginx /sbin/
nginx
ss -natulp |grep 80
3安装mariadb(客户端 启动服务) mariadb-server(服务端 提供mysql命名) mariadb-devel(依赖包)
如果是mysql就安装mysql
yum -y install mariadb mariadb-server mariadb-devel
安装nosql数据库
yum -y install memcached
4安装php(解释器) php-mysql(调用mariadb数据库的模块)
php-fpm php-pecl-memcache (调用memcache数据库的模块)
cd php_scripts/
yum -y install php php-mysql
yum -y install php-pecl-memcache
yum -y install php-fpm-5.4.16-42.el7.x86_64.rpm
5启服务和关防火墙
服务:nginx mariadb php-fpm memcached
nginx
systemctl restart mariadb
systemctl enable mariadb
systemctl restart php-fpm
systemctl enable php-fpm
systemctl restart memcached.service
systemctl enable memcached
setenforce 0
firewall-cmd --set-default-zone=trusted
6修改配置文件使能够访问php动态网站(动静分离)
vim /usr/local/nginx/conf/nginx.conf //nginx配置文件
#location 位置nginx 让用户进入
#nginx 做判断静态或动态 静态直接给 动态要交给php解释器
#location匹配用户地址栏
#同个server下可以多个location
#匹配及停止,类似if elif else的判断
location / { #/的优先级最低什么都找不着就匹配根
root html;
index index.php index.html index.htm;
#设置默认首页为index.php(只写域名或IP时)
}
location ~ \.php$ { #nginx支持正则 ~匹配。类似awk的~号匹配 (帮用户找php)
root html;
fastcgi_pass 127.0.0.1:9000; //找到php交给9000端口解释
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf; //fastcgi.conf 一堆环境变量
}
#改错了可以cp nginx.conf.default nginx.conf 还原配置文件
vim /etc/php-fpm.d/www.conf //php配置文件 默认不用修改
[www]
listen = 127.0.0.1:9000 //PHP端口号
pm.max_children = 32 //php是多进程的;最大进程数量
pm.start_servers = 15 //最小进程数量
pm.min_spare_servers = 5 //最少需要几个空闲着的进程
随时待命一旦小于5个就自动再开启了
pm.max_spare_servers = 32 //最多允许几个进程处于空闲状态
7验证结果:
cp mem.php /usr/local/nginx/html
curl 192.168.2.111/mem.php (结果为test)
几种常见排错:
三个常用日志:
/usr/local/nginx/logs/access.log Nginx的默认访问日志文件
/usr/local/nginx/logs/error.log Nginx的默认错误日志文件
/var/log/php-fpm/www-error.log PHP默认错误日志文件
空白(页面写错了 但是第一个日志没有报错 证明nginx没有错,
页面给你了,但是页面是空。直接看php-fpm服务的报错!!
下载 (没做动态分离)
an Error (php没启动)
配置文件改错 最容易发现,因为服务都启不来。
tailf /usr/local/nginx/logs/error.log 弄到空白处 再访问test.php 最后几行一定时相关日志。
二、地址重写:(需要依赖包pcre-devel)
语法格式:
rewrite 旧地址 新地址 [选项]
所有访问a.html的请求,重定向到b.html;
location下加:
rewrite /a.html /b.html; (地址栏没变)
rewrite /a.html /b.html redirect; (跳转地址栏)
所有访问192.168.4.5的80端口就把请求重定向至www.baidu.com;
server_name下加: (注意空格)
rewrite ^/(空格)http://www.baidu.com/; 在打开自己网站之前就跳转
正则是匹配包含就算 访问4.5不管是啥都跳到tmooc。
所有访问192.168.4.5/下面子页面,重定向至www.baidu.com/下相同的页面;
server_name下加: (注意空格)
rewrite ^/(.*)$(空格)http://www.baidu.com/$1; 第一个$可有可无
$1 与正则中的\1等效 就是把根目录下的.* 粘贴到tmooc的/下。
实现firefox与curl访问相同页面文件,返回不同的内容。
理论基础:
不同浏览器访问相同页面,返回的页面的结果不同。 (手机浏览器和电脑浏览器页面不同)
电脑:sina.com
手机:sina.com 结果不同 按钮和功能不同。
首先服务器要知道客户端的浏览器是什么。
关于变量$http_user_agent :
Nginx的默认访问日志文件为/usr/local/nginx/logs/access.log 这里能知道客户端的浏览器
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
#'$status $body_bytes_sent "$http_referer" '
#'"$http_user_agent" "$http_x_forwarded_for"';
这些变量都是nginx的内置变量。
"$http_user_agent"可识别客户端的信息。
192.168.4.254 - - [26/May/2018:16:36:46 +0800] "GET /xixi HTTP/1.1" 302 161 "-" "Mozilla/5.0
(X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
通常企业会设计两套页面 手机和PC
/usr/local/nginx/html/宽{a b c }html 默认是访问这个
如果你是uc 手机 。。。就跳转
rewrite /(.*)
/usr/local/nginx/html/andriod/窄{a b c} html 做个跳转
最终结果:
server里,location外面加:
if ($http_user_agent ~* firefox) {rewrite ^(.*)$ /firefox/$1;}
#if ($http_user_agent ~* firefox)等价于grep firefox "$http_user_agent"
地址重写格式【总结】:
rewrite a c last(不再读其他rewrite) | break (不再读其他语句,结束请求 )
匹配到了才会a跳到c才会执行last 或者break 不然相当于没写
有点if的意思 if a 再跳c elif b 跳d。。。
rewrite b d redirect 临时重定向
rewrite e f permament 永久重定向
redirect permament 给蜘蛛看的 蜘蛛 :百度 搜狗 360.。。等搜索引擎。
卖鞋子的:
url: www.jd.com/a 临时的就不动 如果是永久 就直接改数据库为www.jd.com/c让用户直接访问c
逗蜘蛛完可能被直接除名影响生意。
nginx-three: nginx调度 web高可用 tcp/udp服务代理 nginx调优
nginx调度
web高可用: 负载均衡上面挂了直接转下面(类似备份功能) 带健康检查后面机子坏了转到另外一台。
普通的情况下,nginx代理没有压力的因为它只负责转发 不负责页面请求!
——————web1
a |
user————》proxy———— |
b |
——————-web2
nginx调度器算法:
轮询算法:默认算法
ip_hash算法:相同客户端访问相同服务器。
nginx实现web反向代理: 定义集群和调用集群
部署实施后端Web服务器
vim /usr/local/nginx/conf/nginx.conf
定义集群: (后期调用)一个配置文件可以写n多个upsteam。web服务器有多少加多少。
upstream webserver {
server 192.168.2.111:80 weight=1 max_fails=1 fail_timeout=20;
//设置权重 :性能好的多承担。没改过默认都是1 各承担一次轮询一次。
3的话就是接收3次请求再交给别人。
//max_fails=1 连一次不通觉得连不上了就认为这个web服务器挂了。
//fail_timeout=30 挂了之后30秒之内不找你了。 每隔30秒就又去连一次,好了就继续轮询。
server 192.168.2.222:80;
server 192.168.2.101 down;
//人为判断标记为关机要很久才能修好 先使它不参与集群调度不去试它好没有,节省资源。
}
location / {
proxy_pass http://webserver; //调用集群,将请求转给后端web服务器
root html; #这个要改掉,不改的话自己就是web服务器了不是代理服务器,到自己根下去给客户机找页面了。
index index.html index.htm;
#rewrite /a.html /b.html redirect;
}
nginx -s reload
curl 192.168.4.5
web1
curl 192.168.4.5
web1
加上ip_hash算法:只需要在集群服务器前加上ip_hash;
解决你输了账号密码登上服务器了,只是轮询算法的话,一刷新就会到另外一台服务器上去
另外服务器没有你的账号密码信息的话就会让你重新登陆!
upstream webserver {
#通过ip_hash设置调度规则为:相同客户端访问相同服务器
ip_hash;
server 192.168.2.100 weight=1 max_fails=2 fail_timeout=10;
server 192.168.2.200 weight=2 max_fails=2 fail_timeout=10;
}
tips://最终的nginx反向代理web结果:ip哈希加轮询都要有!
tcp/udp服务代理: 需要--with-stream
四层调度,所有服务的代理,都是走tcp/ip协议 只是端口号不一样。
代理不同的服务只需要服务的端口号不一样就可以了。
可以实现只要能ping通的情况下家里就能连公司的服务器或数据库或web,不用管ip地址。
代理就是能访问平时访问不了的网站啊 所以不管是什么网段的能ping通代理服务器的ip就可以了。
新技术出来找不到资料就找官网
——————tcp/udp服务(ssh)
a |
user————》proxy———— |
b |
——————tcp/udp服务(ssh)
使用nginx代理可以用192.168.4.100 ssh 192.168.2.222 就是可以连不同网段。
源码安装Nginx软件--with-stream
启用Nginx服务,修改/usr/local/nginx/conf/nginx.conf配置文件
stream {
upstream backend {
server 192.168.2.100:22; //后端SSH服务器的IP和端口
server 192.168.2.200:22;
}
server {
listen 12345; //Nginx监听的端口
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass backend;
}
}
nginx -s reload
[root@client ~]# ssh 192.168.4.5 -p 12345 //多次访问查看效果
nginx调优: 如果客户端访问服务器提示“Too many open files”如何解决 如何解决客户端访问头部信息过长的问题 如何让客户端浏览器缓存数据 如何自定义返回给客户端的404错误页面 如何查看服务器状态信息 开启gzip压缩功能,提高数据传输效率
环境准备:
构建Nginx服务器并启动服务
解决客户端访问服务器提示“Too many open files” 储备知识:cat /proc/cpuinfo | grep process
lscpu :双核双进程 假四核。 //查看cpu核心数
ps aux | grep nginx #两个进程在干活,work的数量。
root 7404 0.0 0.1 45964 1136 ? Ss 14:13 0:00 nginx: master process nginx
nginx 7405 0.0 0.2 48500 2520 ? S 14:13 0:00 nginx: worker process
root 7535 0.0 0.0 112676 984 pts/0 R+ 14:25 0:00 grep --color=auto nginx
1、优化Nginx并发量
http_load,webbeach,siege也是压力测试软件可以测试服务器压力,根据情况自行选择
ab -n 2000 -c 2000 http://192.168.4.5/
socket: Too many open files (24) //提示打开文件数量过多
vim /usr/local/nginx/conf/nginx.conf
worker_processes 2; //启动nginx时打开的进程默认为1;调成与CPU核心数量一致
error_log /var/log/nginx.error_log info; //定义日志文件级别为信息
events {
worker_connections 65535; //每个worker最大并发连接数默认为1024
小了就被限制死了,大点可以达到它的最大值
//最大并发量为两个相乘法 2*65535
use epoll;
}
nginx -s reload
2、调整系统本身限制:
selinux 对最大打开文件数量有限制默认1024个。
2000个人访问就要同时打开2000个页面给客户端很容易突破1024个。
ulimit -a
open files (-n) 1024
软限制和硬限制之间普通用户可以自调 软限制(预设值)可以超硬限制不能超
ulimit -Hn 100000 //设置硬限制(临时规则)
ulimit -Sn 100000 //设置软限制(临时规则)
vim /etc/security/limits.conf #security安全性
#用户或组 硬限制或软限制 需要限制的项目 限制的值
* soft nofile 100000
* hard nofile 100000
ab -n 2000 -c 2000 http://192.168.4.5/
解决客户端访问头部信息过长的问题
414 Request-URI Too Large 缓存太小存不下发送过来的请求。
优化前:
vim lnmp_soft/buffer.sh //写个测试头文件脚本
#!/bin/bash
URL=http://192.168.4.5/index.html
for i in {1..500}
do
URL=${URL}/v$i=$i
//第一次循环在初值后面加v1=1,二次加v2=2 类推;“=”无特殊意义!!
done
curl $URL //经过500次循环后,生成一个长的URL地址栏
./buffer.sh
<center>414 Request-URI Too Large</center> //提示头部信息过大
步骤:
修改vim /usr/local/nginx/conf/nginx.conf
http {
client_header_buffer_size 1k; //默认请求包头信息的缓存
large_client_header_buffers 4 4k; //大请求包头部信息的缓存个数与容量(16k)
.. .. //先根据默认的分配,不够再根据large值分配 上班推荐值
}
nginx -s reload
./buffer.sh 5000次好像还是不够-_-.
如何让客户端浏览器缓存数据 以Firefox浏览器为例,在Firefox地址栏内输入about:cache将显示Firefox浏览器的缓存信息 点击List Cache Entries可以查看详细信息。
浏览器缓存(只适合静态数据图片视频音频)
清空firefox本地缓存数据
vim /usr/local/nginx/conf/nginx.conf
#在虚拟主机server中加入
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
expires 30d; //定义客户端缓存时间为30天
} //如果匹配到地址栏为以上这些静态数据信息则浏览器过期时间为30天
cp /usr/share/backgrounds/day.jpg /usr/local/nginx/html
nginx -s reload
firefox http://192.168.4.5/day.jpg
在Firefox地址栏内输入about:cache,查看本地缓存数据,查看是否有图片以及过期时间是否正确。
自定义报错页面
常见http状态码
200 为新加载 一切正常
300 重定向类
301 永久重定向
302 临时重定向
304 为已缓存
400 用户方面的错误
401 用户名或密码错误
403 禁止访问(ip被禁)
403 资源不可用,服务器上目录或文件权限设置导致
404 页面不存在
414 请求头部信息过长
500 服务器内部错误
502 bad getaway:一定是作了代理两个后台web都挂了就会报这个
firefox http://192.168.4.5/xxxxx //访问一个不存在的页面
vim /usr/local/nginx/conf/nginx.conf
server中location外 有默认模板 改改就行
server {
error_page 404 /40x.html; //去掉注释改个页面
error_page 403 /403x.html;
error_page 414 /414x.html; //想自定义的都可以
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
vim /usr/local/nginx/html/40x.html //生成错误页面
nginx -s reload
firefox http://192.168.4.5/xxxxx //访问一个不存在的页面
查看服务器状态信息 --with-http_stub_status_module 编译安装时使用--with-http_stub_status_module开启状态页面模块 vim /usr/local/nginx/conf/nginx.conf
location /status {
stub_status on;
allow ip; ip 写自己的ip地址 自己能看服务器的状态
deny all;
}
curl http://192.168.4.5/status
Active connections:当前活动的连接数量。
//server Accepts:已经接受客户端的连接总数量(握手的数量)连接就是通道。
一次握手(连接)多次请求。建立连接之后不会立刻断开,可以多次请求。
长时间(timeout)没有请求连接自动断开。
Accepts:已经接受客户端的连接总数量。
Handled:已经处理客户端的连接总数量(一般与accepts一致,除非服务器限制了连接数量)。
Requests:客户端发送的请求数量。
Reading:当前服务器正在读取客户端请求头的数量。
Writing:当前服务器正在写响应信息的数量。
Waiting: 开启keep-alive的情况下,这个值等于 active – (reading + writing)
意思就是Nginx已经处理完成,正在等候下一次请求指令的驻留连接.
所以,在访问效率高,请求很快被处理完毕的情况下,Waiting数比较多是正常的
.如果reading +writing数较多,则说明并发访问量非常大,正在处理过程中.
对页面进行压缩处理
目前所有浏览器支持解压动作 但是不支持rar
网页压缩通常为gzip
小文件不要压缩,会压缩得更大,最少1000字节。
linux下1-9选择数字月大效果越好压得越慢。
jpg,mp3,mp4,gif,等多媒体文件不要压缩,已经是压缩格式了。
压缩最适合文档,ape无损音乐。
cat /usr/local/nginx/conf/mime.types
对什么类型压缩参考这个文件 有扩展名对应的类型码。
vim /usr/local/nginx/conf/nginx.conf
http {
.. ..
gzip on; //开启压缩
gzip_min_length 1000; //小文件不压缩
gzip_comp_level 4; //压缩比率
gzip_types text/plain text/css application/json
application/x-javascript text/xml application/xml application/xml+rss application/javascript;
//对特定文件压缩,类型参考mime.types
.. ..
}
服务器内存缓存: 如果需要处理大量静态文件,可以将文件缓存在内存,下次访问会更快。 vim /usr/local/nginx/conf/nginx.conf http { open_file_cache max=2000 inactive=20s; //设置服务器最大缓存2000个文件句柄关掉20s之内没有请求的文件。 open_file_cache_valid 60s; //有效缓存时间为60s 60秒后过期 open_file_cache_min_uses 5; // 最少被访问5次才会被认为是热点数据 才会缓存。 open_file_cache_errors off; }
优化Nginx服务的安全配置
without-http_autoindex_module \ //禁用自动索引文件目录模块
没有index.html 就列出该目录所有文件的列表 这就是我们之前搭的http为什么能够直接访问rhel7 和cla***oom的原因???
without-http_ssi_module 禁用支持服务器端的include。
修改版本信息,并隐藏具体的版本号
vim /usr/local/nginx/conf/nginx.conf
server_tokens off; //在http下面手动添加这么一行
nginx -s reload
curl -I http://192.168.4.5
Server: nginx
服务器还是显示了使用的软件为不显示为nginx
[root@proxy nginx-1.12]# vim +48 src/http/ngx_http_header_filter_module.c
static u_char ngx_http_server_string[] = "Server: Jacob" CRLF;
static u_char ngx_http_server_full_string[] = "Server: Jacob" CRLF;
static u_char ngx_http_server_build_string[] = "Server: Jacob" CRLF;
//修改完成后,再去编译安装Nignx,版本信息将不再显示为Nginx,而是Jacob
./configure
make && make install
killall nginx
/usr/local/nginx/sbin/nginx //启动服务
curl -I http://192.168.4.5 //查看版本信息验证
Server: haha
总结:实际上生产环境就直接改掉这src下的文件再安装再在http下加server_tokens off;两个都改
限制并发量
内置默认ngx_http_limit_req_module模块 需要有人拿小本子记领礼物了没有 不然人家走一圈又来领一次 用内存记录
//降低DDOS×××的风险
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; //这个是写在http里
limit_req_zone zone=one:10m //限制请求内存空间 内存的区域取名叫one大小:10m
$binary_remote_addr //内存里放的是远程的ip地址
rate=1r/s; //速度为每秒只接受1个请求
limit_req zone=one burst=5; 调用上面的内存 最多充满5个 漏斗中最多放5个 //这个写在server端口下面
//最多处理6个请求
ab -c 1000 -n 10000 http://192.168.2.111/
Failed requests: 9994
//发现丢了9994个包只成功了前6个 是因为同时只能请求6个。
拒绝非法的请求
默认为get方法
常用的就只有get 和post (提交上传文件或表单)
curl -i -X GET http://192.168.4.5
//-i选项:访问服务器页面时,显示HTTP的头部信息 只有这个就既头部又要页面
//-X选项:指定请求服务器的方法
curl -i -X HEAD 192.168.2.111 只要头部信息不要其他
在server的listen 80; 后面加上这段
(监听到80端口就判断如果请求方法不是get或者post就返回444报错)
if 空($request_method空 !~ 空^(GET|POST)$空 ) 空{
return 444; 一定要注意这几个空格啊!!!!
curl -i -X HEAD 192.168.2.111
curl: (52) Empty reply from server 报错了。
防止buffer溢出: 给缓存内存定义一个最大值 一定要定义一个具体的值。
http{
client_body_buffer_size 1K; 身体内容
client_header_buffer_size 1k; 头部信息
client_max_body_size 1k;
large_client_header_buffers 2 1k;
… …
} 之前写过一个一直循环访问地址的脚本也就是这个!www.a.com/d/a/b/b/d/d/d/d/无限加下去
这个不好验证 但是必须要有!!!