nginx

lamp架构之nginx

LAMP狭义上或者说通常是 linux Apache MySQL PHP的简写,即把Apache MySQL PHP 安装在linux系统上,组成一个环境来运行PHP网站,这里的Apache是httpd服务。这些可以安装在一个机器上,也可以安装在多台机器上.
当然,操作系统平台有很多(linux/windows/uinx),传输软件也有多种(apache/nginx/…),包括后台的数据(mysql/pgsql),编译所用的语言也有分类(php/jsp/python)
接下来就聊一下nginx,作为高并发http服务器;或者成为http /tcp和udp Load balance提供负载均衡
实验环境:rhel7.6 selinux and iptables disabled
实验主机: server1 172.25.2.1 nginx
server2 172.25.2.2 RS
server3 172.25.2.3 RS

一.nginx的安装与启用

(一)安装

nginx.org/nginx.com都可以去下载,其中nginx plus是企业服务,收费的.
社区版是源码压缩包,需要自行编译.
直接从官网下载,得到一个压缩包nginx-1.18.0.tar.gz

tar zxf nginx-1.18.0.tar.gz
yum install zip -y  #安装压缩软件
cd nginx-1.18.0/
./configure --help  #获取编译帮助,静态编译
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio  #根据需求添加 --prefix:编译路径  --with-http_ssl_module:https  --with-http_stub_status_module:状态监控 --with-threads --with-file-aio:提供支持  #执行后会有报错,根据报错完善编译环境
yum install gcc -y
 yum install pcre-devel -y
 yum install -y openssl-devel

在这里插入图片描述

[root@server1 nginx-1.18.0]# make  #注意位置

在这里插入图片描述

[root@server1 nginx-1.18.0]# make install

在这里插入图片描述
大小有点大
在这里插入图片描述
在这里插入图片描述

vim auto/cc/gcc
# debug
#CFLAGS="$CFLAGS -g"  #注释掉这行,去掉 debug 模式编译,编译以后程序只有几百 k
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio  #重新安装
make
make install

在这里插入图片描述

(二)启用

cd sbin/
pwd
/usr/local/nginx/sbin
vim ~/.bash_profile  #将nginx写入环境变量
source ~/.bash_profile
nginx -t  #检测配置语法
nginx  #运行 nginx
nginx -s stop #停止服务nginx: master
nginx -s reload #重载会停止这个nginx: worker,master不会停止

在这里插入图片描述

二.配置

(一)Linux下高并发

vim /usr/local/nginx/conf/nginx.conf
worker_processes  auto;  #根据cpu个数分配
nginx -t
nginx -s reload
ab -c10 -n 100000 http://172.25.2.1/index.html  #测压,-c 并发数 -n 访问次数
这样测下来,感觉还可以

1.nginx并发优化

Linux下高并发socket最大连接数所受的各种限制
[root@server1 conf]# sysctl -a | grep file  #Linux系统级的最大打开文件数限制,和内存容量相关
fs.file-max = 200067
[root@server1 conf]# ulimit -a  #用户app级别限制
open files                      (-n) 1024\
因此,需要给nginx扩大一下
vim /etc/security/limits.conf  #修改用户进程可打开文件数限制
nginx           -       nofile          65536
useradd -M -d /usr/local/nginx/ -s /sbin/nologin nginx  #建立nginx,没有建立之前,nginx是以nobody身份运行的
vim /usr/local/nginx/conf/nginx.conf
user  nginx;
events {
    worker_connections  65535;
}
nginx -s reload

在这里插入图片描述

vim /usr/local/nginx/conf/nginx.conf  #需要啥就添加
user  nginx;
worker_processes  4;  #工作进程数(这个是2核的)
worker_cpu_affinity 01 10 01 10;	#cpu有多少个核,就有几位数,1代表内核开启,0代表内核关闭;开了几个进程,就写几个 #例如4核的,想开四个进程 0001 0010 0100 1000 ,worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低
events {
    worker_connections  65535;  #单个工作进程并发连接数 #nginx作为http服务器时:max_clients = worker_processes * worker_connections;nginx作为反向代理服务器时:max_clients = worker_processes * worker_connections / 2
}

