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/无限加下去

			这个不好验证 但是必须要有!!!