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; #解决中文乱码
.....
}
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
}
}