nginx实战与负载均衡

一、nginx实战

1、nginx 反向代理配置

(1)概述

反向代理:⽤户直接访问反向代理服务器就可以获得⽬标服务器(后端服务器)的资源。

(2)修改配置

[root@server2 ~]# vim /usr/local/nginx/conf/nginx.confserver {listen 80;server_name localhost;charset utf-8;#access_log logs/host.access.log main;location /status {stub_status on;access_log off;}location / {root html;index index.html index.htm;proxy_pass http://192.168.33.11:80; }
[root@server2 ~]# systemctl reload nginx.service

(3)建⽴后端服务器

使⽤另⼀台虚拟机,安装 nginx ,然后进⼊/usr/share/nginx/html/ ⽬录,修改其中的 index.html ⽂件,随 便写⼊⼀条内容进⾏测试。
[root@YH1 ~]# vim /usr/share/nginx/html/index.html
这⾥是192.168.33.11

(4)访问测试

浏览器输⼊本机地址 192.168.33.110,将会⾃动跳转到后端服务器 192.168.33.11 上

 

 

2、nginx 访客 IP ⿊名单 

(1)修改配置

[root@server2 ~]# vim /usr/local/nginx/conf/nginx.confserver {listen 80;server_name localhost;charset utf-8;allow 192.168.33.22;    //允许192.168.33.22⽤户访问deny 192.168.33.0/24;    //拒绝33.0⽹段的⽤户访问deny all;      //拒绝所有

(2)访问测试

1)因为当前服务器拒绝了 33.0 ⽹段的⽤户访问,⽽本机浏览器正是通过 33.1 ⽹关与服务器建⽴连接,所以浏览器被拒绝访问了,显示 403 错误信息。

 

2)使⽤也是 192.168.33.0 ⽹段的 33.11 的 YH1 主机访问服务器进⾏测试。

 

[root@YH1 ~]# ip a    //查看当前主机的IP
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu
1500 qdisc fq_codel state UP group default qlen
1000link/ether 00:0c:29:72:29:0b brd
ff:ff:ff:ff:ff:ffaltname enp2s0inet 192.168.33.11/24 brd 192.168.33.255 scope
global noprefixroute ens32
[root@YH1 ~]# curl 192.168.33.110     //访问33.110服务器进⾏测试
<html>
<head><title>403 Forbidden</title></head>   //可以看到403错误,说明访问同样被拒
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.24.0</center>
</body>
</html>

3)使⽤之前允许的 192.168.33.22 的 YH2 主机进⾏访问服务器测试。

[root@YH2 ~]# ip a   //查看当前主机的IP
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu
1500 qdisc fq_codel state UP group default qlen
1000link/ether 00:0c:29:10:45:e6 brd
ff:ff:ff:ff:ff:ffaltname enp2s0inet 192.168.33.22/24 brd 192.168.33.255 scope
global noprefixroute ens32
[root@YH2 ~]# curl 192.168.33.110 #访问33.110服务器进⾏测试欢迎访问!
这⾥是 192.168.33.110 服务器! //测试成功,可以访问

 3、为 server 主机配置访问和错误⽇志

(1)控制⽇志参数

1)nginx 访问⽇志主要控制参数
log_format:⽤来定义记录⽇志的格式(可以定义多种⽇志格式,取不同名字即可)
access_log:⽤来指定⽇志⽂件的路径及使⽤何种⽇志格式记录⽇志
2)log_format ⽇志格式变量
$remote_addr:记录访问⽹站的客户端地址。
$remote_user:远程客户端⽤户名。
$time_local:记录访问时间与时区。
$request:⽤户的http请求起始⾏信息。
$status:http状态码,记录请求返回的状态码,例如:200、301、404等。
$body_bytes_sent:服务器发送给客户端的响应body字节数。
$http_referer:记录此次请求是从哪个连接访问过来的,可以根据该参数进⾏防盗链设置。
$http_user_agent:记录客户端访问信息,例如:浏览器、⼿机、客户端等。
$http_x_forwarded_for:当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进⾏相关的x_forwarded_for设置。

 

