一,概述
1.
1)了解是什么架构
数据库是否主从,拆库;四层还是七层负载均衡;web是nginx还是tomacat等;php还是python还是tomacat;是否有nfs,是否 有radis
2) 了解业务模式
比如有抢购,每个web有7个服务,2台web服务器备用,只需要在备用的服务器上加上高峰期用的服务进程就可以
3) 系统层次的结构
比如在每一个环节配置负载均衡
4) 性能和安全
比如设计防火墙会对性能产生影响,注意权衡
2,从哪些方面入手
osi七层模型
1,硬件:nginx代理(cpu) nginx做静态自由元存储(磁盘) PHP动态资源(cpu 内存) 买什么服务器前考虑好它的用处
2,网络:带宽 是否有丢包(crc和缓冲溢出导致丢包)延迟
3,系统:文件描述符
4,应用:服务与服务之间的连接(长连接,短连接)
5,服务:静态资源优化(开缓存)
二,压力测试工具
1)下载工具
[root@web03 wordpress]# yum install -y httpd-tools
2)配置hosts
[root@web03 ~]# cat /etc/hosts
...
10.0.0.9 linux.proxy.com
3)测试nginx访问静态资源
[root@web03 ~]# cat /etc/nginx/conf.d/linux.try.com.conf
server {
listen 80;
server_name linux.try.com;
location / {
root /code/try;
try_files $uri $uri/ @java;
}
location @java {
proxy_pass http://10.0.0.9:8080;
}
}
[root@web03 ~]# mkdir /code/try
[root@web03 ~]# echo "ab_test_nginx" > /code/try/index.html
本地配置hosts
[root@web03 ~]# cat /etc/hosts
......
10.0.0.9 linux.try.com
访问:
[root@web03 ~]# ab -n 10000 -c 200 http://linux.try.com/
...
Time taken for tests: 0.871 seconds
...
处理的时间是0.871秒
4)测试tomcat访问静态资源
[root@web03 ~]# rm -rf /code/try/
访问
[root@web03 ~]# ab -n 10000 -c 200 http://linux.try.com/
...
Time taken for tests: 7.665 seconds
5) 测试httpd处理静态请求的时间
[root@web03 ~]# yum install -y httpd
[root@web03 ~]# echo "ab_test_httpd" > /var/www/html/index.html
[root@web03 ~]# systemctl stop nginx
[root@web03 ~]# systemctl start httpd
访问
[root@web03 ~]# ab -n 10000 -c 200 http://10.0.0.9/
...
Time taken for tests: 1.938 seconds
....
##
由此得出,处理静态资源时,nginx要优于其他web服务,其中必tomcat快很多,比httpd服务快一点点
三, 系统性能优化
1,查看文件句柄上数
查看设置的文件句柄数
[root@web03 ~]# ulimit -n
65535
查看一个进程的文件句柄数
[root@web03 ~]# ps -ef | grep nginx
root 21143 1 0 19:17 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
...
[root@web03 ~]# lsof -p 21143 | wc -l
32
查看服务器一共打开的文件句柄数
[root@web03 ~]# lsof | wc -l
6917
2,设置文件句柄数
[root@web03 ~]# vim /etc/security/limits.conf (翻到最下面)
....
* - nofile 65535
#1.系统全局的文件句柄数
* - nofile 65535
* soft nofile 65535
* hard nofile 65535
* 代表所有用户
soft 如果达到设置的文件句柄数 ,只提示
hard 如果达到设置的文件句柄数 ,直接限制
nofile 指定打开文件描述符的数量
#2.用户局部限制的文件句柄数
www - nofile 65535
www soft nofile 65535
www hard nofile 65535
#3. 配置服务本身的限制描述符
[root@web03 ~]# vim /etc/nginx/nginx.conf
user www;
worker_processes 1;
worker_rlimit_nofile 65535;
....
3.内核参数优化
查看内核参数
[root@web03 ~]# sysctl -a
查看配置过的内核参数
[root@web03 ~]# sysctl -p
配置过的内核参数在以下文件
[root@web03 ~]# vim /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1 time_wait端口复用
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
net.ipv4.ip_forward = 1 开启内核转发
4,影响性能的指标
1)网络
2)系统
硬件
系统的复制内存
3)服务
连接优化 -- 长连接;请求优化
针对业务去设置
4)程序 -- php-fpm.d/php.ini
5)数据库
四, 代理服务优化
服务器 ---> LB -> web --> php 每一步都打开长连接
1,浏览器到 LB
[root@lb01 ~]# vim /etc/nginx/nginx.conf
....
keepalive_timeout 65;
keepalive_timeout 65 只要不为0,都可以
2,LB到web
[root@lb01 conf.d]# vim linux.wp.com.conf
server {
upstream wp_web {
server 172.16.1.7;
server 172.16.1.9;
keepalive 32;
}
listen 443 ssl;
server_name linux.wp.com;
ssl_certificate /etc/nginx/ssl_key/server.crt;
ssl_certificate_key /etc/nginx/ssl_key/server.key;
location / {
proxy_pass http://wp_web;
proxy_http_version 1.1;
proxy_connect_timeout 60s; 如果下面proxy_params包含可不配置
include /etc/nginx/proxy_params;
fastcgi_param HTTPS on;
}
}
server {
listen 80;
server_name linux.wp.com;
#rewrite (.*) https://$server_name$1;
return 302 https://$server_name$request_uri;
nginx优化如下
[root@lb01 code]# vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 8 128k;
proxy_http_version 1.1;
注意:长连接配置不要和/etc/nginx/proxy_params重复,会报错
3,配置web服务代理到PHP保持长连接
[root@web03 ~]# vim /etc/nginx/conf.d/wordpress.conf
upstream php {
server 127.0.0.1:9000;
keepalive 16;
}
server {
listen 80;
server_name linux.wp.com;
root /code/wordpress;
location / {
index index.php;
}
location ~* \.php$ {
fastcgi_pass php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_keep_conn on;
#fastcgi_connect_time 60s;
include fastcgi_params;
if (!-e $request_filename) {
rewrite (.*) /1.jpg;
}
}
}
4,配置python长连接
location ~* \.py$ {
uwsgi_pass php;
uwsgi_socket_keepalive on;#开启后端长连接
uwsgi_send_timeout 60s;#长连接超时时间
}
五、静态资源优化
1,静态资源缓存
[root@lb01 ~]# vim /etc/nginx/mime.types
1)浏览器是否走缓存到流程
1)浏览器请求服务器,会先查看浏览器的expires和ccache-control(值一样)检查缓存时间是否过期,如果没有,走缓存;
2)如果没有设置expires和cache-control,浏览器会读取浏览器会去读取if-none-match,与服务器删过的etag对比,如果值一致,走缓存
3)如果etag值不一致,浏览器会去读取if_modified_since,与服务器上的last_modified对比,如果一致走缓存
2)缓存时间设置
[root@web01 ~]# vim /etc/nginx/conf.d/linux.huancun.com.conf
server {
listen 80;
server_name linux.huancun.com;
location ~* \.(jpg|png) {
root /code/huancun;
expires 7d;
}
}
[root@web01 ~]# mkdir -p /code/huancun
[root@web01 ~]# cd /code/huancun/
[root@web01 huancun]# ll
-rw-r--r-- 1 root root 13467 2020-09-15 03:25 1.jpg
[root@web01 huancun]# systemctl restart nginx
配置hosts访问
3)设置不走缓存
1)使用浏览器无痕模式
2)选中浏览器的disable cache
如下配置
[root@web01 huancun]# vim /etc/nginx/conf.d/linux.huancun.com.conf
server {
listen 80;
server_name linux.huancun.com;
location ~* \.(jpg|png) {
root /code/huancun;
add_header Cache-Control no-store;
add_header Pragma no-cache;
}
}
[root@web01 huancun]# systemctl restart nginx
访问
2.静态资源读取优化
[root@web01 ~]# vim /etc/nginx/nginx.conf
1)文件高效读取配置语法
sendfile on;
2)高效传输(传输效率高,适合大文件,多个一起传输)
tcp_nopush on
3)长连接传输(适合小文件,来一个传一个,传输效率快)
tcp_nodelay on
3,静态资源压缩
1)静态资源压缩语法
#gzip开启传输压缩
gzip on
#gzip压缩哪些文件
gzip_types text/html (/etc/nginx/mime.types里找)
#压缩的级别,加快传输速度,值越小越快,但是压缩本身需要时间
gzip_comp_level 5 #一般给3-5级别
#压缩时使用的协议版本
gzip_http_version 1.1;
2)压缩传输实例
[root@web01 ~]# vim /etc/nginx/conf.d/gizp.com.conf
server {
listen 80;
server_name linux.gzip.com;
root /code/gzip;
location ~* \.(jpg|png) {
gzip on;
gzip_types image/jpeg image/png;
gzip_comp_level 3;
gzip_http_version 1.1;
location ~* \.txt {
gzip on;
gzip_types text/plain;
gzip_comp_level 1;
gzip_http_version 1.1;
}
}
}
[root@web01 ~]# cd /code/gzip/
[root@web01 gzip]# ll
-rw-r--r-- 1 root root 21252 2020-09-15 04:30 2.txt
-rw-r--r-- 1 root root 4487 2020-09-15 04:30 index.html
访问
对比源文件大小:
[root@web01 gzip]# ll -h
-rw-r--r-- 1 root root 21K 2020-09-15 04:30 2.jpg
-rw-r--r-- 1 root root 5.1K 2020-09-15 04:33 2.txt
六、防资源盗链
1,配置被盗链机器
[root@web01 ~]# vim /etc/nginx/conf.d/beidl.com.conf
server {
listen 80;
server_name linux.beidl.com;
location / {
root /beidl;
index index.html;
}
}
[root@web01 beidl]# cd /code/beidl/
[root@web01 beidl]# ll
-rw-r--r-- 1 www www 21252 2020-09-15 05:01 2.jpg
[root@web01 beidl]# systemctl restart nginx
#访问网站测试http://linux.beidl.com/1.jpg
2, 配置盗链机器
[root@web01 ~]# vim /etc/nginx/conf.d/dl.com.conf
server {
listen 80;
server_name linux.dl.com;
location / {
root /code/dl;
index index.html;
}
}
[root@web01 dl]# vim /code/dl/index.html
linux.dl.com
[root@web01 dl]# systemctl restart nginx
配置hosts访问
3,配置防盗链
[root@web01 dl]# vim /etc/nginx/conf.d/beidl.com.conf
server {
listen 80;
server_name linux.beidl.com;
location / {
root /code/beidl;
index index.html;
location ~* \.(jpg|png) {
valid_referers none blocked linux.bdl.com;
if ($invalid_referer) {
return 500;
#rewrite (.*) /4.jpg;
}
}
}
}
再次访问
5.允许匹配多个域名访问
[root@web01 conf.d]# vim beidl.com.conf
server {
listen 80;
server_name linux.beidl.com;
location / {
root /code/beidl;
index index.html;
location ~* \.(jpg|png) {
valid_referers none blocked server_names linux.bdl.com *.baidu.com ~\.jd\.;
if ($invalid_referer) {
return 500;
#rewrite (.*) /4.jpg;
}
}
}
}
[root@web01 conf.d]# systemctl restart nginx
6.伪造refere信息访问
[root@web01 conf.d]# vim /etc/hosts
10.0.0.7 linux.beidl.com
10.0.0.7 linu.dl.com
[root@web01 conf.d]# curl -I "http://linux.beidl.com/2.jpg"
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Mon, 14 Sep 2020 21:59:07 GMT
Content-Type: image/jpeg
Content-Length: 21252
Last-Modified: Mon, 14 Sep 2020 21:01:43 GMT
Connection: keep-alive
ETag: "5f5fda37-5304"
Accept-Ranges: bytes
伪造百度访问:(可以访问)
curl -I 大写的i
[root@web01 conf.d]# curl -e "https://www.baidu.com" -I "http://linux.beidl.com/2.jpg"
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Mon, 14 Sep 2020 22:10:51 GMT
Content-Type: image/jpeg
Content-Length: 21252
Last-Modified: Mon, 14 Sep 2020 21:01:43 GMT
Connection: keep-alive
ETag: "5f5fda37-5304"
Accept-Ranges: bytes
伪造谷歌访问,返回500
[root@web01 conf.d]# curl -e "https://www.google.com" -I "http://linux.beidl.com/2.jpg"
HTTP/1.1 500 Internal Server Error
Server: nginx/1.18.0
Date: Mon, 14 Sep 2020 22:11:59 GMT
Content-Type: text/html
Content-Length: 177
Connection: close
伪造京东访问(可以访问)
[root@web01 conf.d]# curl -e "https://www.jd.com" -I "http://linux.beidl.com/2.jpg"
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Mon, 14 Sep 2020 22:13:24 GMT
Content-Type: image/jpeg
Content-Length: 21252
Last-Modified: Mon, 14 Sep 2020 21:01:43 GMT
Connection: keep-alive
ETag: "5f5fda37-5304"
Accept-Ranges: bytes
七、允许跨域访问
--不同网站,不同协议,不同端口之间互相可以访问为跨域
1,配置被跨域:
[root@web01 conf.d]# vim /etc/nginx/conf.d/beiky.conf
server {
listen 80;
server_name linux.beiky.com;
root /code/beiky;
location / {
index index.html;
}
}
[root@web01 code]# mkdir -p /code/beiky
[root@web01 code]# echo "我是被跨域的网站" > /code/beiky/index.html
[root@web01 code]# chown -R www.www /code/
[root@web01 code]# systemctl restart nginx
2,配置跨域的网站
[root@web01 ~]# vim /etc/nginx/conf.d/kuayu.conf
server {
listen 80;
server_name linux.kuayu.com;
root /code/kuayu;
location / {
index index.html;
}
}
[root@web01 ~]# mkdir -p /code/kuayu/
[root@web01 ~]# chown -R www.www /code/
[root@web01 ~]# vim /code/kuayu/index.html
测试ajax和跨域访问
$(document).ready(function(){
$.ajax({
type: "GET",
url: "http://linux.beiky.com",
success: function(data) {
alert("sucess year! 成功了!!!");
},
error: function() {
alert("fail!!,跨域失败,呜呜呜");
}
});
});
测试跨域访问
[root@web01 ~]# systemctl restart nginx
配置hosts访问
3,配置允许跨域访问
[root@web01 ~]# vim /etc/nginx/conf.d/beiky.conf
server {
listen 80;
server_name linux.beiky.com;
root /code/beiky;
charset utf8;
location / {
index index.html;
}
location ~* \.html$ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET,POST,PUT,DELETE,OPTIONS';
}
}
配置hosts 访问
八、nginx的CPU亲和
1.查看cpu状态
[root@web01 ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
....
2,修改nginx的worker工作进程数
[root@web01 ~]# vim /etc/nginx/nginx.conf
worker_processes 4;
[root@web01 ~]# systemctl restart nginx
[root@web01 ~]# ps -eo pid,args,psr | grep [n]ginx
7067 nginx: master process /usr/ 2
7068 nginx: worker process 2
7069 nginx: worker process 2
7070 nginx: worker process 0
7071 nginx: worker process 1
3,配置nginx绑定工作进程绑定内核
[root@web01 ~]# vim /etc/nginx/nginx.conf
worker_processes auto;
worker_cpu_affinity auto;
[root@web01 ~]# systemctl restart nginx
[root@web01 ~]# ps -eo pid,args,psr | grep [n]ginx
7101 nginx: master process /usr/ 0
7102 nginx: worker process 0
7103 nginx: worker process 1
7104 nginx: worker process 2
7105 nginx: worker process 3
4,nginx通用优化配置
[root@web01 ~]# vim /etc/nginx/nginx.conf
user www;
worker_processes auto;
worker_cpu_affinity auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
charset utf-8;
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 /var/log/nginx/access.log main;
server_tokens off; 隐藏nginx版本号
client_max_body_size 200m;
sendfile on;
#tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
#gzip on;
gzip_disable "MSIE [1-6]\.";
gzip_http_version 1.1;
gzip_comp_level 5;
gzip_buffers 16 8k;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript image/jpeg;
include /etc/nginx/conf.d/*.conf;
}
5,代理通用优化配置
[root@web01 ~]# vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 8 128k;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
十、PHP服务优化
配置PHP 页面
[root@web01 ~]# vim /etc/nginx/conf.d/phpserver.conf
server {
listen 80;
server_name linux.phpserver.com;
root /code/phpserver;
location / {
index index.php;
}
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
注意⚠️:root /code/phpserver;放在server层或者每个location都配置
配置站点:
[root@web01 ~]# mkdir -p /code/phpserver
[root@web01 ~]# cd /code/phpserver/
[root@web01 phpserver]# vim index.php
phpinfo()
?>
[root@web01 phpserver]# chown -R www.www /code/
[root@web01 phpserver]# systemctl restart nginx
配置hosts访问
1.php.ini配置文件优化
# 错误日志设置
expose_php = Off #关闭php版本信息
display_error = Off #屏幕不显示错误日志(开发环境可以开启on)
error_reporting = E_ALL #记录PHP的每个错误
log_errors = On #开启错误日志
error_log = /var/log/php_error.log #错误日志写入的位置(php程序启动时候的报错)
date.timezone = Asia/Shanghai #调整时区,默认PRC
# 文件上传设置
file_uploads = On #允许文件上传
upload_max_filesize = 300M #允许上传文件的最大大小
post_max_size = 300M #允许客户端单个POST请求发送的最大数据
max_file_uploads = 20 #允许同时上传的文件的最大数量
memory_limit = 128M #每个脚本执行最大内存
# 会话共享
session.save_handler = redis
session.save_path ="tcp://172.16.1.51:6379"
# php禁止危险函数执行(取决于实际情况,需要和开发沟通)
disable_functions = chown,chmod,pfsockopen,phpinfo
2,PHP开启状态页面
[root@web01 ~]# vim /etc/php-fpm.d/www.conf
;pm.status_path = /php_status
[root@web01]# vim /etc/nginx/conf.d/phpserver.conf
server {
listen 80;
server_name linux.phpserver.com;
root /code/phpserver;
location / {
index index.php;
}
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location /php_status {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
配置hosts 访问
pool: www
process manager: dynamic
start time: 14/Nov/2020:08:09:04 +0800
start since: 3 #启动了多久
accepted conn: 1 #连接数
listen queue: 0 #等待队列
max listen queue: 0 #最大等待队列
listen queue len: 511 #队列长度
idle processes: 4
active processes: 1
total processes: 5
max active processes: 1
max children reached: 0
slow requests: 0
Nginx优化总结:
1、CPU亲和、worker进程数、调整nginx进程打开的文件句柄数
2、使用Epool网络模型、调整每个worker进程的最大连接数
3、文件的高效读取sendfile、nopush
4、文件的传输实时性、nodealy
5、开启tcp长连接,以及长连接超时时间keepalived
6、开启文件传输压缩gzip
7、开启静态文件expires缓存
8、隐藏nginx版本号
9、禁止通过ip地址访问,禁止恶意域名解析,只允许域名访问
10、配置防盗链、以及跨域访问
11、防DDOS、cc攻击,限制单IP并发连接,以及http请求
12、优雅限制nginx错误页面
13、nginx加密传输https优化
14、nginx proxy_cache、fastcgi_cache、uwsgi_cache 缓存,第三方工具(squid、varnish)
PHP优化总结
#优化:
1.硬件
2.网络
3.系统
4.应用
5.服务:
1)nginx:nginx静态
nginx做代理
nginx结合lua做安全
2)php:php.ini 日志、session、上传文件大小
php-fpm.d 监听地址,调整进程数
php状态模块
PHP慢查询