http {
    include       mime.types;
    default_type  application/octet-stream;

	sendfile on;  #开启文件高效传输模式,同时设置tcp_nopush 和tcp_nodelay 为on,可以防止网路和磁盘IO阻塞。
	tcp_nopush on; 
	tcp_nodelay on;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
nginx -s reload

(二)负载均衡

在这里插入图片描述

1.基础配置

vim /usr/local/nginx/conf/nginx.conf  #需要啥就添加
user  nginx;
worker_processes  auto;  #工作进程数(根据cpu选取)
events {
    worker_connections  65535; 
}

http {
    upstream westos {
    server 172.25.2.2:80;  #RS
    server 172.25.2.3:80;
    }
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
server {
        listen 80;
        server_name www.westos.org;  #虚拟主机
        location / {
                proxy_pass http://westos;
        }
}
}
nginx -s reload
编写好本地解析

在这里插入图片描述

2.nginx作为http服务器

server2.server3 关闭httpd
在这里插入图片描述

vim /usr/local/nginx/conf/nginx.conf
    upstream westos{
    server 172.25.2.2:80;
    server 172.25.2.3:80;
    server 127.0.0.1 backup;  #将nginx作为http服务器
    }
nginx -t
nginx -s reload

此处nginx的发布文件没有修改,默认的页面
在这里插入图片描述

在这里插入图片描述

3.RS权重

根据每台真实主机的性能给予多次访问

vim /usr/local/nginx/conf/nginx.conf
http {
    upstream westos{
    server 172.25.2.2:80 weight=3;
    server 172.25.2.3:80;
    server 127.0.0.1 backup;
    }
nginx -t
nginx -s reload

在这里插入图片描述

4.IP Hash

请求发送到的服务器由客户端IP地址确定。在这种情况下,使用IPv4地址的前三个八位字节或整个IPv6地址来计算哈希值。该方法保证来自同一地址的请求到达同一服务器,除非该服务器不可用。 当服务器server2down后,会调度到另一台server3,但当server2恢复时,又回到server2

vim /usr/local/nginx/conf/nginx.conf
http {
    upstream westos{
    ip_hash;  
    server 172.25.2.2:80 weight=3;
    server 172.25.2.3:80;
    #server 127.0.0.1 backup;  #不能同时使用
nginx -t
nginx -s reload

在这里插入图片描述

5.不让某台rs提供服务

server 172.25.2.2:80 down;
在这里插入图片描述

6.nginx启动脚本

get nginx.service  #下载好脚本,可以在官网下,注意更改路径
mv nginx.service /etc/systemd/system/
[root@server1 ~]# cat /etc/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.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
nginx -s stop
systemctl start nginx.service  #用这种方式启动

在这里插入图片描述

7.Sticky cookie

nginx plus才有的功能,其实在社区版也可以实现。因为一开始没有添加缓存模块,又是静态编译,因此,得重新安装nginx
clientip -> cdn -> (cdn ip) -> nginx

nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip  #下载这个,并解压
make clean
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
make
systemctl stop nginx.service #不要用这种方式管理nginx
cp /root/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/
vim /usr/local/nginx/conf/nginx.conf
http {
    upstream westos{
    sticky;
    server 172.25.2.2:80;
    server 172.25.2.3:80;
nginx -s reload

真机浏览器访问,当服务器server2down后,会调度到另一台server3,但当server2恢复时,不会回到server2
在这里插入图片描述

(三).nginx升级

Nginx 支持的信号
(1) TERM,INT 快速关闭
(2) QUIT 从容关闭
(3) HUP 平滑重启,重新加载配置文件
(4) USR1 重新打开日志文件,在切割日志时用处比较大
(5) USR2 平滑升级可执行程序
(6) WINCH 从容关闭工作进程

1.平滑升级

get nginx-1.19.1.tar.gz  #下载新版本
tar zxf nginx-1.19.1.tar.gz
[root@server1 nginx-1.19.1]# vim auto/cc/gcc
# debug
#CFLAGS="$CFLAGS -g"
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio  #静态编译,和旧版本配置保持一致
make  #注意到此处就可以,不要make install,只是为了得到obj/nginx
cd /usr/local/nginx/sbin/
cp nginx nginx.old  #备份旧版
cp -f /root/nginx-1.19.1/objs/nginx /usr/local/nginx/sbin/  #将新版覆盖至nginx
ps aux | grep nginx  #过滤nginx进程,获取pid
 kill -USR2 oldpid  #升级新程序
 kill -WINCH oldpid  #关闭原worker进程但保留主进程:为了回退

在这里插入图片描述

2.版本回退

cp -f nginx.old nginx  #还原nginx程序
kill -HUP oldpid  #唤醒原进程
kill -WINCH newpid  #回收新版本的worker进程
kill -QUIT newpid  #关闭新版本主进程

在这里插入图片描述

(四)nginx限流

1.控制单IP并发连接数

http {
limit_conn_zone $binary_remote_addr zone=addr:10m; 
#$binary_remote_addr 表示通过remote_addr这个标识来做限制
#zone=addr:10m 表示生成一个大小为10M,名字为addr的内存区域
...
server {
location /download/ {
    limit_conn addr 1;		#限制并发数
   }
}
nginx -s reload
cd /usr/local/nginx/html
mkdir download   #在该目录下放一个图片

在这里插入图片描述
在这里插入图片描述
limit_rate 10k; #限制带宽
可以通过图片大小,大概计算访问时间
在这里插入图片描述

在这里插入图片描述

2.限制单位时间内的请求数目,以及速度限制

http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;  #rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次
...
server {
location /download/ {
       limit_req zone=one;
#	 limit_req zone=one burst=5  #每秒一次,一次5个
#	 limit_req zone=one burst=5 nodelay;  #低延时
} 
}

在这里插入图片描述
在这里插入图片描述
limit_req zone=one burst=5 #每秒一次,一次5个
在这里插入图片描述
limit_req zone=one burst=5 nodelay; #低延时
在这里插入图片描述

(五) 基本配置

1.自动索引:下载方便

location /download/ {
            autoindex on;
}

在这里插入图片描述

2.Nginx expire缓存配置:

缓存可以降低网站带宽,加速用户访问,缓存期限

location ~ .*\.(gif|jpg|png)$ {
    expires 365d;
    root html;
}

在这里插入图片描述

3.日志轮询,备份

vim /opt/nginxlog.sh  #先做脚本
#!/bin/bash
cd /usr/local/nginx/logs && mv access.log access_$(date +%F -d -1day).log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
chmod +x /opt/nginxlog.sh
crontab -e  #创建定时任务
00 00 * * * /opt/nginxlog.sh
crontab -l

4.禁用不必要的日志记录,以节省磁盘IO的消耗

location ~ .*\.(js|jpg|jpeg|png|css|bmp|gif)$ {
	access_log off;
}

5.站点目录和文件的限制

location ~ ^/images/.*\.(sh|php)$ {
                deny all;
        }

6.限制IP

location /admin {
                allow 172.25.2.250;
                deny all;
        }

在这里插入图片描述
在这里插入图片描述

if ($remote_addr = 172.25.2.250) {
	return 403;
}

7.中文乱码

在这里插入图片描述

    server {
        listen       80;
        server_name  localhost;
        charset utf-8;  #解决中文乱码
.....
}

在这里插入图片描述

HTTP状态码

8.防止域名恶意解析到服务器IP

(1)http服务器nginx IP对外不让直接访问

server { 
	listen 80; 
	server_name   _; 
	return 500; 
} 

在这里插入图片描述
直接访问IP时,重定向到其他网页

server {
        listen       80;
        server_name  _;
        charset utf-8;
        rewrite ^(.*) http://www.westos.org permanent;  #可以重定向到别的网页
}

在这里插入图片描述
(2)加密网站或重定向加密网站,提高网站安全.

#80重定向443:
    server {
        listen       443 ssl;
        server_name  www.westos.org;  #只加密此域名

        ssl_certificate      cert.pem;
        ssl_certificate_key  cert.pem;  #密钥搞成一样

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;  #nginx本身作为http服务器
            index  index.html index.htm;
        }
    }
server {
        listen 80;
        server_name www.westos.org;
        rewrite ^/(.*)$ https://www.westos.org/$1 permanent;  #将nginx的所有网页重定向到加密网页
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.子网页的重定向

#www.westos.org/bbs 重定向bbs.westos.org:  #网页中的某一板块需要独立出去
rewrite ^/bbs$ http://bbs.westos.org permanent;
rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent;
server {  #www.westos.org服务器server2和3
        listen 80;
        server_name www.westos.org;
        rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent; #本机作为一个服务器,且是www.westos.org中的分出来的服务区域

        location / {
                proxy_pass http://westos;
        }
}
server {
        listen 80;
        server_name bbs.westos.org;
        location / {
                root /bbs;
                index index.html;
        }
}

#bbs.westos.org 重定向www.westos.org/bbs:
if ($host = "bbs.westos.org"){
	rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent;
}

在这里插入图片描述
在这里插入图片描述

10.nginx 防盗链

    server {
        listen       80;
        server_name  www.westos.org;
         location /download/ {
         }
   }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

禁止盗链
禁止盗链

接上面
        location ~ \.(jpg|png)$ {
                valid_referers none blocked www.westos.org;   #不是直接访问www.westos.org,返回403
                if ($invalid_referer) {
                        return 403;
                        #rewrite ^/ http://www2.westos.org/daolian.jpg;
                }
        }

在这里插入图片描述

        location ~ \.(jpg|png)$ {
                valid_referers none blocked www.westos.org;
                if ($invalid_referer) {
                        #return 403;
                        rewrite ^/ http://www3.westos.org/daolian.jpg;  #重定向到server3
                }
        }

在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值