[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf#log_format main '$remote_addr -
$remote_user [$time_local] "$request" '# '$status $body_bytes_sent
"$http_referer" '# '"$http_user_agent"
"$http_x_forwarded_for"';

 (2)access_log 访问⽇志

[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf#access_log logs/access.log main; #访问⽇志的路径和格式

(3)error_log 错误⽇志

[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
错误⽇志:error_log 不能改变.
⽇志⽂件:指定⽇志的存放⽬录
错误⽇志级别:debug、info、notice、warn、error、crit、
alert、emerg,级别越⾼记录的信息越少
⽣产环境⼀般为 warn、error、crit 这三个级别之⼀。
不要配置 info 等级较低的级别,会造成磁盘消耗。

4、nginx 错误⻚⾯ 

nginx 的错误⻚⾯与访问⾸⻚⼀样,都有⾃⼰的索引⽂件,⼀般⽤户访问的⽹站都是对应的索引⽂件。
[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conferror_page 500 502 503 504 /50x.html; 
#500~504错误代码,不论哪个代码,错误⻚⾯都是50x.htmllocation = /50x.html { #错误⽂件所在路径root html; #该⽹站的根⽬录}

5、location 块的匹配规则和优先级

(1)location⼤致可以分为三类

精准匹配:location = / {...}
正则匹配:location ~ / {...}
⼀般匹配:location / {...}

(2)location常⽤的匹配规则

= :进⾏普通字符精确匹配,也就是完全匹配。
^~ :表示普通字符匹配。使⽤前缀匹配。如果匹配成功,则不再匹配其它 location。
}~ :区分⼤⼩写的匹配。
~* :不区分⼤⼩写的匹配。
!~ :区分⼤⼩写的匹配取⾮。
!~* :不区分⼤⼩写的匹配取⾮。

(3)location优先级

⾸先精确匹配 =
其次前缀匹配 ^~
其次是按⽂件中顺序的正则匹配 或 *
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通⽤匹配
精确>前缀>正则>⼀般>通⽤
(location = 完整路径) > (location ^~ 完整路径) > (location ~* 完整路径) > (location ~ 完整路径) >(location 部分起始路径) >(location /)

(4)location 示例说明

1)location = / {}
a、= 为精确匹配 / ,主机名后⾯不能带任何字符串,⽐如访问 / 和/data,则 / 匹配,/data 不匹配。
b、再⽐如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,则即匹配/abc、/abcd/ 同时也匹配/abc/。
2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求⽐如访问 / 和 /data, 则 / 匹配, /data 也匹配,但若后⾯是正则表达式会和最⻓字符串优先匹配(最⻓匹配)。
3)location /file/ {}
匹配任何以 /file/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location。
只有其它 location后⾯的正则表达式没有匹配到时,才会采⽤这⼀条。
4)location /file/abc {}
匹配任何以 /file/abc 开头的地址,匹配符合以后,还要继续往下搜索其它location。
只有其它 location后⾯的正则表达式没有匹配到时,才会采⽤这⼀条。
5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停⽌往下搜索正则,采⽤这⼀条。
6)location ~ .(gif|jpg|jpeg)$ {}*
匹配所有以 gif、jpg或jpeg 结尾的请求.然⽽,所有请求/images/ 下的图⽚会被 location ^~ /images/ 处理,因为 ^~ 的优先级更⾼,所以到达不了这⼀条正则。
7)location /images/abc {}
最⻓字符匹配到 /images/abc,优先级最低,继续往下搜索其它location,会发现 ^~ 和 ~ 存在。
8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location^~ /images/ 才会采⽤这⼀条。
9)location /images/abc/1.html {}
匹配/images/abc/1.html ⽂件,如果和正则location ~/images/abc/1.html 相⽐,正则优先级更⾼。

