Nginx的安装
# yum install gcc pcre-devel zlib-devel –y
#./configure –prefix=/usr/local/nginx
#make && make install
启动nginx:
# /usr/local/nginx/sbin/nginx
# lsof -i:80
基本配置:
配置文件
worker_processes 1;
定义工作进程的数量。建议为CPU核心数量。(六核为6)
events {
worker_connections 1024;
}
events为进程线程混合工作模式,Apache使用prefork模式.
每个工作进程的最大连接数量。理论上每台服务器的最大连接数为:worker_connections* worker_processes
http {
include mime.types; #定义数据类型($path/conf/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 logs/access.log main;
sendfile on;
#是否以零拷贝的方式来提升文件传输性能。普通应用应开启;下载类应用建议关闭。
#tcp_nopush on;
#防止网络阻塞,在sendfile为on时有效
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server { #定义网站,注意大括号
listen 80;
server_name localhost;
#charset koi8-r; #字符集,默认自动匹配客户端浏览器
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
}
……
发布默认网站:
相关设置字段:
server {
listen 80;
server_name localhost;
location / { 相当于Apache的DocumentRoot,文档根目录
root html;
index index.html index.htm;
}
1)准备网页
[root@Nginx html]# mv index.html index.html.bak
[root@Nginx html]# vim index.html
[root@Nginx html]# cat index.html
Hello,Danny!
[root@Nginx html]# ls
50x.html index.html index.html.bak
2)测试:
elinks http://localhost --dump
Hello,Danny!
防盗链:
制作做一个盗链
nginx服务器上防盗链:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.a.com;
location / {
root html;
index index.html index.htm;
}
location ~*.(gif|jpe?g|png|swf|flv)$ { #匹配图片格式
valid_referers none blocked *.baidu.com; #valid_referers定义允许倒链的
if ($invalid_referer) { #判断如果是不允许倒链的,我们返回403
return 403; #403错误表示服务器收到请求,但拒绝提供页面
}
}
}
}
释义:
none 代表没有referer
blocked 代表有referer但是被防火墙或者是代理给去除了
URL重写:
环境:
13.1.1.1 主机名 www.a.com 扮演nginx提供web和客户端角色
13.1.1.200 主机名www.b.com
客户端访问www.a.com ——> Nginx(www.b.com)
先看一下默认首页
1)nginx配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.a.com;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
2)结合解析
vim /etc/hosts
echo “127.0.0.1 www.a.com” >>/etc/hosts
此时使用浏览器,输入www.a.com即可得到nginx提供的web页面
3)nginx重写,将访问www.a.com的请求交给www.b.com
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.a.com;
location / {
# root html;
# index index.html index.htm;
rewrite ^/$ http://www.b.com;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
4)客户端(nginx)修改域名解析
vim /etc/hosts
127.0.0.1 www.a.com
13.1.1.200 www.b.com
5)设置13.1.1.200的web服务
/etc/init.d/httpd restart
echo “rewrite” > /var/www/html/index.html
6)测试
在nginx浏览器上输入www.a.com ——>得到rewrite
限速:
实验环境:
客户端:13.1.1.200
nginx服务器:13.1.1.1
实验说明:
本实验涉及三个部分,1从下载开始即限速;2下载一定大小后开始限速;3避免下载软件恶意(多进程)下载造成服务器压力多大
实验一:下载开始即限速
1) 先来看一下不限速的现在速率
在nginx文档根目录下创建大文件:
[root@Nginx conf]# dd if=/dev/zero of=/usr/local/nginx/html/bigfile bs=1M count=100
在客户端上测试下载速率
[root@Lvs1 opt]# wget http://192.168.19.253/bigfile
--2016-11-09 22:29:14-- http://13.1.1.1/bigfile
正在连接 13.1.1.1:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:104857600 (100M) [application/octet-stream]
正在保存至: “bigfile”
100%[======================================>] 104,857,600 44.0M/s in 2.3s
2) 配置nginx配置文件限速并重启nginx
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.a.com;
location / {
root html;
index index.html index.htm;
#rewrite ^/$ http://www.b.com;
limit_rate 100k;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
3) 测试限速功能
[root@Lvs1 opt]# wget http://192.168.19.253/bigfile
--2016-11-09 22:35:54-- http://13.1.1.1/bigfile
正在连接 13.1.1.1:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:104857600 (100M) [application/octet-stream]
正在保存至: “bigfile”
0% [ ] 406,120 99.6K/s
实验二:文件下载到一定大小后限速的设置及测试
nginx配置
设置下载到90M之后,按照每秒100k的速率下载。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.a.com;
location / {
root html;
index index.html index.htm;
#rewrite ^/$ http://www.b.com;
limit_rate_after 90m;
limit_rate 100k;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
客户端测试:
[root@Lvs1 opt]# rm -fr bigfile
[root@Lvs1 opt]# wget http://13.1.1.1/bigfile
--2016-11-09 22:37:57-- http://13.1.1.1/bigfile
正在连接 13.1.1.1:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:104857600 (100M) [application/octet-stream]
正在保存至: “bigfile”
[==================================> ] 94,576,640 27.9M/s
[==================================> ] 94,883,840 21.1M/s
[==================================> ] 94,883,840 17.3M/s
[==================================> ] 94,883,840 14.6M/s
[==================================> ] 95,191,040 12.4M/s [==================================> ] 95,191,040 11.0M/s [==================================> ] 95,191,040 9.86M/s eta
实验三:防止恶意下载造成服务器压力多大
1)模拟恶意软件恶意下载
客户端脚本:
#!/bin/bash
for i in `seq 1 10`
do
wget http://192.168.19.253/bigfile >/dev/null &
done
解释:模拟客户端开启10个进程下载服务器资源
执行脚本,忙打ps aux | grep wget 可以看到10个wget进程(慢了看不到)
2)限制每个源IP最多开三个下载
配置文件:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
limit_conn_zone $binary_remote_addr zone=*:300k;
#同一源IP地址最大带宽300K
server {
listen 80;
server_name www.a.com;
location / {
root html;
index index.html index.htm;
#rewrite ^/$ http://www.b.com;
#limit_rate_after 90m;
limit_rate 100k;
limit_conn * 3; //同一源地址最多三个下载进程
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
再次执行恶意下载脚本,忙打ps aux | grep wget,看到只有3个wget进程
root 18505 0.1 0.1 10244 1488 pts/0 S 23:12 0:00 wget http://13.1.1.1/bigfile
root 18507 0.1 0.1 10244 1492 pts/0 S 23:12 0:00 wget http://13.1.1.1/bigfile
root 18514 0.1 0.1 10244 1488 pts/0 S 23:12 0:00 wget http://13.1.1.1/bigfile
root 18517 0.0 0.0 6052 768 pts/0 S+ 23:12 0:00 grep wget
虚拟主机:
实验环境:
OS:rhel6.7
Nginx:1.5.1
客户端:192.168.19.249
Nginx:192.168.19.{253,254}
基于端口:
1) 修改配置文件
[root@Nginx nginx]# vim conf/nginx.conf
server {
listen 80;
# server_name localhost; 跟主机名没关系
location / {
root html;
index index.html index.htm;
}
}
server {
listen 8080;
# server_name localhost; 跟主机名没关系
location / {
root www;
index index.html index.htm;
}
}
2)增加8080端口对应的根目录www及首页文件
mkdir /usr/local/nginx/www
echo 8080 > /usr/local/nginx/www/index.html
3)重启nginx
[root@Nginx nginx]# killall -s HUP nginx
4)验证
elinks http://localhost --dump
elinks http://localhost:8080 --dump
基于域名
1)配置文件
[root@Nginx nginx]# vim conf/nginx.conf
server {
listen 80;
server_name www.a.com;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.b.com;
location / {
root www;
index index.html index.htm;
}
}
2)域名解析
[root@Nginx nginx]# vim /etc/hosts
192.168.19.253 www.a.com
192.168.19.253 www.b.com
3)网页制作
[root@Nginx nginx]# echo "www.a.com" > /usr/local/nginx/html/index.html
[root@Nginx nginx]# echo "www.b.com" > /usr/local/nginx/www/index.html
4)重启服务
[root@Nginx nginx]# killall -s HUP nginx
基于IP(很少用,IP太贵)
1)配置文件
server {
listen 192.168.19.253:80;
# server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 192.168.19.254:80;
# server_name localhost;
location / {
root www;
index index.html index.htm;
}
}
2)查看服务监听端口—此时监听的是从本机上所有网卡过来的http请求
[root@Nginx nginx]# netstat -tlnp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 25183/nginx
3)添加一块网卡(别名),并重启nginx
[root@Nginx nginx]# ifconfig eth0:1 192.168.19.254
[root@Nginx nginx]# killall -s HUP nginx
4)重启服务,查看监听端口—此时监听 192.168.19.253 和 192.168.19.254 网卡进来的请求
[root@Nginx nginx]# netstat -tlunp | grep 80
tcp 0 0 192.168.19.253:80 0.0.0.0:* LISTEN 25060/nginx
tcp 0 0 192.168.19.254:80 0.0.0.0:* LISTEN 25060/nginx
5) 测试
[root@Nginx nginx]# elinks http:// 192.168.19.253--dump
www.a.com
[root@Nginx nginx]# elinks http:// 192.168.19.254--dump
www.b.com
反向代理:
代理(proxy)服务器:
一般是指局域网内部的机器通过代理服务器发送请求到互联网上服务器。代理服务器一般作用在客户端,如FQ神器。
代理(proxy)请求过程:
客户端首先与代理服务器建立连接,然后根据代理服务器所使用的代理协议,请求对目标服务器创建连接、发送请求、获得数据,最后将数据发送给客户端。
Web代理(proxy)服务器是网络的中间实体。代理位于web客户端和web服务器之间,扮演“中间人”的角色。http的代理服务器既是web服务器又是web客户端。
正向代理:(针对客户端的代理)
是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(如:YouTube),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正想代理。
反向代理服务器:(针对服务器的代理)
在服务器端接受客户端的请求,然后把请求分发给具体的服务器进行处理,然后再将服务器的响应结果反馈给客户端。Nginx就是其中的一个反向代理服务器软件。
反向代理和正向代理相反。对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行特别的设置。客户端向反向代理发送连接请求,接着反向代理判断将请求转发给哪一台真实服务器,并将获得的内容返还给客户端。
如图:
用户A始终认为它访问的原始服务器是Z而不是B,但实际上是反向代理服务器Z接受用户A的应答。然后Z从原始服务器B中取得数据,然后发送给A。
由于防火墙的作用,只允许代理服务器Z访问原始服务器B。这样就保护了原始服务器B。
实验:
环境:
客户端:192.168.18.1
代理服务器:192.168.18.254
原始服务器:192.168.18.10
1、配置代理:
server {
listen 80;
server_name localhost;
location / {
#root html; 关闭本机的页面服务
#index index.html index.htm;
proxy_pass http://192.168.18.10; 遇到请求本代理服务器目录的请求,转发给原始服务器。
}
2、配置原始服务器的页面
[root@origin 桌面]# cat /var/www/html/index.html
test page
3、测试
在客户端打开浏览器,输入192.168.18.254---会收到原始服务器提供的页面
小升级---端口映射
1、更改原始服务器的上的httpd程序运行端口号为8080
[root@origin html]# vim /etc/httpd/conf/httpd.conf
#Listen 12.34.56.78:80
Listen 8080
[root@origin html]# service httpd restart
2、修改代理服务器的配置文件
proxy_pass http://192.168.18.10:8080;
(以上解释:将客户端对代理服务器80端口的请求映射到了原始服务器8080端口)
3、测试
客户端浏览器仍可以正常访问原始服务器的页面:test page
看一下整个连接过程:
操作说明:
客户端访问反向代理服务器,在原始服务器上抓包,下面是抓包结果:
从上面的结果来看,
1、先是客户端与反向代理服务器建立连接,然后反向代理服务器再与原始服务器建立连接。
2、对于服务器来说并不知道真正的客户端是谁。
如果想让服务器知道真正的客户端是谁,我们可以对nginx(代理)做一下操作:
在源服务器上抓包看结果:
从上图中可以看出,响应消息中已经有了真实客户端的IP地址了。但是我们去看一下源服务器的日志文件---并没有记录真实客户端的IP地址---而只能看到是代理服务器来要的数据!
如果需要让源服务器日志记录真实客户端的IP地址,修改web软件(如果服务器是nginx则不需要设置)的配置文件如下操作:
LNMP和动态页面:
Lnmp
Php 5.4之前的版本和之后的版本在将其变成服务时操作不同,在lamp架构时使用php-fpm模块将5.4之后的版本变成了服务,下面使用5.4之前的版本将其变成服务,需要用到一个软件:spawn-fcgi
Nginx服务器上:
1、先去安装PHP
[root@smbserver 桌面]# yum install php-* mysql-server mysql -y
2、安装spawn软件包
[root@smbserver 桌面]# rpm -ivh spawn-fcgi-1.6.3-1.el5.i386.rpm(该命令最好用yum安装)
注意安装该软件后会带来一个命令:spawn-fcgi (spawn:引起,酿成,大量生产)
相关选项:
-f 指定生成的fastCGI程序的文件名
-a
绑定地址
-p 绑定端口
-u 指定uid
-g 指定gid,默认是uid的主要组
-P spawn程序的pid文件
-C 生成子进程的数量
[root@Nginx 桌面]# spawn-fcgi -a 127.0.0.1 -u nobody -P /var/run/php.pid -C 5 -p 9000 -f /usr/bin/php-cgi
spawn-fcgi: child spawned successfully: PID: 14544
[root@Nginx 桌面]# ps -ef | grep 14544
nobody 14544 1 0 19:04 ? 00:00:00 /usr/bin/php-cgi
nobody 14545 14544 0 19:04 ? 00:00:00 /usr/bin/php-cgi
nobody 14546 14544 0 19:04 ? 00:00:00 /usr/bin/php-cgi
nobody 14547 14544 0 19:04 ? 00:00:00 /usr/bin/php-cgi
nobody 14548 14544 0 19:04 ? 00:00:00 /usr/bin/php-cgi
nobody 14549 14544 0 19:04 ? 00:00:00 /usr/bin/php-cgi
root 14578 14483 0 19:07 pts/3 00:00:00 grep 14544
管理php-cgi ---使用脚本脚本名称php-cgi
该脚本存放在nginx目录中的liu目录中
3、测试
[root@Nginx 桌面]# php_cgi restart
停止 php-cgi: [确定]
正在启动 php-cgi:spawn-fcgi: child spawned successfully: PID: 14940
[确定]
注:可将该启动管理脚本拷贝到/etc/init.d目录下,符合我们的使用习惯
4、让nginx支持动态页面
location / {
root html;
index index.php index.html index.htm;
#将index.php放到最前面(最优先读取)
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
5、生成一个动态页面
[root@Nginx nginx]# vim html/index.php
释义:date(),定制时间格式;time()调用系统时间
6、测试
本机输入localhost 多次回车会看到不同的页面
Nginx的基础优化:
一、最大连接数
二、独立CPU核心及绑定worker进程
三、压缩
四、缓存
一、最大连接数
• 默认情况下一个程序最多可以打开1024个文件(fd)
• ulimit –n
• 设置 ulimit –SHn 65535 ——> /etc/security/limits.conf永久设置
在/etc/security/limits.conf最后增加如下两行记录
* soft nofile 65535
* hard nofile 65535
• 请求本地资源
• max_clients=min(worker_connections,nofile)
• nofile(/etc/security/limits.conf)为最多开打开的fd
• 作为反向代理服务器
• max_clients=min(worker_connections,nofile)*worker_processes/2
关于上面max_clients计算方法说明:(一般系统的nofile设置都比worker_processes高,所以下面公式可直接使用worker_processes计算)
从用户的角度,http 1.1协议下,由于浏览器默认使用两个并发连接,因此计算方法:
nginx作为http服务器的时候:
max_clients = worker_processes * worker_connections/2
nginx作为反向代理服务器的时候:
max_clients = worker_processes * worker_connections/4
或者从一般建立连接的角度:客户并发连接为1.
nginx作为http服务器的时候:
max_clients = worker_processes * worker_connections
nginx作为反向代理服务器的时候:
max_clients = worker_processes * worker_connections/2
nginx做反向代理时,和客户端之间保持一个连接,和后端服务器保持一个连接。
ab测试:
1、实验环境
客户端:192.168.18.1
服务器192.168.18.254
2、服务器配置文件让服务器提供页面服务
3、客户端ab测试
4、修改配置文件worker_connections和系统的ulimit值为65535并测试
二、将worker进程绑定到固定的CPU核心上
测试用服务器上又四颗核心
1、查看当前nginx的相关进程信息
2、修改配置文件开启3个worker进程。前提是服务器需要有至少3个CPU核心(cat /proc/cpuinfo)
3、查看进程运行在哪个核心上。psr为CPU核心编号
4、我们发现编号为1的核心没有被用到,下面3个worker分别绑在编号为1,2,3的核心上
(设置内核参数(/boot/grub/grub.conf),让每个worker平均分配给cpu。配置文件,重启系统生效。)
5、 重启系统后修改nginx改配置文件,将每个nginx进程绑定到固定的cpu核心上:
因为是四个核心所以四个0000,又因为只给3个worker进程绑定cpu核心上,所以只有三个,1代表核心的位置,从左至右0010 0100 1000,最左边的那个0是给master进程使用的第一块(0)核心,如下:
6、 查看worker进程绑定情况
三、压缩
释义:
开启gzip压缩
http协议的版本(1.0不支持压缩)
当客户端是微软IE1-6版本时,不启用压缩
压缩的数据类型
数据低于1KB时不压缩
指定压缩等级,可选值1~9
指定4个8KB的压缩空间,特点是边压缩边发送,所以32KB的空间是够用的。
四、缓存——指定客户端的缓存有效期
使用缓存的意义:
降低服务器的压力;
减少带宽占用。
实验:
客户端:192.168.18.1
服务器:192.168.18.254
1、设置客户端缓存有效期
2、测试
2.1 客户端访问服务器,可以得到页面。
2.2 服务端关闭nginx,客户端关闭浏览器---打开浏览器---访问192.168.18.254