- 从数据库(Slave)是主数据库(Master)的备份,当主数据库变化时从数据库要同步更新,这是提高信息安全的手段。主从数据库服务器不在一个地理位置上,当发生意外时数据库可以保存。
- 应用一般读操作要频繁于写操作,因此要有多个读数据库来均衡用户的大量读操作。
- 在Master机器上的操作:在master上的数据发生变化时,该事件变化会按照顺序写入bin-log中,当slave连接到master的时候,master机器会为slave开启binlog dump线程,当master的binlog发生变化的时候,bin-log dump线程会通知slave,并将响应的binlog内容发送给slave。
- 在Slave机器上的操作:当主从同步开启的时候,slave上会创建两个线程,I\O线程,该线程连接到master机器,master机器上的binlog dump线程会将binlog的内容发送给该I\O线程。该I\O线程接收到binlog内容后,再将内容写入到本地的relay log
- 双机热备即两台Mysql服务器互为主备,以下只记录一个方向的主备设置。
- 两台服务器A(主服务器) ip: 192.168.119.128, B(从服务器) ip: 192.168.119.130, 网络ping的通。
- A (主服务器)的配置:登录mysql数据库,输入命令
mysql -u root -p
, 然后根据提示输入密码,接着在A上面创建专门用于备份的用户,用来让B登录A来备份数据所用grant replication slave on *.* to 'slave1'@'192.168.119.130' identified by '123456';
, 其中slave1是用户名,192.168.119.130是B(从服务器)的ip地址,密码为123456 - 在主从两台服务器上分别创建名字相同的数据库,并用相同的sql来创建数据库表结构,参考命令
mysql -u root -p newdatabase < /path/to/newdatabase.sql
- 开启A服务器Mysql的binary-log。以root权限编辑文件
/etc/mysql/mysql.conf.d/mysqld.cnf
,在文件中注释掉bind-address
这一行,然后设置server-id = 1
,log_bin = /var/log/mysql/mysql-bin.log
,binlog_format = mixed
,binlog-do-db = 要同步的数据库名称
,auto-increment-increment = 10
,auto-increment-offset = 1
. 设置完保存,退出文本编辑,然后重启mysql服务sudo service mysql restart
- 获取主服务器状态和同步状态。查看A服务器的binary日志位置,
show master status\G
, 记住File和Position,接下来在设置从服务器的时候需要用到。 - B(从服务器)配置。登录B服务器Mysql数据库,以root权限编辑文件
/etc/mysql/mysql.conf.d/mysqld.cnf
, 设置server-id = 2
必须保证每台服务器不一样,binlog_format = mixed
,log_bin = /var/log/mysql/mysql-bin.log
,replicate-do-db = 要同步的数据库名称
,relay-log = mysql-relay-bin
,log-slave-updates = ON
. 保存文件,重启Mysql服务。 - 开始同步。在B(从服务器)中登录mysql,输入
CHANGE MASTER TO MASTER_HOST = '192.168.119.128', MASTER_USER = 'slave1', MASTER_PASSWORD = '123456', MASTER_LOG_FILE = 'mysql-bin.000003', MASTER_LOG_POS = 510
, 其中log文件的文件名和位置为之前记录的。 - 重启mysql,然后执行
show slave status\G
通过查看是否slave_IO_Running 及 slave_SQL_Running 均为 Yes
说明slave线程开启成功 - 之后就可以测试了。
- Laravel中数据库的配置 。在
config/database.php
文件中配置数据库的读写分离,'read' => [ 'host' => [ '192.168.119.128', '192.168.119.130' ], ], 'write' => [ 'host' => [ '192.168.119.128', '192.168.119.130' ], ], 'sticky' => true,
分别把两台数据库的ip地址都填写在读写的host数组中,并配置'sticky' => true
. 建议两个数据库的用户名密码设置成一样的。 - ubuntu 18.04 首次登录mysql未设置root密码或忘记密码解决方法。命令行输入
sudo cat /etc/mysql/debian.cnf
其中有一个用户 debian-sys-maint 密码为password后面的。输入mysql -u debian-sys-maint -p
输入刚查看到的密码。然后修改root的密码use mysql; // 下面这句命令有点长,请注意。 update mysql.user set authentication_string=password('root') where user='root' and Host ='localhost'; update user set plugin="mysql_native_password"; flush privileges; quit;
重启mysql服务后即可以修改后的密码登录root账户 - 解决Host ‘X.X.X.X’ is not allowed to connect to this MySQL server问题的方法。登录mysql,
use mysql;update user set host = '%' where user = 'root'; flush privileges;
再次连接即可解决
Ubuntu 18.04不能像之前的版本那样直接通过编辑rc.local文件来设置开机启动脚本,不过,通过如下的配置,可以让rc.local重新发挥作用。
1. 建立rc-local.service文件
sudo vi /etc/systemd/system/rc-local.service
2. 将下列内容复制并粘贴进rc-local.service文件
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
3. 创建文件 rc.local
sudo vi /etc/rc.local
4. 将下列内容复制并粘贴进rc.local 文件
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
sleep 30
cd /home/vagrant/code/kttCRM/ && /usr/bin/php artisan gateway-worker:server start --daemon
exit 0
在这个文件里,把开机执行的脚本放在exit 0的上面。需要注意,sleep 30表示在执行脚本之前等待30秒钟的时间,以确保PHP启动完毕,否则会出现无法执行命令的情况,可以适当延长等待的时间。
补充:针对docker的环境,在docker-compose exec命令中加入-T选项,开启tty。
cd /home/crm/kttCRM && sudo docker-compose exec -T app /usr/local/bin/php artisan gateway-worker:server start --daemon
5. 给rc.local文件加上可执行权限
sudo chmod +x /etc/rc.local
6. 启动服务
sudo systemctl enable rc-local
7. 启动服务并检查状态
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
可以看到以下的输出说明已成功启动Workerman、GatewayWorker服务进程:
vagrant@homestead:/etc$ sudo systemctl status rc-local.service
● rc-local.service - /etc/rc.local Compatibility
Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/rc-local.service.d
└─debian.conf
Active: active (running) since Mon 2020-04-06 15:03:35 CST; 1h 41min ago
Process: 1351 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
Tasks: 6 (limit: 2317)
CGroup: /system.slice/rc-local.service
├─3018 WorkerMan: master process start_file=/home/vagrant/code/kttCRM/artisan
├─3021 WorkerMan: worker process Gateway websocket://0.0.0.0:23460
├─3037 WorkerMan: worker process BusinessWorker none
├─3038 WorkerMan: worker process BusinessWorker none
├─3039 WorkerMan: worker process BusinessWorker none
└─3040 WorkerMan: worker process Register text://0.0.0.0:12360
Apr 06 15:03:35 homestead rc.local[1351]: --------------------------------------------- WORKERMAN ------Apr 06 15:03:35 homestead rc.local[1351]: Workerman version:3.5.25 PHP version:7.4.0
Apr 06 15:03:35 homestead rc.local[1351]: ---------------------------------------------- WORKERS -------Apr 06 15:03:35 homestead rc.local[1351]: proto user worker listen
Apr 06 15:03:35 homestead systemd[1]: Started /etc/rc.local Compatibility.
Apr 06 15:03:35 homestead rc.local[1351]: tcp root Gateway websocket://0.0.0.0:Apr 06 15:03:35 homestead rc.local[1351]: tcp root BusinessWorker none
Apr 06 15:03:35 homestead rc.local[1351]: tcp root Register text://0.0.0.0:12360Apr 06 15:03:35 homestead rc.local[1351]: --------------------------------------------------------------Apr 06 15:03:35 homestead rc.local[1351]: Input "php gateway-worker:server stop" to stop. Start success.
至此,可以重启服务器,会看到服务已经自动启动了。
3820 ? S 0:00 WorkerMan: worker process Gateway websocket://0.0.0.0:23460
3821 ? S 0:00 WorkerMan: worker process BusinessWorker none
3822 ? S 0:00 WorkerMan: worker process BusinessWorker none
3823 ? S 0:00 WorkerMan: worker process BusinessWorker none
3824 ? S 0:00 WorkerMan: worker process Register text://0.0.0.0:12360
Homestead虚拟机为Laravel框架下的PHP Web app开发提供了一个统一的环境,无论是在Windows,Linux还是MacOS中开发,你都会得到相同的输出结果,完美的解决了“我这里能跑,为什么你那里不行呢”的问题。那么,在生产环境中如何部署Laravel项目,尤其是Web Server如何配置,相信Homestead虚拟机中的Nginx站点配置,会给我们最佳的答案。以下我会分析一个典型的Laravel站点的配置项,以此窥探Nginx作为Web Server的经典用法。
在Linux上如果使用各种包管理器安装的Nginx,那么配置文件会出现在 /etc/nginx下。nginx.conf是全局的配置文件,
user vagrant; #指定nginx的用户,建议为web server创建专门的用户,而不要使用root用户
worker_processes auto; #worker_processes默认情况下为1,一般情况下不用修改,但考虑到实际情况,可以修改这个数值,以提高性能; 设置为auto,让系统自动选择
pid /run/nginx.pid; #指定nginx pid的位置,一般不需要修改
include /etc/nginx/modules-enabled/*.conf; #指定nginx各个模块配置文件存放的位置,*号是文件通配符,代表所有的conf文件
events {
worker_connections 768; #最大连接数,网站用户多的情况下需要调大
# multi_accept on;
}
http 大括号中的就是Web server的一些基本配置了:
sendfile on; # sendfile实际上是 Linux2.0+以后的推出的一个系统调用,web服务器可以通过调整自身的配置来决定是否利用 sendfile这个系统调用,设为on可以提供系统性能。同时要设置tcp_nopush和tcp_nodelay为on
keepalive_timeout 65; # Nginx 使用 keepalive_timeout 来指定 KeepAlive 的超时时间(timeout)。指定每个 TCP 连接最多可以保持多长时间。
types_hash_max_size 2048; # 影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升。一般使用默认的就好
client_max_body_size 1024m; # 这一项就是设置http请求body的最大容量了,修改最大允许上传文件的大小,除了在php.ini配置,千万不要忘了在nginx中同步修改这个参数
include /etc/nginx/mime.types; # 引入mime表,用来识别各种文件类型
default_type application/octet-stream; # 设置默认的文件mime类型
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 这里配置SSL支持的TLS协议版本,需要安装OpenSSL相应版本的支持,目前主流的版本是TLS1.2,比如开发微信小程序后台就需要支持这个版本
ssl_prefer_server_ciphers on; #
access_log /var/log/nginx/access.log; # 指定访问日志文件存储的位置
error_log /var/log/nginx/error.log; # 指定访问错误日志存储的位置
gzip on; # 启动gzip压缩传输的内容
include /etc/nginx/conf.d/*.conf; 和include /etc/nginx/sites-enabled/*; # 指定具体站点配置文件的位置
接下来进入单个Web站点的具体配置文件,一般把配置文件保存在sites-available目录下,然后需要启用的网站创建软连接到sites-enabled目录下。
erver {
listen 80; # 配置http协议监听的端口
listen 443 ssl http2; # 配置https协议监听的端口
server_name .kttcrm.local; # 配置站点的域名,nginx就是通过这一项匹配请求进入的Web应用
root "/home/vagrant/code/kttCRM/public"; # 指定站点的路径
index index.html index.htm index.php; # 指定请求默认的入口文件,按照从左到右的顺序依次匹配
charset utf-8; # 指定Web应用所用的字符集
location / {
try_files $uri $uri/ /index.php?$query_string; # 找指定路径下文件,如果不存在,则转给哪个文件执行
}
location = /favicon.ico { access_log off; log_not_found off; } # favicon.ico 文件是浏览器收藏网址时显示的图标,当客户端使用浏览器问页面时,浏览器会自己主动发起请求获取页面的 favicon.ico 文件,但是当浏览器请求的 favicon.ico 文件不存在时,服务器会记录404日志,而且浏览器也会显示404报错,设置为off则不会显示404错误
location = /robots.txt { access_log off; log_not_found off; } # 同理针对robots.txt文件:搜索引擎通过一种程序robot(又称spider),自动访问互联网上的网页并获取网页信 息。您可以在您的网站中创建一个纯文本文件robots.txt,在这个文件中声明该网站中不想被robot 访问的部分,这样,该网站的部分或全部内容就可以不被搜索引擎收录了,或者指定搜索引擎只收录指定的内容。
access_log off; # 关闭记录访问日志
error_log /var/log/nginx/kttcrm.local-error.log error; # 指定错误日志保存的位置,及记录的错误等级
sendfile off;
# 以下是php进程管理器的配置
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$; # 匹配php文件名解析
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; # 指定php进程管理器的版本,前提是已经安装好指定版本的管理器
fastcgi_index index.php; # php进程管理器入口文件
include fastcgi_params; # 包含的参数
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # PHP脚本文件请求的路径
fastcgi_intercept_errors off; # 指定是否传递4XX和5XX错误信息到客户端
fastcgi_buffer_size 16k; # 配置缓存区大小
fastcgi_buffers 4 16k; # 最多使用4个16K的缓存区
fastcgi_connect_timeout 300; # 连接超时的时间
fastcgi_send_timeout 300; # 请求发送的超时时间
fastcgi_read_timeout 300; # 读取的超时时间
}
location ~ /\.ht {
deny all; # 防止处理所有.ht文件,防止与Apache Server的冲突
}
ssl_certificate /etc/nginx/ssl/kttcrm.local.crt; # 指定ssl证书的位置
ssl_certificate_key /etc/nginx/ssl/kttcrm.local.key; # 指定ssl密钥的位置
}
以上就是针对Homestead虚拟机中Laravel 站点Nginx配置的一些说明,希望对你有一些帮助。