6、rewrite 重写和⽹站跳转 

(1)301 永久跳转

1)301 永久跳转:当⽤户或搜索引擎向⽹站服务器发起浏览请求时,服务器返回的 HTTP 数据流中头信息(index.html 等)中的状态码的⼀种,表示本⽹⻚永久性地转移到了另⼀个地址。
2)rewrite 重写跳转规则
3)http://www.yang1314/$1:跳转到的⽬标地址,后⾯的$1代表链参数也⼀起跳转。
4)⽐如访问 www.yh666.com/123 就会跳转到www.yang1314/123 没有的话。就会直接跳转到 www.yang1314.com
5)permanent:301 永久跳转
[root@server2 ~]# vim  /usr/local/nginx/conf/nginx.confserver {listen 80;server_name www.yh666.com;charset utf-8;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;rewrite ^/(.*)$  http://www.yang1314.com/$1 permanent; #添加此参数}}

(2)302 临时跳转

1)跟 301 永久跳转相⽐,302 就是⼀个参数的差别。
2)配置规则按着 301 配置⾛即可找到域名配置⽂件的Server或者location段,适当位置添加下⾯代码:
rewrite^/(*) [http://www.1](http://www.yang1314.com/](http://www.leige.com/$1) redirect;
[root@server2 ~]# vim /usr/local/nginx/conf/nginx.confserver {listen 80;server_name www.yh666.com;charset utf-8;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;rewrite ^/(.*)$
http://www.yang1314.com/$1 redirect;}}

7、平滑升级

(1)原理

1)启动后完成配置加载和端⼝绑定等动作, 分离出指定数量的⼯作⼦进程 ,这些⼦进程会持有监听端⼝的⽂件描述符 (fd),并通过在该描述符上添加监听事件来接受连接。
2)Nginx 主进程在启动完成后会进⼊等待状态,负责响应各类系统消息,如 SIGCHLD、SIGHUPSIGUSR2 等。
3)主进程⽀持的信号
a、TERM、INT:⽴刻退出
b、QUIT:等待⼯作进程结束后再退出
d、HUP:重新加载配置⽂件,使⽤新的配置启动⼯作进程,并逐步关闭旧进程
e、USR1:重新⽣成⽇志⽂件;
f、USR2:启动新的主进程,实现热升级
g、WINCH:逐步关闭⼯作进程及⼯作进程⽀持的信号

(2)过程

1)查看旧版nginx的编译参数;
2)编译新版本 Nginx 源码包,安装路径需与旧版⼀致,注意: 不要执⾏ make install;
3)备份⼆进制可执⾏⽂件,⽤新版本的替换;
4)确保配置⽂件⽆报错;
5)发送USR2信号:向主进程(master) 发送USR2信号,Nginx 会启动⼀个新版本的 master 进程和对应⼯作进程,和旧版⼀起处理请求;
6)发送WINCH信号:向旧的 Nginx主进程(master) 发送 WINCH 信号,它会逐步关闭⾃⼰的⼯作进程(主进程不退出),这时所有请求都会由新版Nginx处理;
7)发送QUIT 信号: 升级完毕,可向旧的 Nginx 主进程(master) 发送 (QUIT、TERM、或者KILL)信号,使旧的主进程退出;
8)验证nginx 版本号,并访问测试.

二、负载均衡

1、概述

早期的网站流量和业务功能都比较简单,单台服务器足以满足基本的需求, 但是随着互联网的发展,业务流量越来越大并且业务逻辑也跟着越来越复 杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器进行性能的水平扩展及避免单点故障出现。
负载均衡是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响 应足够快,给用户很好的体验,快速增长的访问量和数据流量催生了各式各样的负载均衡的产品,很多专业的的负载均衡硬件提供了很好的功能,但价格不菲,这使得负载均衡软件大受欢迎,nginx 就是其中一个,在 linux 下有nginx、 Ivs haproxy 等服务,可以提供复杂均衡服务。

