第一章 Nginx介绍
Nginx(engine x):是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。
Nginx特点是占有内存小,并发处理能力强。此外,还有Apache Lighttpd,Tengine(阿里巴巴)等服务器。
Nginx处理不了动态资源,只能做静态资源。
Nginx不处理请求,只是转发请求。
1.1 正向代理和反向代理
- 正向代理:类似一个跳板机,类似,我想访问外网但访问不了,所以我先访问一个代理服务器,代理服务器访问外网,将外网内容取回,然后发给我。
- 反向代理:以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器
1.2 Nginx安装
#centos安装
yum list installed | grep gcc #检查是否安装gcc编译器
yum install gcc #安装gcc
yum list installed | grep openssl #检查是否安装openssl
yum install openssl openssl-devel -y
yum list installed | grep pcre
yum install pcre pcre-devel -y
yum list installed | grep zlib
yum install zlib zlib-devel -y
#一次性安装所有依赖
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
#ubuntu安装,ubuntu不支持yum
apt-get install openssl libssl-dev #后者取代了openssl-devel
apt-get install libpcre3-dev #取代了pcre
apt-get install zlib1g-dev #取代了zlib-devel
#注意:wget不是断点传输
#依赖安装好后,解压nginx,进入nginx根目录
./configure --prefix=/usr/local/nginx #指定前缀目录
#编译
make
#安装
make install
#进入/usr/local/nginx,有四个文件夹
conf html logs sbin
conf:装的是配置文件,主要是nginx.conf文件
html:包括50x.html和index.html,两个静态页面,报错会跳转到这
logs:日志存放位置
sbin:只有一个nginx文件,是nginx启动文件
#额外命令补充
ps 命令的作用是显示进程信息的;
| 符号,是个管道符号,表示ps 和 grep 命令同时执行;
grep 命令是查找(Global Regular Expression Print),能使用正则表达式搜索文本,然后把匹配的行显示出来;
ps命令有一些参数:
-e : 显示所有进程
-f : 全格式
-h : 不显示标题
-l : 长格式
-w : 宽输出
a :显示终端上的所有进程,包括其他用户的进程。
r :只显示正在运行的进程。
u :以用户为主的格式来显示程序状况。
x :显示所有程序,不以终端机来区分。
启动:
#执行启动文件
./nginx
#查看进程
ps -ef | grep nginx
>>> root 8880 1466 0 19:47 ? 00:00:00 nginx: master process ./nginx
nobody 8881 8880 0 19:47 ? 00:00:00 nginx: worker process
#master主进程,负责维护所有工作进程
#worker进程负责将请求进行转发
#指定配置文件启动
./nginx -c nginx.conf -t #-c是指定后面的是配置文件目录,-t是检查配置文件是否有问题
关闭:
#找出进程号
ps -ef | grep nginx
#杀死进程
kill -QUIT 主pid #杀死master的pid,这种方式,nginx会在处理完所有请求后关闭
kill -TERM 主pid #这种方式,直接杀死,不管剩下的请求是否处理
重启
./nginx -s reload #当修改配置后想让其生效,就可以重启
1.3 niginx命令和配置文件
./nginx -v #查看nginx版本
./nginx -V #查看nginx的版本,编译器版本,和配置参数
#配置文件
#配置worker进程运行用户 nobody也是一个linux用户,一般用于启动程序,没有密码
user nobody;
#配置工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
worker_processes 1;
#配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid; #配置进程pid文件
###====================================================
#配置工作模式和连接数
events {
worker_connections 1024; #配置每个worker进程连接数上限,nginx支持的总连接数就等于worker_processes * worker_connections,上限为65535
}
###===================================================
#配置http服务器,利用它的反向代理功能提供负载均衡支持
http {
#配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型
include 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日志及存放路径,并使用上面定义的main日志格式
#access_log logs/access.log main;
sendfile on; #开启高效文件传输模式
#tcp_nopush on; #防止网络阻塞
#keepalive_timeout 0;
keepalive_timeout 65; #长连接超时时间,单位是秒
#gzip on; #开启gzip压缩输出
###-----------------------------------------------
#配置虚拟主机
server {
listen 80; #配置监听端口
server_name localhost; #配置服务名
#charset koi8-r; #配置字符集
#access_log logs/host.access.log main; #配置本虚拟主机的访问日志
#默认的匹配斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理
location / {
#root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
root html; #这里的内容就代表location处的/,会去找location下的index
#配置首页文件的名称
index index.html index.htm;
}
#error_page 404 /404.html; #配置404页面
# redirect server error pages to the static page /50x.html
#error_page 500 502 503 504 /50x.html; #配置50x错误页面
#精确匹配
location = /50x.html {
root html;
}
#PHP 脚本请求全部转发到Apache处理
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
#PHP 脚本请求全部转发到FastCGI处理
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
#禁止访问 .htaccess 文件
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
#配置另一个虚拟主机
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
#配置https服务,安全的网络传输协议,加密传输,端口443,运维来配置
#
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
1.4 Nginx主要应用
- 静态网站部署
- 负载均衡
- 静态代理
- 虚拟主机
第二章 静态网站部署
Nginx是一个HTTP的web服务器,可以将服务器上的静态文件(如HTML,图片等)通过HTTP协议返回给浏览器客户端。
#修改配置文件并将相关静态资源放入相应的目录
location /ace { #拦截ace请求
root /opt/www; #这里的内容就代表location处的/,会去找/opt/www/ace下的login.html
index login.html;
}
#部署nginx
./nginx -c nginx_ace.conf
#或者
./nginx -s reload
第三章 负载均衡
3.1 两种方式实现负载均衡
-
硬件负载均衡
比如F5,深信服,Array等
-
软件负载均衡
比如nginx,LVS,HAProxy等
3.2 Nginx负载均衡
-
原理图:
用户——>Nginx——>{Tomcat,Tomcat,Tomcat……} //{……}动态资源
-
实现
#服务器部署 #在tomcat的webapps目录下放入war包即可,其他的差不多, #记得修改不同tomcat的端口号,比如一个是启动端口8080,一个是日志端口8005 #修改nginx的配置文件 upstream www.myweb.com{ server 192.168.213.133:8081; server 192.168.213.133:8082; } location /myweb{ proxy_pass http://www.myweb.com } #启动nginx和tomcat服务器
-
负载均衡策略
-
轮询策略(默认):
要求不同服务器的性能相差不多,避免性能差的机器请求堆积。
-
权重策略:
upstream backserver{ server 192.168.213.132 weight=5; server 192.168.213.132 weight=2; }
-
最少连接
web请求会被抓发到连接数最少的服务器上
upstream backserver{ least conn; server 192.168.213.133:8080; server 192.168.213.133:8081; }
-
ip_hash
ip_hash也叫IP绑定,每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题 算法:hash("124.207.55.82")%2 = 0,1 因为有两台机器,所以模2 upstream backserver{ ip_hash; server 192.168.213.133:8080; server 192.168.213.133:8081; }
-
-
负载均衡的其他配置
配置1: upstream backserver{ server 192.168.213.133:9100; #其他所有非backup机器down的时候,才请求backup机器,backup,备份 server 192.168.213.133:9200 backup; } 配置2: upstream backserver{ server 192.168.213.133:9100; #down 表示当前的server是down状态,不参与负载均衡 server 192.168.213.133:9200 down; }
第四章 静态代理
把所有静态资源的访问改成访问nginx,而不是访问tomcat,这种方式叫做静态代理。因为nginx更擅长处理静态资源,性能更好,效率更高。
所以实际应用中,会将静态资源比如图片,css,html,js等交给nginx处理,而不是由tomcat处理。
4.1 Nginx静态代理实现方式
-
方式一,在nginx.conf 的location中配置静态资源的后缀
#正则表达式,当需要静态资源时,从root指定的目录拼接请求的目录去找 location~.*\.(js|css|html|htm|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)${ root /opt/static; }
-
方式二,在nginx.conf的location中配置静态资源所在目录实现
#例如,当访问静态资源时,从linux服务器中配置静态资源所在目录实现 location ~.*/(css|js|img|images){ root /opt/static; }
第五章 动静分离
通过将Nginx的负载均衡和静态代理结合在一起,可以实现动静分离。
动态资源:如jsp由tomcat或其他web服务器完成
静态资源:如图片,css,js等由nginx服务器完成
#主nginx,负责负载均衡
upstream www.p2p.com{
ip_hash;
server 192.168.213.133:8081;
server 192.168.213.133:8082;
}
upstream static.p2p.com{ #如果需要静态资源,就过滤到这两个nginx上处理
server 192.168.213.133:81;
server 192.168.213.133:82;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#location / {
# root html;
# index index.html index.htm;
#}
location /p2p {
proxy_pass http://www.p2p.com;
}
location ~ .*/(css|images|img|js){ #过滤静态资源
proxy_pass http://static.p2p.com;
}
#81端口的nginx,负责处理静态资源
server {
listen 81;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#location / {
# root html;
# index index.html index.htm;
#}
location ~ .*/(css|images|js|img){
root /opt/static;
}
#81端口的nginx,负责处理静态资源
server {
listen 82;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#location / {
# root html;
# index index.html index.htm;
#}
location ~ .*/(css|js|images|img){
root /opt/static;
}
第六章 虚拟主机
虚拟主机,就是把一台物理服务器划分为多个虚拟服务器,从而可以配置多个网站。
Nginx提供虚拟主机的功能,Nginx下,一个server标签就是一个虚拟主机。Nginx的虚拟主机就是通过nginx.conf中 server节点指定的,想要设置多个虚拟主机,配置多个server节点即可。
6.1 配置虚拟主机方式
-
基于端口的虚拟主机
基于端口的虚拟主机配置,使用端口来区分
游览器使用同一个域名+端口 或者同一个ip地址+端口访问
server{ listen 8080; server name www.myweb.com; location /myweb{ proxy_pass http://www.myweb.com; } } server{ listen 9090; server name www.myweb.com; location /p2p{ proxy_pass http://www.p2p.com; } }
-
基于域名的虚拟主机
server{ listen 80; server name www.myweb.com; location /myweb{ proxy_pass http://www.myweb.com; } } server{ listen 80; server name www.p2p.com; location /p2p{ proxy_pass http://www.p2p.com; } } DNS将域名绑定到ip地址,这样就可以通过域名访问到服务器。 目前,没有DNS,可以修改host文件 192.168.213.133 beijing.myweb.com 192.168.213.133 tianjing.myweb.com 192.168.213.133 nanjing.myweb.com 三个域名都是访问到相同的ip地址,经过拦截器会判断这三个域名和哪个server的servername相同,就会交给哪个server来处理。