目录
1.总结nginx反向代理及https安全加密
(1)反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。
#环境搭建: #10.0.0.10为代理服务器 #10.0.0.20为后端服务器 *****************代理服务器操作*********************************** server { listen 80; server_name www.zyb.com; location ~ \.(jpg|gif|png) { proxy_pass http://10.0.0.20:8080; } } ******************后端服务器操作********************************** 更改80端口为8080就好了
(2)https安全加密:是http+ssl/tls实现的,就是当用户手动输入一个不带https://前缀的域名的时候,对网站的请求是用的http这种简单的协议而且是不加密发送。web服务器收到以后会立即返回重定向,将用户升级到https连接。这种方法存在一定的中间人攻击的安全隐患。所以我们要使用HSTS(Strict-Transport-Security)的方法来解决。
server { server_name www.zyb.com; root /data/nginx/html/pc; listen 80; listen 443 ssl; ssl_certificate /etc/pki/ca/cacert.pem; ssl_certificate_key /etc/pki/ca/private/cakey.pem; ssl_session_cache shared:sslcache:20m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; location / { if ( $scheme = http ) { rewrite ^/(.*)$ https://www.zyb.com/$1 redirect; } } }
2.完成nginx实现LNMP架构wordpress应用
#环境搭建 #10.0.0.20为DNS服务器 #10.0.0.10为nginx和php服务器 #10.0.0.40为mysql服务器 #补充:下载wordpress并解压后,把worepress下的文件放到/usr/share/nginx/html/下并修改所有者和所属组为nginx。 ***********************DNS脚本****************************** #!/bin/bash DOMAIN=zyb.com HOST=www HOST_IP1=10.0.0.10 #HOST_IP2=10.0.0.30 #配置颜色提示 set_color () { RES_COL=60 MOVE_TO_COLOR="echo -en \e[${RES_COL}G" SETCOLOR_SUCCESS="echo -en \e[1;32m [ok]\n" SETCOLOR_FAILURE="echo -en \e[1;31m [failure]\n" SETCOLOR_WARNING="echo -en \e[1;33m [worning]\n" echo -n "$1" && ${MOVE_TO_COLOR} if [ $2 = "success" -o $2 = "0" ];then ${SETCOLOR_SUCCESS} elif [ $2 = "failure" -o $2 = "1" ];then fi ${SETCOLOR_NORMAL} } #配置DNS sed -i -e /listen-on/s/127.0.0.1/any/g -e /allow-query/s/localhost/any/g /etc/named.conf cat > /var/named/$DOMAIN.zone <<EOF \$TTL 1D master A `hostname -I` $HOST A $HOST_IP1 EOF named-checkzone $DOMAIN /var/named/$DOMAIN.zone &> /dev/null && set_color 专区文件正确 0;sleep 1 || exit; chmod 640 /var/named/$DOMAIN.zone chgrp named /var/named/$DOMAIN.zone cat>/etc/named.rfc1912.zones<<EOF zone "$DOMAIN" IN { type master; file "$DOMAIN.zone"; }; EOF named-checkconf /etc/named.rfc1912.zones &> /dev/null && set_color 专区配置文件正确 0; sleep 1 || exit; set_color 已完成 0 sleep 1 systemctl enable --now named } dns_config **********************************nginx源码编译和php配置脚本************************ #!/bin/bash core_number=`grep "processor" /proc/cpuinfo |wc -l` nginx_install () { yum -y install gcc pcre-devel openssl-devel zlib-devel wget http://nginx.org/download/nginx-1.22.1.tar.gz -P /usr/local/src/ cd /usr/local/src/ tar xf nginx-1.22.1.tar.gz cd nginx-1.22.1/ useradd -s /sbin/nologin nginx ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module make -j $core_number install chown -R nginx.nginx /usr/local/nginx # mkdir /apps/nginx/run/ # sed -ri "s/(^#)(pid)(.*)/\2 \/apps\/nginx\/run\/nginx.pid\;/g" /apps/nginx/conf/nginx.conf cat>/usr/lib/systemd/system/nginx.service<<EOF [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID LimitNOFILE=100000 [Install] WantedBy=multi-user.target EOF ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin gzip -c /usr/local/src/nginx-1.22.1/man/nginx.8 > /usr/share/man/man8/nginx.8.gz } nginx_config () { sed -i "$ i include \/usr\/local\/nginx\/conf.d\/*\.conf;" /usr/local/nginx/conf/nginx.conf mkdir /usr/local/nginx/conf.d/pc.conf cat>/usr/local/nginx/conf.d/pc.conf<<EOF server { server_name www.zyb.com; listen 80; location ~ \.php$ { root /usr/share/nginx/html/; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME \$document_root$fastcgi_script_name; include fastcgi_params; } location / { root /usr/share/nginx/html/; index index.php; } } EOF systemctl enable --now nginx } php_install () { yum -y install php-fpm php-mysqlnd php-json sed -i -e "/user = apache/c user = nginx" -e "/group = apache/c group = nginx" -e "/listen = \/run\/php-fpm\/www.sock/c listen = 127.0.0.1:9000" -e "/;pm.status_path = \/status/c pm.status_path = \/pm-status" -e "/;ping.path = \/ping/c ping.path = \/ping" -e "/;ping.response = pong/c ping.response = pong" -e "/;access.log = log\/\$pool.access.log/c access.log = \/var\/log\/php-fpm\/\$pool.access.log" /etc/php-fpm.d/www.conf systemctl enable --now php-fpm } nginx_install nginx_config php_install ***************************mysql配置脚本**************************** #!/bin/bash yum -y install mysql-server&& systemctl enable --now mysqld&>/dev/null mysql -e "create user wordpress@'10.0.0.%' identified by '123456'" mysql -e "grant all on *.* to wordpress@'10.0.0.%'" mysql -e "create database wordpress"
3.总结tomcat实现多虚拟机
(1)访问www.zyb.com使用jpress博客系统。
访问www.zhangyongbiao.com使用zrlog博客系统。
#提前配置好dns #提前安装好jdk和tomcat *****************修改tomcat配置文件************************* [root@Rocky8 ~]#vim /usr/local/tomcat/conf/server.xml </Realm> #原来的行 <Host name="www.zhangyongbiao.com" appBase="/data/zrlog" #修改的行 unpackWARs="true" autoDeploy="true"> #原来的行 </Host> #新添加的行 <Host name="www.zyb.com" appBase="/data/jpress" #新添加的行 unpackWARs="true" autoDeploy="true"> #新添加的行 ****************重新启动tomcat********************************* [root@Rocky8 ~]#systemctl restart tomcat.service ******************创建存放数据的文件************************** [root@Rocky8 ~]#mkdir -p /data/{jpress,zrlog}/ROOT #必须用ROOT命名的文件夹,这样系统能找到默认页面 #下载jpress和zrlog的war后缀的压缩文件,发送到对应的/data/jpress或zrlog目录下,稍后系统会自动生成war后缀的文件夹。再把该文件夹下的所有文件发到ROOT文件夹下。 **********************创建对应的数据库******************************* [root@Rocky8 ~]#mysql -e "create user jpress@'10.0.0.%' identified by '123456'" [root@Rocky8 ~]#mysql -e "create database jpress" [root@Rocky8 ~]#mysql -e "grant all on jpress.* to jpress@'10.0.0.%'" [root@Rocky8 ~]#mysql -e "create user zrlog@'10.0.0.%' identified by '123456'" [root@Rocky8 ~]#mysql -e "create database zrlog" [root@Rocky8 ~]#mysql -e "grant all on zrlog.* to zrlog@'10.0.0.%'"
4.总结tomcat定制访问日志格式和反向代理tomcat
(1)定制访问日志格式:生成json格式
***************************添加json格式的日志*********************** [root@Rocky8 ~]#vim /usr/local/tomcat/conf/server.xml <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/> **************************查看json格式日志***************************** [root@Rocky8 ~]#cat /usr/local/tomcat/logs/localhost_access_log.2023-03-05.txt |jq { "clientip": "10.0.0.1", "ClientUser": "-", "authenticated": "-", "AccessTime": "[05/Mar/2023:13:21:15 +0800]", "method": "GET /favicon.ico?t=1624781874000 HTTP/1.1", "status": "200", "SendBytes": "16958", "Query?string": "?t=1624781874000", "partner": "http://www.zhangyongbiao.com:8080/", "AgentVersion": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" }
(2)反向代理及负载均衡:
**********************修改nginx配置文件******************* [root@nginx ~]#vim /usr/local/nginx/conf/nginx.conf http { upstream tomcat { # ip_hash; hash $cookie_JSESSIONID; #用SESSIONID为调度算法 server 10.0.0.10:8080; #tomcat服务器1 server 10.0.0.30:8080; #tomcat服务器2 } server { listen 80; server_name localhost; location / { root html; index index.html index.htm; proxy_pass http://tomcat; #转到tomcat proxy_set_header Host $http_host; #携带host头,要不然默认显示tomcat主页面 }
5.完成tomcat实现MSM集群
****************************环境搭建************************** #10.0.0.10:安装Nginx #10.0.0.20:安装tomcat和memcached #10.0.0.30:安装tomcat和memcached *************************Nginx的配置************************* [root@nginx ~]#vim /usr/local/nginx/conf/nginx.conf http { upstream tomcat { server 10.0.0.20:8080; server 10.0.0.30:8080; server { listen 80; server_name www.zyb.com; location / { proxy_pass http://tomcat; proxy_set_header Host $http_host; } } ***********************tomcat1和tomcat2的配置************************************* [root@tomcat1 ~]#vim /usr/local/tomcat/conf/server.xml </Host> <Host name="www.zyb.com" appBase="/data/tomcat/node1" unpackWARs="true" autoDeploy="true"> [root@tomcat1 ~]#mkdir -p /data/tomcat/node1/ROOT/ [root@tomcat1 ~]#vim /usr/local/tomcat/conf/context.xml <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:10.0.0.20:11211,n2:10.0.0.30:11211" failoverNodes="n1" #当改tomcat2时,这应该是n2 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> #把需要的jar包放入/usr/local/tomcat/lib/下 [root@tomcat1 ~]#systemctl restart tomcat *************************memcached的配置****************************************** [root@tomcat1 ~]#vim /etc/sysconfig/memcached PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" #OPTIONS="-l 127.0.0.1,::1" #注释这行,允许远程连接
6.总结垃圾算法和分代回收
(1)垃圾算法:
①:标记-扫描清除(mark-sweep)
优点:算法简单
缺点:会造成内存碎片,但是不浪费空间,效率较高(如果对象较多时,逐一删除效率也 会受到影响)
②:标记-压缩 (Mark-Compact)
优点:整理后内存空间连续分配,有大段的连续内存可分配,没有内存碎片。
缺点:内存整理过程有消耗,效率相对低下
③:复制 Copying
优点:复制过程中保证对象使用连续空间,且一次性清除所有垃圾,所以即使对象很多,收回效 率也很高
缺点:比较浪费内存,只能使用原来一半内存,因为内存对半划分了,复制过程毕竟也是有代价。
算法总结:
效率: 复制算法>标记清除算法> 标记压缩算法
内存整齐度: 复制算法=标记压缩算法> 标记清除算法
内存利用率: 标记压缩算法=标记清除算法>复制算法
(2)分代:
Heap堆内存分为:
年轻代Young:Young Generation
伊甸园区eden: 只有一个,刚刚创建的对象
幸存(存活)区Servivor Space:有2个幸存区,一个是from区,一个是to区。大小相等、地位 相同、可互换。
from 指的是本次复制数据的源区
to 指的是本次复制数据的目标区
老年代Tenured:Old Generation, 长时间存活的对象
默认空间大小比例:
默认JVM试图分配最大内存的总内存的1/4,初始化默认总内存为总内存的1/64,年青代中heap的1/3,老 年代占2/3
(3)回收:
年轻代回收 Minor GC
1. 起始时,所有新建对象(特大对象直接进入老年代)都出生在eden,当eden满了,启动GC。这个称 为Young GC 或者 Minor GC。
2. 先标记eden存活对象,然后将存活对象复制到s0(假设本次是s0,也可以是s1,它们可以调 换),eden剩余所有空间都清空。GC完成。
3. 继续新建对象,当eden再次满了,启动GC。
4. 先同时标记eden和s0中存活对象,然后将存活对象复制到s1。将eden和s0清空,此次GC完成
5. 继续新建对象,当eden满了,启动GC。
6. 先标记eden和s1中存活对象,然后将存活对象复制到s0。将eden和s1清空,此次GC完成
老年代回收 Major GC
进入老年代的数据较少,所以老年代区被占满的速度较慢,所以垃圾回收也不频繁。 如果老年代也满了,会触发老年代GC,称为Old GC或者 Major GC。 由于老年代对象一般来说存活次数较长,所以较常采用标记-压缩算法。 当老年代满时,会触发 Full GC,即对所有"代"的内存进行垃圾回收
Minor GC比较频繁,Major GC较少。但一般Major GC时,由于老年代对象也可以引用新生代对象,所 以先进行一次Minor GC,然后在Major GC会提高效率。可以认为回收老年代的时候完成了一次Full GC。 所以可以认为 MajorGC = FullGC
7.总结tomcat性能优化方式及java源码编译
(1)tomcat性能优化:
①内存空间优化:在bin/catalina.sh文件添加JAVA_OPTS="xxx" 调整为物理内存的1/2。默认是1/4
②线程池的调整:在/tomcat/conf/server.xml文件中修改connnectiontimeout参数
(2)java源码编译jpress:
①步:安装jdk
②步:安装tomcat
③步:安装maven
④步:安装git
⑤步:git clone jpress源码链接
⑥步:进入pom.xml文件所在位置
⑦步:执行mvn clean install package -Dmaven.test.skip=true