linux集群架构--tomact集群2

linux集群架构--tomact集群2

接入nginx

bash 复制代码
[root@web03 /app/tools/tomact]#echo test >webapps/index.jsp
[root@web03 /app/tools/tomact]#curl 192.168.65.9:8080/index.jsp


  • 发现页面不对,访问的是test,返回的信息是

    在这里插入图片描述

  • 为什么会成这样?

bash 复制代码
tomcat访问的灵异事件

访问的时候  zrlog.wulinlinux.cn:8080/zrlog/

ROOT用户访问的时候不加上路径,直接访问文件,就会访问ROOT下面的内容.

zrlog.wulinlinux.cn:8080/wulin.jsp = webapps/ROOT/wulinssw.jsp

zrlog.wulinlinux.cn:8080/wulin/wulinssw.jsp


改名--因为与数据库db01是相连的

  • 访问浏览器,这个时候安装一下zrlog

    会发现现在不会在进行报错了,原因是因为没有zrlog目录
  • 数据库配置文件
bash 复制代码
[root@web03 /app/tools/tomcat/webapps/ROOT]#find -type f |xargs grep '172.16.1.51'

[root@web03 /app/tools/tomcat/webapps/ROOT]# cat
./WEB-INF/db.properties
#This is a database configuration file
#Wed jun 22 09:05:24 CST 2024

driverClass=com.mysql.cj.jdbc.Driver
user=zrlog
password=1
jdbcUrl=jdbc\:mysql\://172.16.1.51\:3306/zrlog?
characterEncoding\=UTF-8&allowPublicKeyRetrieval\=true&useSSL\=false&ser
verTimezone\=GMT
#jdbcUrl=jdbc\:mysql\://数据库地址\:3306/数据库名字?characterEncoding\UTF-8&allowPublicKEYRetrieval\=true&useSSL\=false&serverTimezone\GMT
[root@web03 /app/tools/tomcat/webapps/ROOT]#
  • zrlog.war改名为ROOT.war然后部署.
  • ngx配置文件web上的nginx,不是负载上的)

    root@web03 \~\]# find /var/cache/yum/ -type f -name "\*.rpm" /var/cache/yum/x86_64/7/base/packages/price2-2--1.el7.ngx x86_64.rpm /var/cache/yum/x86_64/7/nginx-stable/packages/nginx-1.22.1.el7.ngx.x86_64.rpm