2、负载均衡原理

负载均衡 NAT Network Address Translation 网络地址转换)简单地说就是将一个IP 地址转换为另一个 IP 地址,一般用于未经注册的内部地址与合法的、已获注册的Internet IP 地址间进行转换。适用于解决 Internet IP 地址紧张、不想让网络外部知道内部网络结构等的场合下。
系统的扩展可以分为纵向扩展和横向扩展。
纵向扩展:从单机的角度出发,通过增加系统的硬件处理能力来提升服务器的处理能力;
横向扩展:通过添加机器来满足大型网站服务的处理能力。
这里面涉及到两个重要的角色分别是 应用集群 负载均衡器
应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理并返回响应的数据。
负载均衡器:将用户访问的请求根据对应的负载均衡算法,分发到集群中的一台服务器进行处理。
1 )准备软件包并查看旧版软件

 3、负载均衡的作用

解决服务器的高并发压力,提高应用程序的处理性能;提供故障转移,实现高可用;通过添加或减少服务器数量,增强网站的可扩展性;在负载均衡器上进行过滤,可以提高系统的安全性;

(1)提高系统性能

负载均衡可以扩展网络设备和服务器的带宽,优化访问请求在服务器组之间的分配,提高系统的反应速度和总体性能。

(2)监控服务器的运行状态

负载均衡能够监控服务器的运行状态,提高整个服务器组的可靠性。

(3)提供服务一致性

负载均衡器具有提供服务一致性的功能,负载均衡器通过读取客户端所发出请求内的信息,进行重写报头程序然后将请求发送至合适的服务器上,该服务器会维护着该客户端信息。在http 通信当中,负载均衡器提供服务一致性的功能就得到了很好的发挥,但提供该服务的途径并不是非常安全。但若将消息加密后,负载均衡器就无法读取隐藏其中的信息了。

(4)摆脱停机时间

服务器托管公司可能会在维护期间将服务器关闭一段时间,这可能发生在业务的高峰期。在基于云服务器中,可以在将流量引导到另一台服务器的资源之后进行维护,前提是它们不在维护中,从而可以消除网站的停机时间。

(5)管理服务器故障

由于它具有根据需要添加或删除实例的功能,因此可以跨云平台拥有多个数据中心。如果其中一台服务器发生故障,则可以快速移动流量,将故障服务器的流量流入到另一台服务器中。

(6)转发功能

按照一定的算法,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。

(7)恢复添加

如检测到发生故障的应用服务器恢复工作,自动将其添加到处理用户请求队伍中。

(8)分发流量

分发流量、请求到不同的服务器。使流量平均分配,提高整个集群的响应速度、服务的高可用性。

 4、负载均衡常用处理方式

(1)负载均衡分为四层负载均衡和七层负载均衡。
1)四层负载均衡是工作在 OSI 七层协议的第四层 —— 传输层,基于IP+PORT的负载均衡,主要工作是转发。
2)它在接收到客户端的流量以后通过修改数据包的地址信息(目标地址和端口和源地址)将流量转发到应用服务器。
3)实现四层负载均衡的方式:
硬件: F5 BIG-IP Radware ;
软件: LVS Nginx Haproxy 等。
(1)七层负载均衡是工作在七层协议的第七层 - 应用层,基于虚拟的 URL 或主机IP 的负载均衡,主要工作是代理。
(2)它首先会与客户端建立一条完整的连接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器建立另外一条连接将请求发送过去。
(3)实现七层负载均衡的方式:
软件: Nginx Hayproxy 等。

5、四层和七层负载均衡的区别

