MySQL数据库主从复制搭建,一主一从完整教程
前言
做网站的同学肯定都遇到过这种情况:网站用户越来越多,数据库压力越来越大,单台数据库扛不住了。这时候怎么办?很常见的方案就是做主从复制,主库写数据,从库读数据,把读写压力分开。
很多新手同学觉得主从复制很难,不敢尝试。其实只要按照步骤来,一步步配置,很快就能搭起来。这篇文章就把一主一从的主从复制搭建完整教程整理出来,从原理到实操,一步一步讲清楚。
一、主从复制是干嘛的
简单来说,主从复制就是:主数据库(Master)负责写数据,从数据库(Slave)负责读数据。主库的数据会自动同步到从库上。
主从复制的作用
- 读写分离:写操作走主库,读操作走从库,减轻主库压力
- 数据备份:从库相当于实时备份,主库挂了从库还能顶上
- 做数据分析:可以在从库上跑复杂的统计查询,不影响主库的业务
主从复制的原理
主从复制的原理其实很简单,三步:
- 主库把数据变更记录到二进制日志(binlog)里
- 从库把主库的binlog拉过来,写到自己的中继日志(relay log)里
- 从库重放中继日志里的SQL,这样数据就和主库一致了
二、准备工作
搭建主从复制之前,先准备好环境:
服务器准备
需要两台服务器:
- 主库服务器:IP假设是 192.168.1.10
- 从库服务器:IP假设是 192.168.1.11
软件要求
- 两台服务器都要安装MySQL,版本最好一样
- 主库和从库的server-id不能一样
- 两台服务器的MySQL端口要能互相通(一般是3306)
三、配置主库
首先配置主库,编辑主库的my.cnf配置文件:
vi /etc/my.cnf
在 [mysqld] 下面添加这些配置:
[mysqld]
# 唯一的服务器ID,主库和从库不能一样
server-id = 1
# 开启二进制日志
log-bin = mysql-bin
# 需要同步的数据库,多个用逗号隔开
binlog-do-db = testdb
# 不同步的数据库
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
binlog-ignore-db = sys
修改完之后重启主库的MySQL:
systemctl restart mysqld
给从库创建一个复制账号
主库上要创建一个专门用来复制的用户,从库要用这个账号来连主库拉数据。
登录主库MySQL:
mysql -u root -p
然后执行:
CREATE USER 'repl'@'192.168.1.11' IDENTIFIED BY 'repl123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.11';
FLUSH PRIVILEGES;
这个命令创建了一个叫repl的用户,密码是repl123456,只能从从库的IP(192.168.1.11)连接,并且有复制的权限。
查看主库的状态
接下来要记录主库的binlog文件名和位置,从库配置的时候要用:
SHOW MASTER STATUS;
执行完之后会看到类似这样的结果:
+------------------+----------+--------------+----------------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+----------------------------------+-------------------+
| mysql-bin.000001 | 156 | testdb | mysql,information_schema,... | |
+------------------+----------+--------------+----------------------------------+-------------------+
记住File和Position的值,比如这里是 mysql-bin.000001 和 156。
注意:执行完这个命令之后,主库就不要再写数据了,不然Position会变,到时候从库同步就会出错。
四、配置从库
接下来配置从库。编辑从库的my.cnf配置文件:
vi /etc/my.cnf
在 [mysqld] 下面添加:
[mysqld]
# 唯一的服务器ID,和主库不一样就行
server-id = 2
# 开启中继日志
relay-log = relay-bin
# 只读模式,从库默认只读,防止误写
read_only = 1
修改完之后重启从库的MySQL:
systemctl restart mysqld
配置从库连接主库
登录从库的MySQL:
mysql -u root -p
然后执行下面的命令,告诉从库主库在哪里,用什么账号连接:
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='repl',
MASTER_PASSWORD='repl123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=156;
这里的MASTER_LOG_FILE和MASTER_LOG_POS就是刚才在主库上用SHOW MASTER STATUS查出来的值。
启动从库复制
配置完之后,启动从库的复制线程:
START SLAVE;
查看从库状态
看看从库是不是正常运行:
SHOW SLAVE STATUS\G
执行完之后会看到很多信息,重点看这两个:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果这两个都是Yes,那就说明主从复制已经搭好了!
如果是No,那就说明哪里出错了,下面的Last_Error字段会显示错误信息,根据错误信息去排查就行。
五、测试主从复制
现在来测试一下主从复制是不是正常工作。
在主库上创建一个表,插入一些数据:
USE testdb;
CREATE TABLE test (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
INSERT INTO test (name) VALUES ('张三'), ('李四'), ('王五');
然后去从库上查一下:
USE testdb;
SELECT * FROM test;
如果能看到刚才插入的那三条数据,那就说明主从复制是正常工作的!
六、主从复制的常见问题
主从延迟
主从复制不是实时的,有时候主库写了数据,从库要等一会儿才能读到。如果主库压力很大,或者从库性能差,延迟可能会很大。
可以用这个命令查看从库延迟了多少秒:
SHOW SLAVE STATUS\G
看Seconds_Behind_Master这个值,就是延迟的秒数。如果是0,说明没有延迟。
从库误写数据
很多同学不知道从库是只读的,不小心在从库上写了数据,导致主从数据不一致,复制出错。
解决方法:一定要开启read_only=1,并且不要用root账号在从库上操作。
常见坑
坑1:主库和从库的server-id一样
很多同学配置的时候,忘了改从库的server-id,结果主从复制启动不起来。记住:主库和从库的server-id必须不一样。
坑2:主库防火墙没开
主库的防火墙没开3306端口,导致从库连不上主库。一定要检查防火墙是不是放行了3306端口。
坑3:配置完CHANGE MASTER之后忘了START SLAVE
很多同学配置完主库和从库之后,就以为完事了,结果发现数据根本没同步。这是因为忘了执行START SLAVE启动复制线程。
坑4:SHOW MASTER STATUS之后主库还在写数据
很多同学在主库执行了SHOW MASTER STATUS之后,还在往主库写数据,导致Position变了,从库配置的时候用的是旧的Position,结果同步出错。记住:执行SHOW MASTER STATUS之后,主库就不要再写数据了。
坑5:主库和从库数据一开始就不一致
很多同学的主库已经有很多数据了,直接配置主从复制,结果从库同步的时候出错。正确的做法应该是:先把主库的数据导出,导入到从库,然后再配置主从复制。
总结
MySQL主从复制搭建的步骤:
- 准备两台服务器,都安装好MySQL
- 配置主库:设置server-id,开启binlog
- 主库创建复制账号
- 主库执行SHOW MASTER STATUS,记录File和Position
- 配置从库:设置server-id,开启relay log
- 从库执行CHANGE MASTER TO,指向主库
- 从库执行START SLAVE启动复制
- 查看从库状态,确认IO和SQL线程都是Yes
- 在主库写数据,从库查数据,测试同步
主从复制是数据库架构的基础,学会了之后才能搞读写分离、分库分表这些更高级的东西。
遇到问题加QQ23979811 协助处理
MySQL数据库连接数过多,Too many connections解决
前言
做网站开发的同学肯定遇到过这个错误:用户访问网站的时候,突然报错了,说"MySQL连接失败:Too many connections"。这时候网站就打不开了,用户都在骂娘,你急得满头大汗不知道怎么办。
这个错误其实很常见,就是MySQL的最大连接数不够用了。很多新手同学遇到这个错误就慌了,不知道怎么处理。这篇文章就把这个问题的原因和解决方法讲清楚,以后再遇到就不用慌了。
一、为什么会出现Too many connections错误
MySQL默认的最大连接数是151,这个数在小项目里够用,但是如果项目用户多了,或者连接池设置得太大,就很容易把连接数占满。
当所有连接都被占满的时候,新的请求就进不来了,这时候MySQL就会报"Too many connections"的错误。
常见原因
- 应用程序连接池设置太大:比如你的应用配置了500个连接,但是MySQL最大连接数才151,那肯定不够用
- 慢SQL太多:很多SQL执行得很慢,连接迟迟不释放,占着茅坑不拉屎
- 连接没有及时释放:应用程序写完代码忘了关闭连接,导致连接泄漏
- 突发流量:突然来一波大流量,把连接数占满了
二、查看当前连接数和最大连接数
先看看你的MySQL现在最大连接数是多少:
SHOW VARIABLES LIKE 'max_connections';
执行完之后会看到类似这样的结果:
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
再看看当前有多少个连接:
SHOW STATUS LIKE 'Threads_connected';
结果类似:
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 120 |
+-------------------+-------+
你看,当前已经用了120个连接,最大才151,再涨一点就满了。
三、临时调整最大连接数
如果现在已经出现Too many connections错误了,可以先临时把最大连接数调大一点,救个急:
SET GLOBAL max_connections = 500;
这个命令执行完之后立刻生效,不用重启MySQL。但是注意:这个修改是临时的,MySQL重启之后就会恢复成原来的值。
四、永久修改最大连接数
要永久修改的话,需要改配置文件。找到MySQL的配置文件 /etc/my.cnf,在 [mysqld] 下面添加:
[mysqld]
max_connections = 1000
修改完之后重启MySQL服务:
systemctl restart mysqld
这样以后MySQL重启之后最大连接数还是1000,不会变回去。
注意:不要设得太大
很多同学觉得既然不够用,那就设大点,直接设个10000。这是不对的。
每个连接MySQL都要分配内存,如果连接数设得太大,每个连接占的内存加起来就很多了,可能会把服务器内存吃满。
一般来说,最大连接数设到500~1000就够了,要看你的服务器内存有多大。内存大就设大点,内存小就设小点。
五、查看连接是从哪来的
如果连接数突然涨得很猛,你得看看这些连接都是从哪来的,是不是有哪个程序疯了一直在创建连接。
SELECT
host,
COUNT(*) AS count
FROM information_schema.processlist
GROUP BY host
ORDER BY count DESC;
这个命令会把每个IP的连接数统计出来,你看看是不是某个IP连接特别多,如果是的话,就去查那个程序是不是有问题。
六、查看正在执行的SQL
如果很多连接都在执行SQL,那可能是慢SQL太多导致的。看看现在都在执行什么SQL:
SHOW PROCESSLIST;
执行完之后会列出所有正在运行的连接和SQL语句。你看看有没有执行了很久还没跑完的SQL,如果有的话,那就是罪魁祸首。
七、杀掉空闲连接
如果有很多连接都是空闲的(Sleep状态),占着连接不干活,那可以把它们杀掉,释放连接。
先看看有多少个Sleep状态的连接:
SELECT COUNT(*) FROM information_schema.processlist WHERE command = 'Sleep';
如果Sleep状态的连接很多,可以把它们杀掉。不过手动一个个杀太麻烦了,可以设置一个自动断开空闲连接的参数:
SET GLOBAL wait_timeout = 60;
SET GLOBAL interactive_timeout = 60;
这两个参数的意思是:连接如果空闲超过60秒,MySQL就自动把它断开,释放连接。
同样,这个修改是临时的,要永久生效的话需要写到配置文件里:
[mysqld]
wait_timeout = 60
interactive_timeout = 60
八、从根本上解决问题
光调大最大连接数只是治标不治本,要从根本上解决问题,还得从应用层面下手:
- 检查应用程序是不是有连接泄漏:用完连接记得释放,不要一直占着
- 优化慢SQL:把执行慢的SQL优化一下,减少连接占用时间
- 合理设置连接池大小:连接池不要设得太大,比最大连接数小一点就行
- 使用连接池中间件:比如MyCat、ProxySQL这些数据库中间件,可以统一管理连接
常见坑
坑1:改完max_connections之后重启又变回去了
很多同学用SET GLOBAL改完最大连接数之后,以为就完事了,结果MySQL一重启又变回原来的值。这是因为SET GLOBAL是临时修改,要永久生效必须改配置文件。
坑2:max_connections设得太大
很多同学一遇到连接数不够,就直接把max_connections改成10000,结果MySQL直接起不来了,或者服务器内存被吃满了。每个连接都要占内存,连接数越大,内存消耗越多,要根据服务器内存来设,不要盲目设大。
坑3:只改了max_connections,没改表连接数
其实MySQL还有一个参数叫max_user_connections,是限制单个用户的最大连接数的。如果你给某个用户限制了最大连接数,就算全局max_connections很大,那个用户的连接数到上限了还是会报错。
可以用这个命令查看:
SHOW VARIABLES LIKE 'max_user_connections';
坑4:杀掉了正在执行重要SQL的连接
很多同学一看到连接数满了,就不管三七二十一把所有连接都杀掉。结果把正在执行重要业务SQL的连接也杀了,导致业务出问题。杀连接之前一定要看清楚,不要乱杀。
总结
MySQL Too many connections错误的解决方法:
- 先查看当前最大连接数和已用连接数
- 临时救急:用SET GLOBAL调大max_connections
- 永久解决:改my.cnf配置文件,设置max_connections
- 看看连接都是从哪来的,有没有异常
- 优化慢SQL,减少连接占用时间
- 设置wait_timeout,自动断开空闲连接
- 从应用层面优化,减少连接泄漏
记住:调大最大连接数只是治标,优化SQL和代码才是治本。不要一遇到连接数不够就盲目调大max_connections,先找找根本原因。
遇到问题加QQ23979811 协助处理
MySQL用户创建和权限管理完整教程
前言
做网站开发或者运维的同学,肯定会遇到这种情况:需要给开发或者运营同学一个数据库账号,但是又不能给root权限,怕他们误操作删库。这时候就需要用到MySQL的用户和权限管理功能了。
很多新手同学只会用root账号登录数据库,不知道怎么创建新用户、怎么分配权限。这篇文章就把MySQL用户创建和权限管理的完整教程整理出来,从创建用户、授权、改密码到删除用户,一步一步讲清楚。
一、创建用户
首先我们来创建一个新用户。MySQL创建用户有两种方式:CREATE USER 和 GRANT。
方式1:用CREATE USER创建用户
CREATE USER 'testuser'@'localhost' IDENTIFIED BY '123456';
这个命令创建了一个叫testuser的用户,密码是123456,只能从本机(localhost)连接MySQL。
如果你想让用户可以从任何地方连接,可以把localhost改成%:
CREATE USER 'testuser'@'%' IDENTIFIED BY '123456';
注意:生产环境不建议用%,最好指定具体的IP地址,更安全。
方式2:用GRANT创建用户并直接授权
其实更常用的是创建用户的同时直接授权,一步到位:
GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'localhost' IDENTIFIED BY '123456';
这个命令会自动创建testuser用户,并且把testdb数据库的所有权限都给它。
二、给用户授权
创建完用户之后,我们来给用户分配权限。MySQL的权限粒度很细,可以精确到某张表、某个字段。
常用权限说明
- ALL PRIVILEGES:所有权限
- SELECT:查询权限
- INSERT:插入权限
- UPDATE:更新权限
- DELETE:删除权限
- CREATE:创建表/数据库权限
- DROP:删除表/数据库权限
- ALTER:修改表结构权限
- INDEX:创建索引权限
- CREATE VIEW:创建视图权限
- PROCESS:查看进程权限
- RELOAD:执行flush权限
- SHOW DATABASES:查看所有数据库权限
给用户所有权限
GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'localhost';
这个命令的意思是:把testdb数据库里所有表的所有权限都给testuser用户。
只给用户查询和修改权限
GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO 'testuser'@'localhost';
这样用户就只能查询、插入、修改、删除数据,不能修改表结构,也不能删表。
只给用户某张表的权限
GRANT SELECT ON testdb.users TO 'testuser'@'localhost';
这样用户只能查询testdb库里的users表,其他表都访问不了。
给用户所有数据库的权限
GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'localhost';
.的意思是所有数据库的所有表。这个权限基本相当于root了,要谨慎使用。
授权之后一定要刷新权限
每次给用户授权之后,一定要执行下面这个命令刷新权限,不然授权可能不生效:
FLUSH PRIVILEGES;
三、查看用户权限
想知道某个用户有什么权限,可以用下面这个命令:
SHOW GRANTS FOR 'testuser'@'localhost';
执行完之后会显示这个用户的所有权限。
查看所有用户
如果想看看MySQL里有哪些用户,可以查询mysql.user表:
SELECT user, host FROM mysql.user;
四、修改用户密码
如果要修改某个用户的密码,可以用下面的命令:
ALTER USER 'testuser'@'localhost' IDENTIFIED BY '新密码';
修改完之后也要刷新权限:
FLUSH PRIVILEGES;
五、回收用户权限
如果用户权限给多了,想收回某些权限,可以用REVOKE命令:
收回所有权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'testuser'@'localhost';
收回某个具体权限
REVOKE DELETE ON testdb.* FROM 'testuser'@'localhost';
这样用户就没有删除数据的权限了。
回收完权限之后也要刷新:
FLUSH PRIVILEGES;
六、删除用户
如果某个用户不需要了,可以删除:
DROP USER 'testuser'@'localhost';
注意:删除用户的时候,用户已有的权限也会一起被删掉。
七、创建用户的安全建议
- 不要随便给用户ALL PRIVILEGES:按需授权,只给需要的权限就行
- 不要用%允许所有IP连接:生产环境最好指定具体的IP
- 不要用root账号给应用用:单独创建一个应用账号,只给需要的权限
- 密码要复杂一点:不要用123456这种简单密码
- 定期清理不用的用户:不用的用户及时删掉,减少安全隐患
常见坑
坑1:授权之后忘了FLUSH PRIVILEGES
很多同学授权完之后直接就用了,结果发现权限没生效。这就是因为忘了执行FLUSH PRIVILEGES。每次授权或者改密码之后,一定要执行一下这个命令刷新权限。
坑2:用户创建了但是连不上
很多同学创建完用户之后,用这个用户去连接数据库,结果连接失败。这一般是因为:
- 你创建用户的时候指定的是localhost,但是你从其他IP连接
- 防火墙没放行MySQL端口
- 用户密码输错了
坑3:%和localhost搞混了
很多同学不知道'localhost'@'%'和'%'@'localhost'的区别。记住:用户名是前面的,后面的是允许连接的IP。
坑4:给了权限但是还是操作不了
有时候给了用户权限,但是用户还是操作不了。这一般是因为:
- 忘了FLUSH PRIVILEGES
- 表或者字段的权限没给
- 用户根本就没有这个数据库的权限
总结
MySQL用户创建和权限管理的核心内容:
- 创建用户:CREATE USER 或者 GRANT 直接创建并授权
- 给用户授权:GRANT 权限 ON 数据库.表 TO 用户@IP
- 查看权限:SHOW GRANTS FOR 用户
- 改密码:ALTER USER 用户 IDENTIFIED BY 新密码
- 回收权限:REVOKE 权限 ON 数据库.表 FROM 用户
- 删除用户:DROP USER 用户
- 所有操作完之后都要 FLUSH PRIVILEGES 刷新权限
记住这些命令,以后给应用或者同事分配数据库账号的时候就不用慌了。安全第一,不要随便给用户root权限。
遇到问题加QQ23979811 协助处理
MySQL查看数据库大小和表大小命令
前言
做运维的同学经常会遇到这种情况:服务器磁盘突然满了,不知道是哪个数据库或者哪张表占了这么多空间。或者想知道自己的数据库现在有多大了,好提前规划扩容。
这时候就需要用SQL命令来查看数据库和表的大小了。很多新手同学不知道怎么查,只能傻乎乎的用du命令看整个data目录的大小,看不到具体是哪个数据库或哪张表占了空间。
这篇文章就把MySQL查看数据库大小和表大小的常用SQL命令都整理出来,以后遇到磁盘满了的问题就能快速定位了。
一、查看所有数据库的大小
如果你想知道MySQL里每个数据库分别占了多少空间,可以执行下面这个SQL:
SELECT
table_schema AS '数据库名',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS '大小(MB)'
FROM information_schema.tables
GROUP BY table_schema
ORDER BY SUM(data_length + index_length) DESC;
执行完之后会列出所有数据库的大小,单位是MB,从大到小排序。这样你一眼就能看出来哪个数据库最占空间了。
二、查看指定数据库的大小
如果你只想看某个数据库的大小,比如testdb数据库,可以执行:
SELECT
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS '数据库大小(MB)'
FROM information_schema.tables
WHERE table_schema = 'testdb';
把testdb换成你要查询的数据库名就行。
三、查看数据库里所有表的大小
知道了哪个数据库大,接下来就要看这个数据库里哪张表最大了。执行下面这个SQL:
SELECT
table_name AS '表名',
table_rows AS '行数',
ROUND((data_length + index_length) / 1024 / 1024, 2) AS '大小(MB)'
FROM information_schema.tables
WHERE table_schema = 'testdb'
ORDER BY (data_length + index_length) DESC;
这样就能列出testdb数据库里所有表的大小,从大到小排序。你一眼就能看出来哪张表最占空间了。
四、查看单张表的大小
如果你只想看某一张表的大小,比如users表,可以执行:
SELECT
table_name AS '表名',
table_rows AS '行数',
ROUND((data_length + index_length) / 1024 / 1024, 2) AS '大小(MB)'
FROM information_schema.tables
WHERE table_schema = 'testdb'
AND table_name = 'users';
五、查看表的详细大小(数据+索引分开)
有时候你想知道一张表里数据占了多少,索引占了多少,方便优化。可以执行:
SELECT
table_name AS '表名',
ROUND(data_length / 1024 / 1024, 2) AS '数据大小(MB)',
ROUND(index_length / 1024 / 1024, 2) AS '索引大小(MB)',
ROUND((data_length + index_length) / 1024 / 1024, 2) AS '总大小(MB)'
FROM information_schema.tables
WHERE table_schema = 'testdb'
ORDER BY (data_length + index_length) DESC;
六、查看数据库里所有表的行数
有时候你只想知道每张表有多少行数据,不需要看大小。可以执行:
SELECT
table_name AS '表名',
table_rows AS '行数'
FROM information_schema.tables
WHERE table_schema = 'testdb'
ORDER BY table_rows DESC;
七、查看MySQL整体占了多少磁盘空间
如果你想知道整个MySQL一共占了多少磁盘空间,可以执行:
SELECT
ROUND(SUM(data_length + index_length) / 1024 / 1024 / 1024, 2) AS 'MySQL总大小(GB)'
FROM information_schema.tables;
常见坑
坑1:table_rows显示的行数不准确
很多同学发现,用 information_schema.tables 查出来的 table_rows 和实际 count(*) 出来的行数对不上。
这是因为 information_schema 里的 table_rows 是估算值,不是精确值。InnoDB引擎的话,这个值大概有10%左右的误差。如果需要精确的行数,还是得用 SELECT COUNT(*) FROM 表名。
坑2:查出来的大小和实际磁盘占用对不上
有时候你用SQL查出来的数据库大小,和用 du 命令查出来的 data 目录大小对不上,差了不少。
这是因为MySQL的data目录里除了表数据和索引,还有:
- redo log、undo log这些日志文件
- ibdata1这些系统表空间文件
- 二进制日志文件
这些都不算在表数据和索引大小里。所以用SQL查出来的大小一般会比实际磁盘占用小一点。
坑3:查完之后发现有个库特别大,不知道是什么
有时候你查完发现有个库特别大,但是你根本不知道这个库是干嘛的。一般可能是:
- mysql系统库
- information_schema、performance_schema这些系统库
- 之前测试的时候建的库,忘了删了
坑4:磁盘满了但是查出来数据库没多大
如果磁盘满了,但是查出来数据库没多大,那大概率不是数据库的问题,可能是:
- 日志文件太大(比如nginx日志、MySQL的binlog日志)
- 网站上传的文件太大
- 系统临时文件太多
这时候需要去查一下具体是哪个目录占了空间。
总结
MySQL查看数据库和表大小的常用SQL命令总结一下:
- 查看所有数据库大小:查 information_schema.tables,按 table_schema 分组
- 查看指定数据库大小:加 WHERE table_schema = '数据库名'
- 查看数据库里所有表的大小:按 table_name 分组
- 查看单张表的大小:加 AND table_name = '表名'
- 数据和索引分开看:data_length 和 index_length
- 查看行数:table_rows 字段
记住这些SQL命令,以后遇到磁盘满了的问题,就能快速定位是哪个数据库、哪张表占了空间,不用再瞎找了。
遇到问题加QQ23979811 协助处理
MySQL数据库备份和恢复教程
前言
做运维或者开发的同学都知道,数据库是整个网站最核心的资产。一旦数据库出了问题,数据丢了,那损失可就大了。所以做好数据库备份是非常重要的一件事。
很多新手同学可能从来没做过数据库备份,等真的出问题了才后悔莫及。这篇文章就详细讲讲MySQL数据库怎么备份和恢复,包括常用的备份命令、恢复方法,还有自动定时备份的脚本。
一、备份方法
MySQL备份最常用的工具就是mysqldump,它是MySQL自带的备份工具,不需要额外安装。
1. 备份整个数据库
备份单个数据库是最常用的场景。比如你要把本地的testdb数据库备份成一个sql文件:
mysqldump -u root -p testdb > /root/testdb.sql
执行完之后输入MySQL的密码,就开始备份了。备份完之后会在/root/目录下生成一个testdb.sql文件。
2. 备份单张表
有时候你只需要备份数据库里的某一张表,比如只备份users表:
mysqldump -u root -p testdb users > /root/users.sql
3. 备份所有数据库
如果你想把MySQL里所有的数据库都备份下来,可以用 --all-databases 参数:
mysqldump -u root -p --all-databases > /root/all.sql
4. 只备份表结构,不备份数据
有时候你只需要备份表结构,不需要备份数据,这时候可以用 --no-data 参数:
mysqldump -u root -p --no-data testdb > /root/testdb_schema.sql
5. 备份的时候加锁保证数据一致性
备份大表的时候,为了保证备份过程中数据不被修改,可以加 --lock-tables 参数:
mysqldump -u root -p --lock-tables testdb > /root/testdb.sql
6. 备份的时候压缩文件
如果数据库很大,备份出来的sql文件也会很大,这时候可以用gzip压缩一下:
mysqldump -u root -p testdb | gzip > /root/testdb.sql.gz
二、恢复方法
备份完了,怎么恢复呢?
1. 恢复整个数据库
恢复整个数据库的命令:
mysql -u root -p testdb < /root/testdb.sql
注意:恢复之前一定要确保testdb这个数据库已经存在了。如果不存在,需要先创建数据库:
CREATE DATABASE testdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
2. 恢复单张表
恢复单张表的话,先登录MySQL,然后选择对应的数据库,再用source命令恢复:
mysql -u root -p
USE testdb;
source /root/users.sql;
3. 恢复压缩的备份文件
如果你的备份文件是用gzip压缩过的,恢复的时候需要先解压:
gunzip < /root/testdb.sql.gz | mysql -u root -p testdb
三、自动定时备份脚本
手动备份太麻烦了,我们可以写个脚本,每天自动备份数据库。
备份脚本内容
创建一个备份脚本 /root/mysql_backup.sh:
#!/bin/bash
# 数据库配置
DB_USER="root"
DB_PASSWORD="你的MySQL密码"
DB_NAME="testdb"
BACKUP_DIR="/root/backup"
# 备份文件名,用日期命名
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/testdb_$DATE.sql"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行备份
mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_FILE
# 压缩备份文件
gzip $BACKUP_FILE
# 删除7天前的备份文件
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "备份完成:$BACKUP_FILE.gz"
给脚本加执行权限
chmod +x /root/mysql_backup.sh
添加到定时任务
用crontab添加定时任务,每天凌晨3点自动备份:
crontab -e
添加下面这行:
0 3 * * * /root/mysql_backup.sh
这样每天凌晨3点就会自动备份数据库了,而且只保留最近7天的备份,旧的会自动删除。
常见坑
坑1:备份的时候忘了加密码,执行的时候卡住了
很多同学写备份命令的时候,直接写 mysqldump -u root -p testdb > xxx.sql,然后执行的时候就会停下来让你输入密码。如果是在脚本里用的话,就会卡住。
解决方法是把密码直接写在命令里:mysqldump -u root -p你的密码 testdb > xxx.sql。注意-p和密码之间没有空格。
坑2:恢复的时候数据库不存在
很多同学恢复的时候直接执行 mysql -u root -p testdb < xxx.sql,结果报错说数据库不存在。记住恢复之前一定要先创建好对应的数据库。
坑3:备份文件太大,恢复的时候超时了
大文件恢复的时候很容易超时,或者因为各种原因中断。这时候可以用source命令在MySQL内部恢复,会稳定很多。
坑4:备份文件存在本地,服务器挂了备份也没了
很多同学备份文件直接放在服务器本地,觉得这样就安全了。其实不对,如果服务器磁盘坏了,或者被黑客删了,备份文件也没了。
正确的做法是:
- 每天备份完之后,把备份文件下载到本地电脑
- 或者上传到云存储(比如阿里云OSS、腾讯云COS)
- 重要的备份最好异地多存几份
总结
MySQL数据库备份和恢复的核心内容:
- 备份命令:mysqldump,常用参数有 --all-databases、--no-data、--lock-tables
- 恢复命令:mysql < 备份文件,或者用source命令
- 自动备份:写个shell脚本,配合crontab定时执行
- 备份文件一定要异地存储,不能只放在服务器本地
数据库备份是个大事,千万不要等出问题了才想起来备份。养成每天自动备份的好习惯,出问题的时候才能从容应对。
遇到问题加QQ23979811 协助处理
Nginx 日志分析技巧
Nginx 日志分析技巧
Nginx 日志是排查问题、分析流量的重要工具。学会看日志,网站问题排查效率翻倍。
1. 日志位置
# 默认访问日志
/var/log/nginx/access.log
# 默认错误日志
/var/log/nginx/error.log
可以在 nginx.conf 里自定义:
access_log /var/log/nginx/www.access.log;
error_log /var/log/nginx/www.error.log;
2. 日志格式
默认日志格式:
127.0.0.1 - - [04/Oct/2026:10:00:00 +0800] "GET / HTTP/1.1" 200 612 "https://www.baidu.com/" "Mozilla/5.0..."
各字段含义:
- IP 地址
- 请求时间
- 请求方法和路径
- 状态码
- 响应大小
- 来源页面
- User-Agent
3. 常用分析命令
# 查看访问量前10的IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head 10
# 查看访问量前10的页面
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head 10
# 查看状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -nr
# 查看 404 请求
grep ' 404 ' access.log
# 查看 502 错误
grep ' 502 ' access.log
4. 排查问题
排查 502 错误:
grep ' 502 ' access.log | tail 20
排查慢请求:
开启慢日志:
slow_request_log /var/log/nginx/slow.log;
slow_request_time 5s;
排查爬虫:
grep 'Baiduspider' access.log
grep 'Googlebot' access.log
5. 流量统计
# 今天总访问量
grep '04/Oct/2026' access.log | wc -l
# 今天总流量
grep '04/Oct/2026' access.log | awk '{sum+=$10} END {print sum/1024/1024 " MB"}'
# 每小时访问量
awk '{print $4}' access.log | cut -d: -f2 | uniq -c
6. 日志切割
日志太大要切割,用 logrotate:
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
notifempty
create 0640 nginx adm
postrotate
systemctl reload nginx
endscript
}
7. 常用工具
- GoAccess:实时日志分析工具
- ELK:Elasticsearch + Logstash + Kibana
- Zabbix:监控告警
总结
Nginx 日志分析核心:
- 位置:/var/log/nginx/
- 命令:awk + sort + uniq
- 排查:看状态码、看慢请求
- 切割:用 logrotate
学会这些,日常日志分析基本够用了。
Docker 常用命令大全
Docker 常用命令大全
Docker 命令不多,但记不住还是很麻烦。整理一份常用命令清单,收藏备用。
1. 镜像命令
# 拉取镜像
docker pull nginx:latest
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx:latest
# 搜索镜像
docker search nginx
# 导出镜像
docker save -o nginx.tar nginx:latest
# 导入镜像
docker load -i nginx.tar
2. 容器命令
# 启动容器(后台运行)
docker run -d --name mynginx -p 80:80 nginx
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop mynginx
# 启动已停止的容器
docker start mynginx
# 重启容器
docker restart mynginx
# 删除容器
docker rm mynginx
# 强制删除运行中的容器
docker rm -f mynginx
3. 进入容器
# 进入容器(bash)
docker exec -it mynginx bash
# 进入容器(sh)
docker exec -it mynginx sh
# 查看容器日志
docker logs mynginx
# 实时查看日志
docker logs -f mynginx
# 查看容器详情
docker inspect mynginx
4. 文件操作
# 从容器复制文件到宿主机
docker cp mynginx:/etc/nginx/nginx.conf ./
# 从宿主机复制文件到容器
docker cp ./index.html mynginx:/usr/share/nginx/html/
5. 端口和网络
# 查看容器端口映射
docker port mynginx
# 查看容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mynginx
6. 清理命令
# 停止所有容器
docker stop $(docker ps -q)
# 删除所有停止的容器
docker container prune
# 删除所有未使用的镜像
docker image prune
# 删除所有未使用的资源(危险操作)
docker system prune -a
7. Docker Compose 常用命令
# 启动所有服务
docker-compose up -d
# 停止所有服务
docker-compose down
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f
# 重启某个服务
docker-compose restart nginx
总结
Docker 常用命令核心:
- 镜像:pull / images / rmi
- 容器:run / ps / stop / start / rm
- 进入:exec -it
- 日志:logs -f
- 清理:prune
记住这些,日常 Docker 操作基本够用了。
Nginx 负载均衡配置
Nginx 负载均衡配置实战
网站流量大了,单台服务器扛不住,就得用负载均衡。Nginx 做负载均衡很简单,几行配置就行。
1. 基本配置
http {
upstream backend {
server 192.168.1.101:80;
server 192.168.1.102:80;
server 192.168.1.103:80;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backend;
}
}
}
默认是轮询(round robin),请求轮流分到三台服务器。
2. 四种分配策略
轮询(默认):一个一个来。
权重(weight):按比例分配,性能好的服务器多分担。
upstream backend {
server 192.168.1.101 weight=3;
server 192.168.1.102 weight=2;
server 192.168.1.103 weight=1;
}
3:2:1 的比例,第一台分一半请求。
ip_hash:同一个 IP 固定分到同一台服务器,解决 session 问题。
upstream backend {
ip_hash;
server 192.168.1.101;
server 192.168.1.102;
}
least_conn:最少连接数优先,分给当前最闲的服务器。
upstream backend {
least_conn;
server 192.168.1.101;
server 192.168.1.102;
}
3. 健康检查
upstream backend {
server 192.168.1.101 max_fails=3 fail_timeout=30s;
server 192.168.1.102 max_fails=3 fail_timeout=30s;
}
一台服务器挂了,自动从列表里摘掉,恢复了再加回来。
4. 常用参数
- max_fails:失败几次算挂了,默认1次
- fail_timeout:挂了多久再重试,默认10秒
- down:标记服务器下线,不分配请求
- backup:备用服务器,其他都挂了才用
5. 完整示例
upstream backend {
server 192.168.1.101 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.102 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.103 backup;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
总结
Nginx 负载均衡核心:
- upstream 定义服务器组
- 四种策略:轮询、权重、ip_hash、最少连接
- 健康检查自动摘除故障节点
- 生产环境用权重 + 健康检查就够了
搞懂这些,多台服务器集群就跑起来了。
Linux 文件权限详解
Linux 文件权限详解
Linux 权限是服务器安全的基础,搞懂权限,服务器才不会乱。
1. 查看权限
用 ls -l 查看文件权限:
ls -l file.txt
-rw-r--r-- 1 user group 1024 Oct 4 10:00 file.txt
开头10个字符就是权限:
- 第1个:文件类型(- 普通文件,d 目录)
- 第2-4个:所有者权限
- 第5-7个:所属组权限
- 第8-10个:其他人权限
2. 三种权限
- r(读)= 4
- w(写)= 2
- x(执行)= 1
数字加起来就是权限值:
- 7 = 4+2+1 = rwx
- 6 = 4+2 = rw-
- 5 = 4+1 = r-x
- 4 = 4 = r--
3. 修改权限 chmod
# 给所有者加执行权限
chmod u+x file.txt
# 给所有人只读权限
chmod 444 file.txt
# 所有者读写执行,组和其他人只读
chmod 744 file.txt
4. 修改所有者 chown
# 修改文件所有者
chown user:group file.txt
# 递归修改目录
chown -R user:group /data/www
5. 常用权限
- 普通文件:644(所有者读写,其他人只读)
- 目录:755(所有者读写执行,其他人读执行)
- 脚本文件:755(所有者能执行)
6. 安全建议
- 网站目录不要用 root 所有者
- 上传目录禁止执行权限
- 配置文件权限设为 600,只有所有者能读
总结
Linux 权限核心就是三组(所有者、组、其他人)× 三种(读、写、执行),用数字表示就是 r=4、w=2、x=1。搞懂这个,日常权限管理基本够用了。
Linux 进程管理命令
Linux 进程管理常用命令
服务器上跑了多少进程?哪个进程占内存多?怎么杀进程?这些命令必须会。
1. 查看进程
# 查看所有进程
ps aux
# 查找指定进程
ps aux | grep nginx
# 实时查看
top
2. top 命令详解
top 是最常用的进程查看工具:
- 第一行:系统负载
- 第二行:任务数
- 第三行:CPU 使用率
- 第四行:内存使用
- 第五行:Swap 使用
按 q 退出,按 k 杀进程。
3. 杀进程
# 按 PID 杀
kill 1234
# 强制杀
kill -9 1234
# 按名字杀
pkill nginx
# 杀掉所有同名进程
killall nginx
4. 查看端口占用
# 查看端口被谁占了
netstat -tlnp | grep 80
# 或者用 ss
ss -tlnp | grep 80
5. 查看进程树
# 查看进程父子关系
pstree
# 查看某个进程的子进程
pstree -p 1234
6. 后台运行
# 后台运行
nohup ./script.sh &
# 查看后台任务
jobs
# 把任务调到前台
fg %1
7. 查看资源占用
# 内存占用排行
ps aux --sort=-%mem | head
# CPU 占用排行
ps aux --sort=-%cpu | head
总结
日常运维就这几个命令:ps、top、kill、netstat、nohup。学会这些,服务器进程管理基本够用了。
Nginx 日志分析技巧
Nginx 日志分析常用命令
Nginx 日志是排查问题、分析流量的重要工具。掌握几个常用命令,线上排查效率翻倍。
1. 查看访问量
# 总请求数
wc -l access.log
# 今天的请求数
grep "04/Oct/2026" access.log | wc -l
2. 分析 IP 访问量
# 访问最多的前10个IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
3. 分析 URL 访问量
# 访问最多的前10个URL
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -10
4. 分析状态码
# 统计各状态码数量
awk '{print $9}' access.log | sort | uniq -c | sort -nr
# 404错误数量
grep " 404 " access.log | wc -l
5. 分析流量
# 总流量
awk '{sum += $10} END {print sum/1024/1024 " MB"}' access.log
6. 实时监控
# 实时查看最新日志
tail -f access.log
# 实时查看502错误
tail -f access.log | grep " 502 "
7. 查找慢请求
# 响应时间超过1秒的请求
awk '$NF > 1' access.log | head -10
8. 排查爬虫
# 百度爬虫访问量
grep "Baiduspider" access.log | wc -l
总结
Nginx 日志分析主要靠 awk + sort + uniq 组合,掌握这几个命令,日常排查基本够用。复杂分析可以用 GoAccess 等可视化工具。
Linux 常用命令:从文件操作到进程管理的完整指南
前言
Linux 是后端开发的必修课。很多新手面对黑窗口就发怵,其实只要掌握常用命令,日常开发就够用了。本文整理最常用的 Linux 命令。
一、文件操作
1. 查看目录
# 列出当前目录文件
ls
# 详细信息
ls -l
# 包括隐藏文件
ls -la
# 按时间排序
ls -lt
2. 切换目录
# 进入目录
cd /home/user
# 回到上一级
cd ..
# 回到用户主目录
cd ~
# 回到上次目录
cd -
3. 创建目录
# 创建目录
mkdir test
# 递归创建多级目录
mkdir -p a/b/c
4. 创建文件
# 创建空文件
touch test.txt
# 写入内容
echo "hello" > test.txt
# 追加内容
echo "world" >> test.txt
5. 复制文件
# 复制文件
cp test.txt test2.txt
# 复制目录
cp -r dir1 dir2
6. 移动/重命名
# 移动文件
mv test.txt /tmp/
# 重命名
mv old.txt new.txt
7. 删除文件
# 删除文件
rm test.txt
# 删除目录
rm -rf dir1
警告:rm -rf 很危险,一定要确认路径!
二、查看文件内容
1. cat
# 查看整个文件
cat test.txt
2. less
# 分页查看
less test.log
# 快捷键:
# 空格:下一页
# b:上一页
# /关键字:搜索
# q:退出
3. head / tail
# 看前 10 行
head -10 test.txt
# 看后 10 行
tail -10 test.txt
# 实时看日志(最常用)
tail -f /var/log/nginx/access.log
三、查找文件
1. find
# 按文件名查找
find / -name "nginx.conf"
# 按大小查找(大于 100M)
find / -size +100M
# 按修改时间查找(7 天内修改的)
find / -mtime -7
2. grep
# 在文件里搜索
grep "error" test.log
# 不区分大小写
grep -i "error" test.log
# 显示行号
grep -n "error" test.log
# 递归搜索目录
grep -r "function" /var/www/
# 配合管道使用
ps aux | grep nginx
四、系统状态
1. 查看进程
# 所有进程
ps aux
# 查找进程
ps aux | grep nginx
2. 杀死进程
# 按 PID 杀
kill 1234
# 强制杀
kill -9 1234
# 按名字杀
pkill nginx
3. 查看端口
# 查看所有监听端口
netstat -tlnp
# 查看某个端口
netstat -tlnp | grep 80
4. 查看磁盘
# 磁盘使用情况
df -h
# 当前目录大小
du -sh .
# 每个子目录大小
du -sh *
5. 查看内存
free -h
五、权限管理
1. chmod
# 给文件加执行权限
chmod +x test.sh
# 755:所有者可读写执行,其他人可读执行
chmod 755 test.sh
# 644:所有者可读写,其他人只读
chmod 644 test.txt
2. chown
# 修改文件所有者
chown www:www test.txt
六、压缩解压
1. tar
# 压缩
tar -zcvf website.tar.gz /var/www/html
# 解压
tar -zxvf website.tar.gz
2. zip
# 压缩
zip -r website.zip /var/www/html
# 解压
unzip website.zip
七、网络相关
1. curl
# 访问网页
curl https://www.baidu.com
# 查看响应头
curl -I https://www.baidu.com
# 发 POST 请求
curl -X POST -d "name=张三" https://api.example.com
2. wget
# 下载文件
wget https://example.com/file.zip
八、常用快捷键
| 快捷键 | 作用 |
|---|---|
| Ctrl + C | 终止当前命令 |
| Ctrl + Z | 暂停当前命令 |
| Ctrl + D | 退出终端 |
| Tab | 自动补全 |
| Ctrl + R | 搜索历史命令 |
| !命令 | 执行最近一次的某命令 |
九、常用操作速查
| 操作 | 命令 |
|---|---|
| 看文件 | cat / less / tail -f |
| 找文件 | find / grep |
| 看进程 | ps aux / top |
| 看端口 | netstat -tlnp |
| 看磁盘 | df -h / du -sh |
| 改权限 | chmod / chown |
总结
Linux 常用命令的核心要点:
- 文件操作:ls / cd / mkdir / cp / mv / rm
- 查看内容:cat / less / tail -f
- 查找搜索:find / grep
- 进程管理:ps / kill / netstat
- 系统状态:df / du / free
不用背,用多了自然就记住了。先把这几个常用的练熟,日常开发基本够用。
Nginx 配置实战:反向代理、负载均衡与缓存
前言
Nginx 是目前最流行的 Web 服务器和反向代理软件。很多人会写简单的配置,但对反向代理、负载均衡、缓存这些高级用法并不熟悉。本文带你从零开始,掌握 Nginx 的核心配置技巧。
一、反向代理基础
反向代理是 Nginx 最常用的功能之一。用户请求 Nginx,Nginx 再把请求转发给后端应用服务器。
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
关键说明:
proxy_pass:后端服务地址proxy_set_header:传递真实的客户端信息给后端,否则后端拿到的都是 Nginx 的信息
二、负载均衡
当后端有多台服务器时,可以用 Nginx 做负载均衡。
1. 轮询(默认)
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
2. 加权轮询
upstream backend {
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 weight=1;
}
weight 值越大,分配的请求越多。适合配置不同的服务器。
3. ip_hash 会话保持
upstream backend {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
同一个 IP 的请求总是分配到同一台后端服务器,适合有 session 的场景。
三、缓存配置
Nginx 缓存可以大幅减轻后端压力,提升响应速度。
1. 配置缓存路径
http {
# 定义缓存路径和参数
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
add_header X-Cache-Status $upstream_cache_status;
}
}
}
关键参数说明:
keys_zone:缓存共享内存区大小max_size:缓存最大占用空间inactive:多久没访问就自动清理proxy_cache_valid:不同状态码的缓存时间X-Cache-Status:查看是否命中缓存(HIT/MISS/BYPASS)
2. 不缓存特定请求
location /admin/ {
proxy_pass http://backend;
proxy_cache off; # 后台页面不缓存
}
四、HTTPS 配置
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
# HTTP 跳转 HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
五、常见问题排查
1. 502 Bad Gateway
通常是后端服务挂了或者端口不对:
# 检查后端服务是否在运行
netstat -tlnp | grep 8080
# 查看 Nginx 错误日志
tail -f /var/log/nginx/error.log
2. 上传文件大小限制
http {
client_max_body_size 50M;
}
3. 超时设置
location / {
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
总结
Nginx 配置的核心思路:
- 反向代理:把请求转发给后端应用
- 负载均衡:多台后端服务器分担流量
- 缓存:静态内容缓存,减少后端压力
- HTTPS:加密传输,安全第一
掌握这些配置,你就能应对大部分 Web 服务器场景了。Nginx 配置文件改完记得执行 nginx -t 检查语法,然后 nginx -s reload 重载生效。