Apache与nginx的区别
apache:
- 进程,稳定
- 模块超多,基本想到的都可以找到
- 少bug ,nginx 的bug 相对较多
nginx:
- 线程,快,不稳定。多线程是共享的,一个线程出问题,其他的也会受牵连。
- 7层调度,反向代理能力强。CDN这块nginx也用的多
- 轻量级,同样起web 服务,比apache占用更少的内存及资源
- 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
- 高度模块化的设计,编写模块相对简单
- 社区活跃,各种高性能模块出品迅速啊
- 自带健康检查
反向代理
正向代理:服务器不知道用户是谁
用浏览器访问 http://www.google.com 时,被残忍的block,于是你可以在国外搭建一台代理服务器,让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。
A同学去找马云爸爸借钱,马云没有借,经过一番消息打探,原来A同学的大学老师王老师是马云的同学,于是A同学找到王老师,托王老师帮忙去马云那借500万过来,当然最后事成了。不过马云并不知道这钱是A同学借的,马云是借给王老师的,最后由王老师转交给A同学。这里的王老师在这个过程中扮演了一个非常关键的角色,就是代理,也可以说是正向代理,王老师代替A同学办这件事,这个过程中,真正借钱的人是谁,马云是不知道的,这点非常关键。
反向代理:用户不知道服务器是谁
反向代理一般部署在中心机房,用户首先访问的是反向代理服务器,再由反向代理服务器请求真正的服务器。获得结果后将结果返回给用户。同时会将次内容缓存,当其他用户再次访问时,就可以命中
缓存,直接将结果返回给用户,就不会请求真实服务器。提高相应速度。
1.拿10086来说,当你想要人工办理移动业务时,拨打10086(10086这个号码就相当于反向代理服务器),进行业务的过滤分类后,你将被分配到真正主管该业务的话务员(相当于真正的服务器)
2.cdn主要解决地理距离上造成的访问延迟高的情况。一般部署在网络提供商的机房。
通常情况下,当访问大型企业时,由于客户所在地址离企业的服务器的距离不同,有些客户距离比较近,有些客户距离比较远,那么距离远的客户访问企业服务器时,客户端数据会经过层层路由,最终访问企业服务器的延时就会相当高,这无疑拉低用户体验。
所以企业一般会在不同地方租用一个服务器来当时缓存企业服务器上的内容,当用户访问企业服务器时,会首先访问企业租用的距离用户较近的这台服务器上的缓存,当租用的服务器上有用户所需的信
息,直接返回数据,达到加速的目的,这就是通常所说的cnd加速。
nginx源码编译
rewrite ,比nginx 的rewrite 强大
动态页面
模块超多,基本想到的都可以找到
少bug ,nginx 的bug 相对较多
超稳定
先关闭集群避免影响
[root@server1 ~]# pcs cluster stop --all
server2: Stopping Cluster (pacemaker)...
server1: Stopping Cluster (pacemaker)...
server1: Stopping Cluster (corosync)...
server2: Stopping Cluster (corosync)...
[root@server1 ~]# pcs cluster disable --all
server1: Cluster Disabled
server2: Cluster Disabled
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
[root@server2 ~]# ls
nginx-1.18.0.tar.gz
[root@server2 ~]# tar zxf nginx-1.18.0.tar.gz
[root@server2 ~]# ls
nginx-1.18.0 nginx-1.18.0.tar.gz
[root@server2 ~]# cd nginx-1.18.0/
[root@server2 nginx-1.18.0]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
[root@server2 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module # ssh用的ssl协议 --prefix默认安装目录
checking for OS
+ Linux 3.10.0-957.el7.x86_64 x86_64
checking for C compiler ... not found
错误一:./configure: error: C compiler cc is not found #缺少gcc编译器
[root@server2 nginx-1.18.0]# yum install -y gcc
错误二:./configure: error: the HTTP rewrite module requires the PCRE library. #缺少pcre库 ##缺少什么库一般在后面加个-devel
[root@server2 nginx-1.18.0]# yum install -y pcre-devel
错误三:./configure: error: SSL modules require the OpenSSL library.
[root@server2 nginx-1.18.0]# yum install -y openssl-devel
[root@server2 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
Configuration summary
- using system PCRE library
- using system OpenSSL library
- using system zlib library # zlib 是ssl的依赖 用来压缩
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
[root@server2 nginx-1.18.0]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README src
[root@server2 nginx-1.18.0]# ll Makefile # 记录编译时指定的参数,加的模块
-rw-r--r-- 1 root root 376 Aug 8 13:48 Makefile
[root@server2 nginx-1.18.0]# make #编译是在当前目录中把源码编译成二进制程序
[root@server2 nginx-1.18.0]# make install # copy二进制程序到指定的目录
- 1
- 2
- 3
- 4
- 5
- 6
[root@server2 nginx-1.18.0]# du -sh
27M .
[root@server2 nginx-1.18.0]# du -h /root/nginx-1.18.0.tar.gz
1016K /root/nginx-1.18.0.tar.gz
[root@server2 nginx-1.18.0]# cd /usr/local/nginx/
[root@server2 nginx]# ls
conf html logs sbin
[root@server2 nginx]# du -sh
5.8M .
[root@server2 nginx]# cd sbin/
[root@server2 sbin]# ls
nginx
[root@server2 sbin]# ./nginx -v
nginx version: nginx/1.18.0
[root@server2 sbin]# ./nginx
[root@server2 sbin]# netstat -antlp|grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 12228/nginx: master
tcp6 0 0 :::8000 :::* LISTEN 3178/httpd
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
nginx优化
[root@server2 ~]# cd nginx-1.18.0/
[root@server2 nginx-1.18.0]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README src
[root@server2 nginx-1.18.0]# cd auto/
[root@server2 auto]# ls
cc feature headers install module options stubs types
define have include lib modules os summary unix
endianness have_headers init make nohave sources threads
[root@server2 auto]# cd cc
[root@server2 cc]# ls
acc bcc ccc clang conf gcc icc msvc name owc sunc
[root@server2 cc]# vim gcc
# debug
#CFLAGS="$CFLAGS -g" #注释掉,我们不需要debug,有debug会占内存更大
[root@server2 cc]# cd
[root@server2 ~]# cd nginx-1.18.0/
[root@server2 nginx-1.18.0]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README src
[root@server2 nginx-1.18.0]# cd src/
[root@server2 src]# ls
core event http mail misc os stream
[root@server2 src]# cd core/
[root@server2 core]# vim nginx.h
define NGINX_VER "nginx/" # 删除版本号,安全
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
[root@foundation4 ~]# curl -I www.jd.com
HTTP/1.1 302 Moved Temporarily
Server: nginx # 没有显示版本号
Date: Thu, 13 Aug 2020 06:00:22 GMT
Content-Type: text/html
Content-Length: 138
Connection: keep-alive
Location: https://www.jd.com/
Access-Control-Allow-Origin: *
Timing-Allow-Origin: *
X-Trace: 302-1597298422195-0-0-0-0-0
Strict-Transport-Security: max-age=360
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
设置成systemd启动方式
[root@server2 ~]# cd /usr/lib/
[root@server2 lib]# ll -d /lib
lrwxrwxrwx. 1 root root 7 Aug 4 11:28 /lib -> usr/lib
[root@server2 lib]# cd systemd/
[root@server2 systemd]# cd system
[root@server2 system]# vim nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
[root@server2 logs]# killall nginx
[root@server2 logs]# systemctl start nginx
[root@server2 logs]# pwd
/usr/local/nginx/logs
[root@server2 logs]# ls
access.log error.log nginx.pid
[root@server2 logs]# systemctl daemon-reload #刷新
- 1
- 2
- 3
- 4
- 5
- 6
- 7
nginx实现负载均衡
[root@server2 logs]# cd ..
[root@server2 nginx]# ls
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
[root@server2 nginx]# cd conf/
[root@server2 conf]# ls
fastcgi.conf koi-utf nginx.conf uwsgi_params
fastcgi.conf.default koi-win nginx.conf.default uwsgi_params.default
fastcgi_params mime.types scgi_params win-utf
fastcgi_params.default mime.types.default scgi_params.default
[root@server2 conf]# ll nginx.conf # nginx主配置文件
-rw-r--r-- 1 root root 2656 Aug 8 13:53 nginx.conf
[root@server2 conf]# vim nginx.conf
user nobody; # 默认情况下这个程序以nobody的身份执行
worker_processes 1; # worker数量和cpu核心数量相同,不知道可以设置成auto
[root@server2 conf]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
[root@server2 conf]# vim nginx.conf
12 events { #时间
13 worker_connections 65535; # 每个worker并发连接数 #应用
14 }
- 1
- 2
- 3
- 4
- 5
kernel > systemctl > app
应用的最大连接数肯定不会大于系统和内核的,写的比系统大了也没用,内核和系统的最大连接数就是限制。内核的最大连接数和内存有关,无法更改
[root@server2 conf]# sysctl -a|grep file # 内核
fs.file-max = 97765
fs.file-nr = 1312 0 97765
fs.xfs.filestream_centisecs = 3000
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
[root@server2 conf]# useradd -M -d /use/local/nginx -s /sbin/nologin nginx
-M:不创建用户的家目录 -d 指定家目录 -s : 登陆的shell
[root@server2 conf]# vim /etc/security/limits.conf #系统
热插拔模块,即改即生效
nginx - nofile 65535 ## - 软线和硬线都一样
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
nginx的负载均衡是通过反向代理实现的
[root@server2 conf]# vim nginx.conf
##定义:
http { #超文本传输协议
upstream westos{
server 172.25.4.3; ## 支持端口映射,不设置默认80
server 172.25.4.4;
}
include mime.types;
default_type application/octet-stream;
通过uptream定义一个名为westos的负载均衡器,在负载均衡器里有两个RS
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
使用:
40
41 server { #一个server语句块就是一个虚拟主机,针对www.westos.org
42 listen 80;
43 server_name www.westos.org; # 负载均衡可能针对某一个域名
44
45 #charset koi8-r;
46
47 #access_log logs/host.access.log main;
48
49 location / {
50 proxy_pass http://westos; #负载均衡
51 index index.html index.htm;
52 }
53
[root@server2 conf]# systemctl reload nginx
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
测试:
[root@server1 ~]# curl 172.25.4.2
vm4
[root@server1 ~]# curl 172.25.4.2
vm3
[root@server1 ~]# curl 172.25.4.2
vm4
[root@server1 ~]# curl 172.25.4.2
vm3
[root@server1 ~]# vim /etc/hosts
172.25.4.2 server2 www.westos.org
[root@server1 ~]# curl www.westos.org
vm4
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm4
[root@server1 ~]# curl www.westos.org
vm3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
[root@server2 conf]# vim nginx.conf
20 server 172.25.4.3 weight=2; # 权重
[root@server2 conf]# systemctl reload nginx
- 1
- 2
- 3
- 4
- 5
测试:
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm4
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm4
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
hash函数
[root@server2 conf]# vim nginx.conf
17 http {
18
19 upstream westos{
20 ip_hash; # hash函数,定向到一个server
21 server 172.25.4.3;
22 server 172.25.4.4;
23 }
[root@server2 conf]# systemctl reload nginx
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
测试:
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
nginx自带健康检查
[root@server3 ~]# systemctl stop httpd
## server3关闭http服务,nginx检测到就不会分配给server3了
- 1
- 2
测试:
[root@server1 ~]# curl www.westos.org
vm4
[root@server1 ~]# curl www.westos.org
vm4
[root@server1 ~]# curl www.westos.org
vm4
- 1
- 2
- 3
- 4
- 5
- 6
[root@server3 ~]# systemctl start httpd
## 启动server3就会再次加入到调度列表
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
nginx应用
[root@server2 conf]# mkdir /www1
[root@server2 conf]# echo www1 > /www1/index.html
[root@server2 conf]# mkdir /www2
[root@server2 conf]# echo www2 > /www2/index.html
- 1
- 2
- 3
- 4
[root@server2 conf]# vim nginx.conf
server {
listen 80;
server_name www1.westos.org; # 访问哪个域名就调度哪个模块
location / { # location:定位数据目录
root /www1;
index index.html;
}
}
server {
listen 80;
server_name www2.westos.org;
location / {
root /www2;
index index.html;
}
}
}
[root@server2 conf]# systemctl reload nginx
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
[root@foundation4 ~]# vim /etc/hosts
172.25.4.2 server2 www1.westos.org www2.westos.org www.westos.org
- 1
- 2
- 3
网页测试:
www1.westos.org
www2.westos.org
www.westos.org #负载均衡
访问哪个域名就调用哪个模块
- 1
- 2
- 3
- 4
[root@server2 conf]# vim nginx.conf
http {
upstream westos{
server 172.25.4.3;
server 172.25.4.4;
}
upstream redhat{
ip_hash;
server 172.25.4.3;
server 172.25.4.4;
}
server {
listen 80;
server_name www1.westos.org;
location / {
# root /www1;
# index index.html;
proxy_pass http://westos;
}
}
server {
listen 80;
server_name www2.westos.org;
location / {
# root /www2;
# index index.html;
proxy_pass http://redhat;
}
}
}
[root@server2 conf]# systemctl reload nginx
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
网页测试:
www1.westos.org #负载均衡
www2.westos.org #hash
- 1
- 2