(1)四层负载均衡数据包是在底层就进行了分发,而七层负载均衡数据包则在最顶端进行分发,所以四层负载均衡的效率比七层负载均衡的效率要高;
(2)四层负载均衡不识别域名,而七层负载均衡识别域名。
(3)除了四层和七层负载均衡以外其实还有二层、三层负载均衡。二层负载均衡是在数据链路层基于MAC 地址来实现负载均衡,三层是在网络层一般采用虚拟IP 地址的方式实现负载均衡。
(4)实际环境采用的方式:四层负载 (LVS) + 七层负载 (Nginx)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3280085.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

学习日记:排序

目录 1.选择排序 2.冒泡排序 3.插入排序 4.查找 4.1 二分查找 1.选择排序 思想&#xff1a;给合适的位置选择合适的数&#xff08;用后面的数依次跟指定位置上的数比较&#xff0c;如果后面的书比指定位置的数小&#xff0c;就交换两个数&#xff0c;依次重复&#xff0c;一…

API 接口自动化测试的基本原理及实战教程

常用API接口协议介绍 HTTP协议 超文本传输协议 它是用来在Internet上传送超文本的传送协议&#xff0c;运行在TCP/IP协议族之上&#xff0c;它可以使浏览器更加高效&#xff0c;使网络传输减少。 任何服务器除了包括HTML文件以外&#xff0c;还有一个HTTP驻留程序&#xf…

(day28)leecode——有效括号

描述 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()","()(())","…

【Unity动画】Animation Sequencer:动画制作的革新工具

在Unity游戏开发中&#xff0c;动画是提升玩家体验的关键因素。传统的动画制作方式往往耗时且复杂&#xff0c;但有了Animation Sequencer&#xff0c;这一过程将变得更加直观和高效。本文将介绍Animation Sequencer这一视觉工具&#xff0c;探讨其如何帮助开发者在Unity编辑器…

案例分享-国外轻松感UI设计赏析

国外UI设计倾向于采用简洁的布局、清晰的排版和直观的交互方式&#xff0c;减少用户的认知负担&#xff0c;从而营造出轻松的使用体验。这种设计风格让用户能够快速找到所需信息&#xff0c;降低操作难度&#xff0c;提升整体满意度。 在注重美观的同时&#xff0c;更加重视用户…

技术详解:互联网医院系统源码与医保购药APP的整合开发策略

本篇文章&#xff0c;小编将从系统架构、数据安全、用户体验和技术实现等方面详细探讨互联网医院系统与医保购药APP的整合开发策略。 一、系统架构 1.模块化设计 互联网医院系统与医保购药APP的整合需要采用模块化设计。 2.微服务架构 每个功能模块作为一个独立的微服务&am…

成为git砖家(9): git checkout <commit> <file> 的含义

文章目录 1. 目的2. 官方文档解释3. Tower 的解释4. References 1. 目的 git checkout 命令承载了非常多的功能&#xff0c; 想要一次全弄懂&#xff0c;不太现实&#xff1b; 这次白鱼带领大家学习 git checkout <file> 的用法。 老规矩&#xff0c;先查看 git checko…

DRAM的可靠性受什么因素影响

挑战 随着IC尺寸的不断减小&#xff0c;它们变得更容易受到多种环境因素的损害&#xff0c;尤其是对于放置在高温或低温且空气中含有微粒的恶劣环境中的系统。在远程维护受限的室外偏远地区设置的系统特别容易受到攻击。 IC质量不均。晶圆内的IC可能不一定具有相同的质量。一个…

PSINS工具箱函数介绍——kfinit0

【注】本文所述的函数kfinit0不同于kfinit&#xff0c;后者的讲解链接见&#xff1a;PSINS工具箱函数介绍——kfinit kfinit是kf的参数初始化函数&#xff0c;用于初始化滤波参数 本文所述的代码需要基于PSINS工具箱&#xff0c;工具箱的讲解&#xff1a; PSINS初学指导&…

金额转换题目