root@web03 \~\]# find /var/cache/yum/ -type f -name "\*.rpm" \|xargs cp -t /app/rpms/ #这里到时候安装一个内部的yum源,安装的就更快了 \[root@web03 /etc/nginx/conf.d\]# cat zrlog.wulinlinux.cn.conf server { listen 80; server_name zrlog.wulinlinux.cn; #思考,用户将请求发给nginx,nginx把进行发送给comact(有点类似于nginx代理 error_log /var/log/nginx/zrlog.wulinlinux.cn-error.log notice; access_log /var/log/nginx/zrlog.wulinlinux.cn-access.log main; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } \[root@web03 /etc/nginx/conf.d\]#nginx -t 检查语法 \[root@web03 /etc/nginx/conf.d\]#systemctl enable nginx #进行开机自启动 \[root@web03 /etc/nginx/conf.d\]#systemctl start nginx #开启nginx #配置解析 #浏览器访问zrlog.wulinlinux.cn网站进行管理 ## tomact+nginx动静分离 ```bash 需要开发拆开代码,把静态资源拆分出来单独进行存放 ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c7c4d3025a7a481a8c8d87dc591eaf27.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3dfd777f27fb4448ab4a16930111ada8.png) ```bash [root@web03 /etc/nginx/conf.d]# cat zrlog.wulinlinux.cn.conf server { listen 80; server_name zrlog.wulinlinux.cn; #思考,用户将请求发给nginx,nginx把进行发送给comact(有点类似于nginx代理 error_log /var/log/nginx/zrlog.wulinlinux.cn-error.log notice; access_log /var/log/nginx/zrlog.wulinlinux.cn-access.log main; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ~* \.(js|html|css|png|jpg|jpeg)$ { expries 7d; #proxy_pass http://127.0.0.1:8080; #proxy_set_header Host $http_host; #proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for; } } [root@web03 /etc/nginx/conf.d]#nginx -t 检查语法 #访问网站,会发现一个问题 ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/555f90ffb40d4c62a2e09baa69a6b5a4.png) * 浏览器解析,说明网站nginx出现问题 * 重新启动nginx服务 * 解决问题 * 但是这种严格上来说这种拆开代码不算是真正的动静分类 > > #生产环境 > > user nginx; worker_processes 4; worker_cpu_affinity 0001 0010 0100 > > 1000; > > error_log /data/logs/nginx/error.log warn; pid /logs/nginx.pid; > > worker_rlimit_nofile 65535; events { > > use epoll; > > workera_connections 10240; } > > http { > > include mime.types; > > default_type application/octet-stream; > > 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 /data/logs/nginx/access.log main; > > charset utf-8; > > server_names_hash_bnucket_size 128; > client_header_buffer_size 32k; > large_client_header_buffers 4 32k; > client_max_body_size 300m; > sendfile on; > tcp_nopush on; > keepalive_timeout 60; > tcp_nodelay on; > server_tokens off; > client_body_buffer_size 512k; > > client_header_timeout 3m; > client_body_timeout 3m; > send_timeout 3m; > > ##cache## > proxy_connect_timeout 5; > proxy_read_timeout 5; > proxy_send_timeout 60; > proxy_buffer_size 64k; > proxy_buffers 4 256k; > proxy_temp_path /tmp/proxy_temp; > proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=3000m; > proxy_cache_key "$scheme$request_method$host$request_uri"; > > ##end## > > gzip on; > gzip_min_length 1100; > gzip_comp_level 5; > gzip_buffers 4 8k; > gzip_types text/xml text/plain text/css text/javascript application/javascript application/json; > > # output_buffers 1 32k; > # postpone_output 1460; > > #limit_buffers 1 32k; > #postpone_output 1460; > > limit_rate_after 3m; > limit_rate 512k; > > #自动补全"/" > #if (-d $request_filename){ > #rewrite ^/([^/]$ http://$host/$1$2/ last; > > } > #online server > server { > listen 80; > server_name dbjyj.wulin.com www.wulin.com.cn vpn.wulin.com; > index index.jsp; > proxy_set_header Host $host:$server_port; > proxy_set_header REMOTE-HOST $remote_addr; > proxy_set_header X-Real-IP $remote_addr; > proxy_cache cache one; > > location ~ / { > rewrite ^/$ http://$host:8081/online last; > } > ###############动静分离配置############### > > ###############设定访问静态文件直接读取不经过tomact########### > location ~ \.(html|html|gif|jpg|jpeg|png|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)(.*)$ > > { > > expries max; > > } > > location \~ .(js\|css\|jsp\|json)$ { > > root /data/www; > > expries 1d; > > } > > ####################动静分离-配置完成############ > > location ~ .*/api/mc/custormer/deliverAddress/list.json* { > return 404; > } > location ^~ /online/ { > proxy_pass http://10.0.0.6:8081; > proxy_cache cache_one; > proxy_cache_valid 200 1h; > proxy_cache_valid 302 10m; > proxy_cache_valid any 1m; > } > location ^~ /onlinethread/ { > proxy_pass http://10.0.0.6:8081; > proxy_cache cache_one; > proxy_cache_valid 200 1h; > proxy_cache_valid 302 10m; > proxy_cache_valid any 1m; > } > location ^~ /mobile/ { > proxy_pass http://10.0.0.6:8081; > proxy_cache cache_one; > proxy_cache_valid 200 1h; > proxy_cache_valid 302 10m; > proxy_cache_valid any 1m; > } > } > #12200 server > server { > listen 8080; > server_name wulin.c0m www.b-long.com.cn brainlong.gcip.net; > proxy_set_header Host:$server_port; > proxy_set_header REMOTE-HOST $remote_addr; > proxy_set_header X-Real-IP $remote_addr; > proxy_cache cache_one; > > index index.jsp; > } > location ~ \.(html|html|gif|jpg|jpeg|png|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)(.*)$ > > {root /data/www; > > expries max; > > } > > location \~ /data/www; > > expries 1d; > > } > > #### 8080 ##### location \^\~ /ccbs/ { > > proxy_pass http://10.0.0.6:8080; > proxy_cache cache_one; > proxy_cache_valid 200 1h; > proxy_cache_valid 302 10m; > proxy_cache_valid any 1m; } > > ## console server location \^\~ /console/ { > > proxy_pass http://10.0.0.6:8080; > proxy_cache cache_one; > proxy_cache_valid 200 1h; } * 浏览器访问 zrlog.wulinlinux.cn:8081/test.jsp ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d196bb250dc54e0cbcacdc705c0e2798.png) * 过滤 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fe848c091e1342b194de0b916e864254.png) > 未来生产上,可以直接把tomcat+应用整体打包,使用的时候直接解压即可 ## Tomact监控功能 ### 概述 * 未来通过各种监控工具(Zabbix/Grafana/Prometheus/...),监控Tomcat/java. * 需要我们开启java远程监控功能(JMX remote) ### 步骤 * tomcat配置中修改tomcat启动的选项.开启jmx远程监控功能. * 交给zbx就可以了(使用windows jdk连接tomcat). ```bash catalina.sh文件中125后面 CATALINA_OPTSjava环境变量,指定java启动的时候的选项 [root@web03 /app/tools ~]#vim tomact/bin/catalina.sh CATALINA_OPTS="$CATALINA_OPTS \ -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=12345 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ -Djava.rmi.server.hostname=10.0.0.9" [root@web03 /app/tools ~]#systemctl restart tomact [root@web03 /app/tools ~]#ps -ef |grep java /app/tools/jdk/bin/java -Djava.util.logging.config.file=/app/tools/tomcat/conf/logging.properties -Diava.util.logging.manager=org.apache.juli.classLoaderLogManager -Djdk.tls.ephemeralDHkeysize-2048 -Djdk.protocol .handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SeeurityListener.UMASK=8827-Dcom,sun.management.imxremote -Dcom,sun.management,imxremote,port=12345 -Dcom,sun.management.imxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server,hostname=18.0.0.9 -Dignore.endorsed.dirs= -classpath /app/toolstomcat/bin/bootstrap.iar: /app/tools/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/app/tools/tomcat -Dcatalina.home=/app/toolstomcat -Djava.io.tmpdir=/app/tools/tomcat/temp org.apache.catalina.startup.Bootstrap start [root@web03 /app/tools ~]#ss -lntup |grep java (有两个随机端口) ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/bea47d903cf349ed8e95a8dd35af1429.png) ````bash > ```bash > > 温馨提示: > > 1.从tomcat 8.5开始配置的每一行要通过\进行续行 > > > 修改后java进程中增加了上面添加的那些选项 ```/app/tools/jdk/bin/java > - Djava.util.logging.config.file=/app/tools/tomcat/con f/logging.properties > - Djava.util.logging.manager=org.apache.juli.ClassLoad erLogManager -Djdk.tls.ephemeralDHKeySize=2048 > - Djava.protocol.handler.pkgs=org.apache.catalina.webr esources -Dorg.apache.catalina.security.SecurityListener.UMASK > =0027 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=10.0.0.9 -Dignore.endorsed.dirs= -classpath /app/tools/tomcat/bin/bootstrap.jar:/app/tools/tomca t/bin/tomcat-juli.jar - Dcatalina.base=/app/tools/tomcat - > Dcatalina.home=/app/tools/tomcat - > Djava.io.tmpdir=/app/tools/tomcat/temp > org.apache.catalina.startup.Bootstrap start ```` * 在windows下,通过jdk连接tomcat(模拟监控软件连接) > C:\\Program Files\\Java\\jdk1.8.0_201\\bin\\jconsole.exe * 安装jdk_1.80_64bit.exe(一直选择进行下一步) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/bd9ea2e2280440239251b852b7008706.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ad6d46fb18734d72ac5dc48f3b0f33c5.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ad40c65e86574c1694682d3c506b0f32.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e9daa3cdc05f47cc8548108ef4af07f8.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e229c4f325ae45da97f4f15e496fef3e.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/98ca1da50b4c4df19add8a02ace68f8d.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/323053a498ac4c4ba28c369a9e6a1fbf.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fdaba9fa033f4d9bb81d7e950183aaa3.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/29c8fefa8bda484d95dbe25fdb9dce4e.png) * 选择不安全的连接 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c75cbff79c1e45c4bf4fa318aa130131.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a5ab9c84c0ab489a9f166c039fba5443.png) 当前jvm内存使用情况: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3cb495f5089c4a23a399aaf6b9e26d4e.png) > 有一个执行GC(G)这个是垃圾回收站 > > 以上这些页面,未来使用zabbix进行监控 > > 掌握开启监控功能 ## Java故障案例 ### Java监控命令 ````bash ```bash 命令(j打头) ​ jps(jdk提供的) ​ jstack ​ jmap 脚本,执行与查看结果即可 ```` #### a.jps ```bash [root@web03 /app/tools]#jps 78900 Bootstrap 68458 plugin-core.jar 7012 jps [root@web03 /app/tools]#ps -ef |grep jagva jps》》 java ps命令,只显示java进程.类似于ps -ef |grep java [root@web03 /app/tools]#jps -lvm|grep tomcat-8081 ``` #### b.jstack > jstack查看java进程内部信息,线程信息. > > 进程:占空间,占系统资源,厂房. > > 线程:厂房里面的工人,处理与用户的请求. > > 需要代码使用多线程技术.通过ps aux查看进程是否支持线程(是否使用多线程技术) > 先过滤出java进程的pid > 查看java进程的线程信息 > > jstack 1786 > > 查看java线程状态 > > jstack 1786 \|grep -i state ```bash [root@web03 /app/tools]#jstack --help Usage: jstack [-l] pid为进程 (to connect to running process) jstack -F [-m] [-l] (to connect to a hung process) jstack [-m] [-l] (to connect to a core file) jstack [-m] [-l] [server_id@] (to connect to a remote debug server) Options: -F to force a thread dump. Use when jstack does not respond (process is hung) -m to print both java and native frames (mixed mode) -l long listing. Prints additional information about locks -h or -help to print this help message ``` > 1、新建状态New; > > 2、就绪状态Runnable; > > 3、运行状态Running; > > 4、阻塞状态Blocked; > > 5、死亡状态Dead。 #### c.jsp jmap查看或导出jvm信息 查看jvm使用情况 > map -heap java-pid导出java进程的jvm 内存使用情况 导出jvm内存镜像 ````c ```bash 未来生产环境该文件较大 ```cjmap -dump:format=b,file=8081.hprof 1786 Dumping heap to /root/8081.hprof ... Heap dump file created [root@web03 ~]# ll -h 8081.hprof -rw------- 1 root root 20M Sep 19 09:43 8081.hprof ```` #### d.mat分析工具 ```bash jvm内存映像文件,在windows/mac/ubuntu系统下通过MemoryAnalyzer Tool (MA/MAT) 1.需要jdk环境 2.软件包解压即可使用 3. MemoryAnalyzer.exe 下载地址:https://www.eclipse.org/mat/downloads.php ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/5b5994aab75648569e2c215d7f8407ce.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a886168320ba4edb9ad9fd2efe5c3d8c.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b9431506e9284178bb36405bded40872.png) jvm.dup/改名为jvm.hprof结尾,打开界面: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/68c51cb20d384b3384480d25111dc7d3.png) 命令小结 ​ jps-查看java进程信息(pid,进程名字),更加详细信息看ps ​ jstack-查看java线程信息,过滤线程状态 ​ jmap-查看jvm内存信息(导出) 脚本 ```bash show-busy-java-thread.sh显示当前环境中,所有繁忙的java线程.以百分数显示使用率最高的前几个线程. ``` ## java应用负载高故障案例 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ee168fe7890741989d9fb459c56dd8e4.png) 排查流程小结: 1. 通过监控服务发现系统负载高 涉及命令:zabbix,Prometheus,告警 2. 登录到对应的节点,通过命令检查系统负载是否高 设计命令:w,uptime,top,lscpu;cpu核心总数与负载对比 3. 真的高,定位什么导致的系统负载高 涉及命令top,ps,aux,iotop,vmstat;判断cpu,io导致的 4. 找出原因并且找出对应的进程,需要根据进程找服务相关 根据找出的进程,查看日志信息 5. java进程查看进程中的线程信息, 设计命令jps,jstack 6. 导出jvm信息,通过mat工具进行分析 设计命令jmap,MA需要与开发进行一起看 ## java会话共享方案 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7775dfc46cc14f218de56d4e1dadf6f1.png) ## Tomact配置https * 下载tomact使用证书(阿里云) * 修改配置文件(配置跳转) > 应用建议 > > tomact可以支持https,可以在tomact中配置https证书。未来可以在nginx中配置证书加密,tomact未进行加密 * tomact配置文件 ```bash `[root@web03 /app/tools/tomcat]# mkdir cert #部署代码包 [root@web03 /app/tools/tomcat/cert]#vim ../conf/server.xml` ``` ```bash [root@web03 /app/tools/tomcat/conf]# cat server.xml 访问测试:https://ssl.wulinlinux.cn:8443 配置http-->https 说明:关于tomcat其他类型的证书格式配置 jks格式 keystoreFile="/app/tools/tomcat/cert/ssl.wulinlinux.cn.jks" keystoreType="PKCS12" #删除这一行 keystorePass="AGrnHD9j"#密码 访问测试:https://ssl.wulinlinux.cn:8443 配置tomcat --->http8080--->ttps 8443 web.xml的在文件后添加以下内容 Client Cert Users-only Area ssl ssl /* CONFIDENTIAL ``` ```bash [root@web03 /app/tools/tomcat/cert]#systemctl restart tomact ##做本地解析 ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ca1a4f836b8f46fbaa4a5ee87027942e.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/920fb0f692a44d439dbe3514880168e7.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d5e791a6f9924421a5c56d908fac19ab.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0a9a84556924445895c5fa7f98311a41.png) > tomcat-https小结 > > 获取tomcat证书 > > ​ tomcat server.xml文件8443 > > tomcat集群 > > ​ nginx+tomcat > > ​ 与之前ngx+php https一致的 nginx中有两个结尾: * .pfx(公钥) * pfx-password.txt(私钥) tomact: * .pfx(证书) * password(证书密码文件) ## java前后端分离项目 Tomcat动静分离.提取出静态资源. 静态资源:前端(html,css,js). 后端:(Java,PHP,Python,Golang...)连接使用数据库. 前后端分离,拆分为前端部分和后端部分,一般前后端通过API接口的进行连接. API应用程序接口:开发人员书写好的,可以直接调用的代码.使用的人员不需要关注功能如何实现的,只需要关注如何调用接口即可. API接口在各种服务中广泛存在 ### 前端分离 前端(静态资源) API接口(Rest API) 后端(动态功能) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/07d89a873e994407b331f6096c26f354.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/decf5e98364e4f169c8f03227cbdf753.png) (2)数据库准备db02 ```bash #解压,环境准备 mkdir -p /app/tools/ /app/data/3306/ tax xf mysql-8.9.27-linux-glibc2.12-x86_64.tar.xz -C /app/tools/ ln -s /app/tools/mysql-8.0.27-linux-glibc2.12-x86_64/ /app/tools/mysql yum install ncurses-devel libaio-devel openssl openssl-devel -y #配置文件,用户 useradd -s /sbin/nologin -M mysql #设置配置文件 cat >/etc/my.cnf<<"EOF" [mysqld] #用户 user=mysql ###安装目录 basedir=/app/tools/mysql/ ###数据目录 datadir=/app/tools/3306/ port=3306 socket=/tmp/mysql.sock [client] socket=/tmp/mysql.sock EOF cat /etc/my.cnf #修改配置和数据目录的所有者 chown mysql.mysql /etc/my.cnf chown -R mysql.mysql /app/data/3306 #配置PATH环境变量 echo 'export PATH=/app/tools/mysql/bin:$PATH' >>/etc/profile source /etc/profile #检查 mysql -V ``` 初始化数据库: ```bash mysqld --initialize-insecure --user=mysql \ --basedir=/app/tools/mysql/ --datadir=/app/data/3306/ echo $? ``` 启动: ```bash #拷贝已经准备好的启动管理文件 cp /app/tools/mysql/sipport-files/mysql.server /etc/onit.d/mysqld #开机自启动服务,运行服务 systemctl enable mysqld systemctl start mysqld ``` 今天这篇先更新到这里,整理好后续补充!!!

相关推荐
张彦峰ZYF23 分钟前
高频面试题(含笔试高频算法整理)基本总结回顾63
linux·运维·算法
Andrew_Ryan1 小时前
android use adb instsll cacerts
算法·架构
从零开始学习人工智能2 小时前
Docker 镜像导出与导入:export/import vs save/load
运维·docker·容器
椰萝Yerosius2 小时前
Ubuntu Wayland启动腾讯会议并实现原生屏幕共享
linux·ubuntu·腾讯会议
爪娃侠3 小时前
LeetCode热题100记录-【二叉树】
linux·算法·leetcode
rufeike6 小时前
Rclone同步Linux数据到google云盘
linux·运维·服务器
csdn_aspnet6 小时前
如何在 Linux 上安装 Python
linux·运维·python
良许Linux6 小时前
怎么自学嵌入式?
linux
良许Linux6 小时前
你见过的最差的程序员是怎样的?
linux
良许Linux6 小时前
想从事嵌入式软件,有推荐的吗?
linux