import java.util.Scanner;/*** author gyf* ClassName Test* Date 2024/7/30 17:51* Version V1.0* Description : 金额转换*/ public class Test {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int money;// 输入验证while (true) {Sys…

进程间通信与线程间通信的方法汇总

目录 一、进程间通信机制 管道(pipe)&#xff1a; 命名管道(FIFO)&#xff1a; 消息队列(MQ)&#xff1a; 信号量(semaphore)&#xff1a; 共享内存(shared memory)&#xff1a; 信号(signal)&#xff1a; 内存映射(mapped memory)&#xff1a; 内存映射和共享内存的区…

【论文共读】【翻译】【GAN】Generative Adversarial Nets

论文原文地址&#xff1a;https://arxiv.org/pdf/1406.2661 翻译&#xff1a;Generative Adversarial Nets 生成对抗网络 0. 摘要 提出了一种新的对抗过程估计生成模型的框架&#xff0c;其中我们同时训练两个模型&#xff1a;一个是捕获数据分布的生成模型G&#xff0c;另一…

RCE和php文件上传

一、远程命令执行&#xff08;RCE&#xff09; RCE漏洞概述 RCE漏洞允许攻击者通过某种方式在目标服务器上执行任意命令。这种漏洞通常出现在服务器端语言中&#xff0c;如PHP。 RCE漏洞原理 PHP中的一些函数可以执行命令或代码&#xff0c;但如果对这些函数的输入未加限制&a…

Docker容器下面home assistant忘记账号密码怎么重置?

环境&#xff1a; docker ha 问题描述&#xff1a; Docker容器下面home assistant忘记账号密码怎么重置&#xff1f; 解决方案&#xff1a; 你可以按照以下步骤来找回或重置密码&#xff1a; 方法一 (未解决) 停止并删除当前的Home Assistant容器&#xff08;确保你已经保…

【Python工具】Python 实现 telnet、loguru 框架下的 DEBUG 分级日志打印

文章目录 1、背景2、轮子2.1、telnet2.2、loguru DEBUG 日志分级 1、背景 最近业务这边需要用 Python 起一个 web 服务器&#xff0c;做 LLM 相关的业务处理。后台选用的是 django 框架做 web 框架&#xff0c;现在也算结项了。初次写 Python&#xff0c;造出来的轮子啥的总结…

Redis学习[3] ——持久化

四. Redis 持久化 4.1 Redis 如何保证数据不丢失&#xff1f; 由于Redis的数据是保存在内存中&#xff0c;而内存中的数据会在Redis重启后丢失。因此&#xff0c;为了保证数据不丢失&#xff0c;Redis实现了数据持久化的机制。这个机制会将内存中的数据存储到磁盘&#xff0c…

【前端 · 面试 】JavaScript 之你不一定会的基础题(一)

最近我在做前端面试题总结系列&#xff0c;感兴趣的朋友可以添加关注&#xff0c;欢迎指正、交流。 争取每个知识点能够多总结一些&#xff0c;至少要做到在面试时&#xff0c;针对每个知识点都可以侃起来&#xff0c;不至于哑火。 JavaScript 之你不一定会的基础题 前言 面试往…

[LLM]一文学会如何构建属于私有Code Pilot

本文将使用基于Llama.cpp的插件Tabby构建个人Code Pilot助手。 首先我们看一下编码的大模型榜单&#xff0c;在抱抱脸上bigcode上可以参考。 给VSCode插上翅膀 榜单上排名第一的是OpenCodeInterpreter-DS-33B&#xff0c;看起来很强大但是显然 MAC M1 是跑不了。虽然 MAC M1可…

使用人工智能在乳腺癌筛查中的早期影响指标| 文献速递-AI辅助的放射影像疾病诊断

Title 题目 Early Indicators of the Impact of Using AI in Mammography Screening for Breast Cancer 使用人工智能在乳腺癌筛查中的早期影响指标 01 文献速递介绍 基于人群的乳腺癌筛查通过使用乳房X线摄影成功地降低了乳腺癌的死亡率&#xff0c;但这给乳腺放射科医生…