关于lnmp:部署lnmp环境安装typecho博客

装置nginx和PHP环境root@cby:~# apt install nginx php7.4 php7.4-mysql php7.4-fpm批改nginx配置文件root@cby:~# vim /etc/nginx/sites-available/defaultroot@cby:~# cat /etc/nginx/sites-available/defaultserver { listen 80; listen [::]:80; #填写域名或者IP server_name www.oiox.cn; # SSL configuration # #开启ssl证书监听端口 listen 443 ssl; listen [::]:443; #配置证书 ssl_certificate /var/www/ssl/www.oiox.cn_nginx/www.oiox.cn_bundle.pem; ssl_certificate_key /var/www/ssl/www.oiox.cn_nginx/www.oiox.cn.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; root /var/www/html; # 配置默认拜访页面 index index.php index.html index.htm index.nginx-debian.html; #配置拜访门路 location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } # 配置跳转路由 if (-f $request_filename/index.html) { rewrite (.*) $1/index.html break; } if (-f $request_filename/index.php) { rewrite (.*) $1/index.php; } if (!-f $request_filename) { rewrite (.*) /index.php; } #配置PHP拜访路由 location ~ \.php$ { include snippets/fastcgi-php.conf; # With php-fpm (or other unix sockets): fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # With php-cgi (or other tcp sockets): #fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_intercept_errors on; }}# 配置其余的域名拜访server { listen 80; listen [::]:80; server_name aliyun.chenby.cn; root /var/www/cby; index index.html; location / { try_files $uri $uri/ =404; }}root@cby:~#启动服务并设置开机自启root@cby:~# nginx -t root@cby:~# systemctl restart nginx root@cby:~# systemctl enable php7.4-fpmSynchronizing state of php7.4-fpm.service with SysV service script with /lib/systemd/systemd-sysv-install.Executing: /lib/systemd/systemd-sysv-install enable php7.4-fpmroot@cby:~# root@cby:~# root@cby:~# systemctl enable nginxSynchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install.Executing: /lib/systemd/systemd-sysv-install enable nginxroot@cby:~#装置docker,并应用docker启动MySQL服务root@cby:~# curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyunroot@cby:~# mkdir /mysql root@cby:~# cd /mysqlroot@cby:/mysql# docker run -p 3306:3306 --name mymysql --restart=always -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL\_ROOT\_PASSWORD=Cby123.. -d mysql:5.7#登录MySQL数据库执行创立数据库create database typecho;部署typechoroot@cby:~# cd /var/www/html/root@cby:/var/www/html# wget https://typecho.org/downloads/1.1-17.10.30-release.tar.gzroot@cby:/var/www/html# tar xvf 1.1-17.10.30-release.tar.gz root@cby:/var/www/html# mv build/* . ...

January 3, 2022 · 2 min · jiezi

利用vmware搭建php开发环境

由于买不起MAC PRO,所以想研究下在windows下进行php开发的最佳方式。打算探索方式,利用vmware搭建php开发环境;利用docker搭建php开发环境。在网上看到vagrant问题颇多,所以不打算尝试这种方式。本篇文章介绍如何利用Vmware搭建php开发环境。特别推荐宝塔面板,非常强大,可以在面板任意切换php版本,更强大的是还能切换web服务器,你想用apache就用apache,apache用着不爽了,你可以直接在面板卸载apache,安装nginx。第一种,利用vmware的文件夹共享这种方式需要安装VMware Tools,安装方式1:通过虚拟机 > 安装(或升级)VMware Tools这种方式安装,要确保kernel,kernel-devel,kernel-headers版本一样,如果不一样,会出现错误:The path "" is not a valid path to the 3.10.0-229.7.2.e17.x86_64 kernel headers.如果是kernel-devel与kernel,kernel-headers版本不一样,可以先卸载,再安装:yum -y remove kernel-develyum -y install kernel-devel也可以直接到rpmfind这类网站找版本对应的包安装,可以参考本站文章VMmware安装VMware Tools问题解决。安装方式2,安装open-vm-tools这种安装很简单,直接yum install open-vm-tools但是如果你内核版本在4以下,就要以特殊方式启动,否则apache无法访问共享文件夹目录。特殊启动方式:/usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o subtype=vmhgfs-fuse,allow_other具体原因见:https://github.com/vmware/ope…优缺点这种方式虽然很方便地实现了文件共享,但由于是从windows共享到linux,windows的文件系统是ntfs,linux不能很好识别。所以,在共享文件夹无法创建软链接,因此Laravel开发是不适合这种方式。Wordpress以及Thinkphp项目能成功运行。第二种,基于samba文件共享服务待补充本文为作者自己总结的文章,由于作者的水平限制,难免会有错误,欢迎大家指正,感激不尽。

April 4, 2019 · 1 min · jiezi

Centos7下一键安装LNMP环境脚本

#!/bin/bashread -p ‘The installation process takes about 5 to 10 minutes, depending on the performance of your server. To confirm the installation of the lnmp environment, press the Enter key.‘function red(){ echo -e “\t\033[31m$1\033[0m”}function green(){ echo -e “\t\033[32m$1\033[0m”}yum clean all &> /dev/nullyum -y install epel-release &> /dev/nullwhile :do cat /etc/ld.so.conf | grep lib64 &> /dev/null if [ $? -ne 0 ];then echo ‘’’/usr/local/lib/usr/local/lib64/usr/lib/usr/lib64’’’ >> /etc/ld.so.conf ldconfig -v &> /dev/null fi libzip_stat=rpm -qa |grep libzip &amp;&gt; /dev/null &amp;&amp; echo 'yes' || echo 'no' mariadb_stat=rpm -qa |grep mariadb &amp;&gt; /dev/null &amp;&amp; echo 'yes' || echo 'no' yum_stat=yum repolist |tail -1 |awk '{print $2}' if [ $libzip_stat = yes ];then rpm -e –nodeps rpm -qa | grep libzip continue elif [ $mariadb_stat = yes ];then rpm -e –nodeps rpm -qa | grep mariadb continue elif [ $yum_stat = 0 ];then red ‘Yum error,Check your yum source!!!(maybe network,yum configure…)’ exit else echo -e “\033[05m\033[35mStart testing the environment…\033[0m” echo -e “\t\033[32mStart testing the environment… [ OK ]\033[0m” break fi donefunction need_rpm(){ yum -y install make yum -y install gmake yum -y install gcc yum -y install gcc-c++ yum -y install wget yum -y install openssl yum -y install openssl-devel yum -y install curl yum -y install curl-devel yum -y install libjpeg yum -y install libjpeg-devel yum -y install libpng yum -y install libpng-devel yum -y install freetype yum -y install freetype-devel yum -y install pcre yum -y install pcre-devel yum -y install libxslt yum -y install libxslt-devel yum -y install bzip2 yum -y install bzip2-devel yum -y install libxml2 yum -y install libxml2-devel}function down_app(){ wget -P /lnmp/ https://nginx.org/download/nginx-1.14.2.tar.gz &> /dev/null && echo -e “\t\033[32mNginx Download completed!\033[0m” || echo -e “\t\033[31mNginx Download Faild!\033[0m” wget -P /lnmp/ http://cn2.php.net/get/php-7.3.0.tar.gz/from/this/mirror &> /dev/null && echo -e “\t\033[32mPHP Download completed!\033[0m” || echo -e “\t\033[31mPHP Download Faild!\033[0m” wget -P /lnmp/ https://nih.at/libzip/libzip-1.2.0.tar.gz &> /dev/null && echo -e “\t\033[32mLibzip Download completed!\033[0m” || echo -e “\t\033[31mLibzip Download Faild!\033[0m” wget -P /lnmp/ https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz &> /dev/null && green ‘Mysql Download completed!’ || red ‘Mysql Download Faild!’}function nginx_install_configure(){ id nginx &> /dev/null && userdel nginx useradd -M -s /sbin/nologin nginx &>/dev/null cd /lnmp / && tar -xf nginx-1.14.2.tar.gz && cd nginx-1.14.2/ ./configure –user=nginx –group=nginx –prefix=/usr/local/nginx –with-http_ssl_module –with-stream &>> /tmp/.nginx.configure.log if [ $? -ne 0 ];then red ‘Nginx configure error!!! See /tmp/.nginx.configure.log’ exit else echo ’’’ Configuration summary: nginx path prefix: “/usr/local/nginx” nginx binary file: “/usr/local/nginx/sbin/nginx” nginx modules path: “/usr/local/nginx/modules” nginx configuration prefix: “/usr/local/nginx/conf” nginx configuration file: “/usr/local/nginx/conf/nginx.conf” nginx pid file: “/usr/local/nginx/logs/nginx.pid” nginx error log file: “/usr/local/nginx/logs/error.log” nginx http access log file: “/usr/local/nginx/logs/access.log” nginx http client request body temporary files: “client_body_temp” nginx http proxy temporary files: “proxy_temp” nginx http fastcgi temporary files: “fastcgi_temp” nginx http uwsgi temporary files: “uwsgi_temp” nginx http scgi temporary files: “scgi_temp” ’’’ fi make &>> /tmp/.nginx.make.log if [ $? -ne 0 ];then red ‘Nginx make error!!! See /tmp/.nginx.make.log’ fi make install &>> /tmp/.nginx.makeinstall.log if [ $? -ne 0 ];then red ‘Nginx make install error!!! See /tmp/.nginx.makeinstall.log’ fi cd /usr/local/nginx/ cp -p conf/nginx.conf conf/nginx.conf.bak sed -i ‘65,68s/#//g’ conf/nginx.conf sed -i ‘70,71s/#//g’ conf/nginx.conf sed -i ’s/fastcgi_params/fastcgi.conf/g’ conf/nginx.conf green ‘Nginx installed and configure successful.’ /usr/local/nginx/sbin/nginx -t &> /dev/null && /usr/local/nginx/sbin/nginx netstat -nutlp |grep 80 &> /dev/null if [ $? -ne 0 ];then red ‘Nginx start error!!!’ else green ‘Nginx started.’ fi}function mysql_install_configure(){ id mysql &> /dev/null && userdel mysql useradd -M -s /sbin/nologin mysql &> /dev/null cd /lnmp/ tar -xf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/mysql cd /usr/local/mysql/ mkdir data && chown -R mysql:mysql /usr/local/mysql/ ./bin/mysqld –user=mysql –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data –initialize &>> /tmp/.mysql.initialize.log if [ $? -ne 0 ];then red ‘Mysql initialize error!!! See /tmp/.mysql.initialize.log’ else pass=tail -1 /tmp/.mysql.initialize.log | awk '{print $NF}' green ‘Mysql initialize successful.)’ green “Initial password: $pass” echo ’’’ Configuration summary: Mysql path prefix: “/usr/local/mysql” Mysql data path: “/usr/local/mysql/data” ’’’ fi ./support-files/mysql.server start &>> /tmp/.mysql.start.log netstat -nutlp | grep mysql &> /dev/null if [ $? -ne 0 ];then red ‘Mysql start error!!! See /tmp/.mysql.start.log’ else green ‘Mysql started.’ fi}function libzip_install_configure(){ cd /lnmp/ tar -xf libzip-1.2.0.tar.gz cd libzip-1.2.0 ./configure &> /dev/null make &> /dev/null make install &> /dev/null cp /usr/local/lib/libzip/include/zipconf.h /usr/local/include/zipconf.h green ‘Libzip installed.’}function php_install_configure(){ cd /lnmp/ tar -xf mirror cd php-7.3.0/ while : do ./configure –prefix=/usr/local/php –with-curl –with-freetype-dir –with-gd –with-gettext –with-iconv-dir –with-kerberos –with-libdir=lib64 –with-libxml-dir –with-mysqli –with-openssl –with-pcre-regex –with-pdo-mysql –with-pdo-sqlite –with-pear –with-png-dir –with-jpeg-dir –with-xmlrpc –with-xsl –with-zlib –with-bz2 –with-mhash –enable-fpm –enable-bcmath –enable-libxml –enable-inline-optimization –enable-gd-native-ttf –enable-mbregex –enable-mbstring –enable-opcache –enable-pcntl –enable-shmop –enable-soap –enable-sockets –enable-sysvsem –enable-sysvshm –enable-xml –enable-zip &>> /tmp/.php.configure.log if [ $? -ne 0 ];then red ‘PHP configure error!!! See /tmp/.php.configure.log’ exit else green ‘PHP configure is ok’ while : do make &>> /tmp/.php.make.log if [ $? -ne 0 ];then red ‘PHP make error!!! See /tmp/.php.make.log’ exit else green ‘PHP make is ok’ while : do cp /usr/local/lib/libzip/include/zipconf.h /usr/local/include/zipconf.h make install &>> /tmp/.php.makeinstall.log if [ $? -ne 0 ];then red ‘PHP makeinstall error!!! See /tmp/.php.makeinstall.log’ exit else green ‘PHP Installed.’ break fi done break fi done break fi done cp php.ini-development /usr/local/php/lib/php.ini cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf cp sapi/fpm/php-fpm /usr/local/bin sed -i ’s/; cgi.fix_pathinfo=1/ cgi.fix_pathinfo=0/g’ /usr/local/php/lib/php.ini groupadd www-data &> /dev/null useradd -g www-data www-data &> /dev/null cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf sed -i ’s/user = nobody/user = www-data/g’ /usr/local/php/etc/php-fpm.d/www.conf sed -i ’s/group = nobody/group = www-data/g’ /usr/local/php/etc/php-fpm.d/www.conf /usr/local/bin/php-fpm netstat -nutlp |grep 9000 if [ $? -ne 0 ];then red ‘PHP-FPM start error!!!’ else green ‘PHP-FPM started’ fi}#start executeecho -e “\033[05m\033[35mInstall dependent software…\033[0m"need_rpm &> /dev/nullgreen “Install dependent software…\t\t[ OK ]” echo -e “\033[05m\033[35mStart download apps…\033[0m"down_appecho -e “\033[05m\033[35mStart install nginx and configure it…\033[0m"nginx_install_configureecho -e “\033[05m\033[35mStart install mysql and configure it…\033[0m"mysql_install_configureecho -e “\033[05m\033[35mStart install Libzip and configure it…\033[0m"libzip_install_configureecho -e “\033[05m\033[35mStart install php and configure it…\033[0m"php_install_configure/usr/local/nginx/sbin/nignx -s stop &> /dev/null && /usr/local/nginx/sbin/nginx echo ‘’’<?php phpinfo();?>’’’ >> /usr/local/nginx/html/test.phpcurl http://127.0.0.1/test.phpif [ $? -eq ‘0’];then green ‘LNMP is ok !!!’else red ‘Access PHP Faild!!!‘fi ...

February 13, 2019 · 5 min · jiezi

docker搭建lnmp环境

<!– TOC –>docker搭建lnmp环境一、Dockerfile定制镜像二、docker-compose三、docker-compose编排lnmp环境1、mysql2、redis3、mongo4、nginx5、php6、完整版四、参考<!– /TOC –>有收获的话请加颗小星星,没有收获的话可以 反对 没有帮助 举报三连代码仓库docker搭建lnmp环境一、Dockerfile定制镜像# FROM 指定基础镜像FROM 镜像FROM php:7.2-fpm# RUN 执行RUN <命令>orRUN [“可执行文件”, “参数1”, “参数2”]RUN echo ‘<h1>Hello, Docker!</h1>’ > /usr/share/nginx/html/index.htmlRUN [“php”, “-S”, “0.0.0.0:8080”]# COPY 复制文件COPY <源路径>… <目标路径>COPY swoole-4.2.10.tgz /homeCOPY nginx.conf /etc/nginx/nginx.conf# ADD 复制文件或目录,如果是.tgz,会被解压缩ADD <源路径>… <目标路径>ADD nginx.conf /etc/nginx/nginx.conf# CMD 容器启动CMD echo $HOME => CMD [ “/bin/sh”, “-c”, “echo $HOME” ]CMD [ “redis-server”, “/usr/local/etc/redis/redis.conf” ]# ENTRYPOINT 入口点ENTRYPOINT [“docker-entrypoint.sh”]存在 ENTRYPOINT 后,CMD 的内容将会作为参数传给 ENTRYPOINT# ENV 环境变量ENV <key> <value>ENV MYSQL_ROOT_PASSWORD root# ARG与ENV差不多ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的ENV MYSQL_ROOT_PASSWORD root# VOLUME 匿名卷VOLUME ["<路径1>", “<路径2>”…]VOLUME ["/data"]# EXPOSE 暴露端口EXPOSE <端口1> [<端口2>…]EXPOSE 80 443# WOEKDIR 指定工作目录,进入容器后的落地目录WORKDIR <工作目录路径>WORKDIR /var/www# USER 指定当前用户USER <用户名>USER root二、docker-compose详细请查看 https://docker_practice.gitee…服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。三、docker-compose编排lnmp环境1、mysql这里我们使用了mysql5.5版本,没其它用意,相比5.7以上版本,占内存和硬盘最小的一个版本我们准备了一个my.cnf作为额外配置,这里我修改了数据库的时区[mysqld]default-time-zone = ‘+8:00’FROM mysql:5.5COPY my.cnf /etc/mysql/conf.dEXPOSE 33062、redis我们使用准备的配置文件redis.conf覆盖容器默认启动的配置文件,修改了ip绑定和密码bind 0.0.0.0requirepass rootFROM redis:latestCOPY redis.conf /usr/local/etc/redis/redis.confCMD [ “redis-server”, “/usr/local/etc/redis/redis.conf” ]EXPOSE 63793、mongomongodb我们没有特殊处理FROM mongo:latestEXPOSE 270174、nginx我们准备了一份nginx.conf和虚拟目录conf.d,为了以后可以动态的配置网站的代理和负载均衡还有一个日志目录,放在外层logs目录里面,记录nginx的访问日志特别注意的是fastcgi_pass php:9000;而不是fastcgi_pass 127.0.0.1:9000;,目前自己也没明白FROM nginx:alpineCOPY nginx.conf /etc/nginx/nginx.confEXPOSE 805、phpphp算是这里面最难搞定的,因为我们需要额外的添加php扩展,虽然php的docker官方提供了docker-php-ext-configure, docker-php-ext-install, docker-php-ext-enable,还是有些扩展需要通过手动编译或者pecl安装由于pecl官网下载慢,我们事先下载好了几个需要的扩展php-fpm用的是debian的linux系统,下载也很慢,我们备用了阿里云的镜像sources.list我们还准备了php的默认配置php.ini和opcache.ini比如swoole扩展安装,记得安装包用完后清理,还有得用COPY命令,ADD会解压缩# swooleCOPY swoole-4.2.10.tgz /homeRUN pecl install /home/swoole-4.2.10.tgz && \ docker-php-ext-enable swoole && \ rm /home/swoole-4.2.10.tgz6、完整版version: ‘3’networks: frontend: driver: bridge backend: driver: bridgevolumes: mysql: driver: local mongo: driver: local redis: driver: localservices: php: build: ./php volumes: - ${WORKER_DIR}:/var/www ports: - 9100:9000 depends_on: - mysql - redis - mongo networks: - backend nginx: build: ./nginx volumes: - ${WORKER_DIR}:/var/www - ./logs/nginx:/var/log/nginx - ./nginx/conf.d:/etc/nginx/conf.d ports: - 8000:80 depends_on: - php networks: - frontend - backend mysql: build: ./mysql environment: - MYSQL_ROOT_PASSWORD=root volumes: - ${DATA_PATH}/mysql:/var/lib/mysql ports: - 3310:3306 networks: - backend mongo: build: ./mongo environment: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=root ports: - 27010:27017 volumes: - ${DATA_PATH}/mongo:/data/db networks: - backend redis: build: ./redis volumes: - ${DATA_PATH}/redis:/data ports: - 6310:6379 networks: - backend四、参考Docker — 从入门到实践laradockDocker在PHP项目开发环境中的应用 ...

January 20, 2019 · 2 min · jiezi

简明docker教程

<!– TOC –>简明docker教程一、什么是docker二、docker与虚拟机比较三、安装docker四、基本概念1、镜像2、容器3、数据卷4、挂载五、参考资料<!– /TOC –>有收获的话请加颗小星星,没有收获的话可以 反对 没有帮助 举报三连代码仓库简明docker教程一、什么是dockerDocker是一个开放源代码软件项目,让应用程序布署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施,上面都是废话,简言之Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。二、docker与虚拟机比较特性容器虚拟机启动秒级分钟级硬盘使用一般为 MB一般为 GB性能接近原生弱于系统支持量单机支持上千个容器一般几十个三、安装docker我自己用的是Docker for Mac其它系统可以参考 http://docker_practice.gitee….四、基本概念镜像(Image)Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。容器(Container)镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。仓库(Repository)镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。1、镜像# 获取镜像docker pull ubuntu:14.04# 以ubuntu:14.04镜像为基础启动并运行一个容器docker run -it –rm \ ubuntu:14.04 \ bash-it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。–rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 –rm 可以避免浪费空间。ubuntu:14.04:这是指用 ubuntu:14.04 镜像为基础来启动容器。bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。# 列出镜像docker image lsdocker images# 镜像占用docker system df# 清楚悬挂镜像docker image prune# 删除镜像docker image rmdocker rmi2、容器# 启动以守护模式创建的名字为demo-u的容器,并以交互模式进入容器docker run –name demo-u -t -i -d ubuntu:14.04 bash# 运行后就可以通过ID或名字进入容器,并输出hello worlddocker exec -it demo-u /bin/sh -c “echo hello world”# 查看运行中的容器docker container lsdocker ps# 所有容器docker container ls -adocker ps -a# 查看容器日志docker container logs demo-udocker logs demo-u# 终止容器docker container stop demo-udocker stop demo-u# 启动容器docker container start demo-udocker start demo-u# 重启容器docker container restart demo-udocker restart demo-u# 进入容器,退出后容器也停止docker attach demo-u# 导出容器docker export# 导入容器docker import# 删除容器docker container rmdocker rm# 清除所有容器docker container prune3、数据卷# 创建数据卷docker volume create# 列出数据卷docker volume ls# 删除数据卷docker volume rm# 清除没用的数据卷docker volume prune4、挂载也就是目录共享,两种方式:-v–mount 推荐# 使用php本地服务器查看php环境,加载主机的 ~/web 目录到容器的 /var/www/web目录mkdir -p ~/web && cd ~/web && echo “<?php phpinfo();” > index.phpdocker run -d \ –name web \ -p 8080:8080 \ –mount type=bind,source=pwd,target=/var/www/web \ php:7.2-fpm \ /bin/sh -c “cd /var/www/web && php -S 0.0.0.0:8080"或者docker run -d \ –name web \ -p 8080:8080 \ -v pwd:/var/www/web \ php:7.2-fpm \ /bin/sh -c “cd /var/www/web && php -S 0.0.0.0:8080"打开浏览器 0.0.0.0:8080# 查看数据卷docker volume inspect web五、参考资料Docker — 从入门到实践 ...

January 20, 2019 · 2 min · jiezi

LNMP+HAProxy+Keepalived负载均衡(四)- MySQL双机互备及自动备份

前三篇已实现了最基本的负载均衡,但是还存在问题,如两个数据库不同步,上传的附件不同步,数据库没有制定备份计划,负载均衡参数还有待优化等问题。这里先把双机互备和自动备份的内容补齐。配置MySQL数据库的账户密码(以下命令仅用参考,这里的目的是要有一个可供内网其他服务器访问本机数据库的账户);# 停止数据库服务service mysql stop# 免验证启动数据库服务mysqld –user=mysql –skip-grant-tables –skip-networking# 登录mysqlmysql -u root mysql# 修改用户密码的几种方式mysql> UPDATE user SET authentication_string=PASSWORD(‘dbpwd’) where USER=‘dbadmin’;mysql> UPDATE user SET authentication_string=PASSWORD(‘dbpwd’) where USER=‘dbbaker’;mysql> UPDATE user SET Password=PASSWORD(‘dbpwd’) where USER=‘dbadmin’;mysql> alter user user() identified by “dbpwd”;# 使配置生效mysql> FLUSH PRIVILEGES;mysql> quit;# 重启mysql服务,注意,这里的mysql如果找不到服务,可以尝试mysqld,再不行就通过ps -ef | grep mysql找到进程ID(pid),然后通过kill -9 pid停止服务;service mysql restartmysql -udbadmin -p# Enter password: <输入新密码newpassword># 创建用户并配置权限:mysql> GRANT ALL ON . TO ‘dbadmin’@’%’ IDENTIFIED BY ‘dbpwd’ WITH GRANT OPTION;# 移除权限# REVOKE ALL ON . TO ‘dbadmin’@’%’;FLUSH PRIVILEGES;# 全局层级:.# 数据库层级:db_name.# 表层级:db_name.tbl_name# ALL是指分配所有权限,具体权限可以通过下面的查询语句查看# 查询用户权限select * from mysql.user \G;# 删除用户# delete from mysql.user where Host <> ‘%’;# 至此,数据库可以通过以上账户进行远程连接了。配置MySQL的双机互备 - 主数据库服务器(192.168.6.200 /etc/my.cnf的配置请参考LNMP+HAProxy+Keepalived负载均衡(三)- 配置文件汇总);# 在主数据库服务器上执行配置:vim /etc/my.cnf# 修改配置内容:server-id=6 # 数据库集群中唯一lower_case_table_names=1 # 新增行,数据表不区分大小写replicate_wild_do_table=sync_db_name.% # 只同步“sync_db_name”库下的表log-slave-updates=YES # 从服务器同步后记录日志# 保存配置后重启MySQL服务:service mysql restart# 进入MySQL命令行,查看主数据库状态信息,其中的“File”和“Position”值后面会用到:mysql> use sync_db_name;mysql> show master status;配置MySQL的双机互备 - 备数据库服务器(192.168.6.210);# 停止slave:mysql> stop slave;# 进入MySQL命令行,配置要同步的主库来源:mysql> CHANGE MASTER TO MASTER_HOST=‘192.168.6.200’,MASTER_PORT=10002,MASTER_USER=‘dbadmin’,MASTER_PASSWORD=‘dbpwd’,MASTER_LOG_FILE=‘mysql-bin.000016’,MASTER_LOG_POS=1285;# MASTER_HOST:主数据库的IP;# MASTER_PORT:主数据库的端口(int),默认3306;# MASTER_USER,MASTER_PASSWORD:主数据库账户、密码;# MASTER_LOG_FILE:主数据库中查询到的“File”值;# MASTER_LOG_POS:主数据库中查询到的“Position”值;# 启动slave:mysql> start slave;# 检查slave:mysql> show slave status \G;# 命令行汇总:show master status;stop slave;Slave_IO_Running、Slave_SQL_Running 均显示为 Yes 说明主备同步服务正常运行,如下图:同步数据库的初始状态; 在启动同步服务前,还需要手动同步下数据库的初始状态,之后可以通过修改其中主数据库中的表来查看从数据库是否同步变更;# 锁定要同步的数据库(192.168.6.200):msyql> use sync_db_name;msyql> flush tables with read lock;# 将要同步的数据库导出脚本:mysqldump -udbadmin -pdbpwd sync_db_name >/home/backup/sync_db_name.sql# 解锁前面锁定的数据库:msyql> unlock tables;# 将上方备份的sql拷贝到从数据库服务器(192.168.6.210),然后创建同名数据库,恢复数据:msyql> create database sync_db_name;msyql> use sync_db_name;msyql> source /home/backup/sync_db_name.sql;做双机互备或多机循环互备; 然后将主从数据库服务器反转(即将192.168.6.200和192.168.6.210的主备身份调换),然后再配置一次同步即可。即192.168.6.200变更会同步到192.168.6.210,反之亦然。简单讲就是: 双机互备:A主B从 + A从B主; 多机循环互备:A主B从 + B主C从 + C主N从 + N主A从(建议不要过多,尤其是数据库数据量大,且变更频繁的情况下,同步毕竟也是有延迟的);数据库的自动备份(前三步前面的文章都有提到);安装计划工具;yum -y install crontabs编辑MySQL的配置文件;vim /etc/my.cnf# 添加配置文件内容:[mysqldump]# 用于备份数据库user=dbbakerpassword=dbpwd重启数据库服务;service mysql restart & service mysql status准备备份脚本;mkdir -p /home/bakup/lgd_system# 编辑bakdb.sh的内容:echo ‘mysqldump sync_db_name | gzip > /home/backup/lgd_system/sync_db_name_$(date +%Y%m%d_%H%M%S).sql.gz’ > /home/bakup/bakdb.shchmod +x /home/bakcup/bakdb.sh# 解压缩指定的备份文件:gunzip sync_db_name_.gz添加备份计划;# 方式一:crontab -e# 方式二:vim /etc/crontab # 编辑计划:# Example of job definition:# .—————- minute (0 - 59) *表示每分钟# | .————- hour (0 - 23) *表示每小时# | | .———- day of month (1 - 31) *表示每天# | | | .——- month (1 - 12) OR jan,feb,mar,apr … *表示每月# | | | | .—- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat *表示每天# | | | | |# * * * * * user-name(用户名) command to be executed(脚本路径)# 30 10 * * * /home/backup/bakdb.sh # 表示每天10:30执行一次备份脚本(前方的注释去掉即可)计划任务常用操作命令;service crond start # 启动服务service crond stop # 关闭服务service crond restart # 重启服务service crond reload # 重新载入配置service crond status # 查看服务状态tail -f /var/log/cron # 查看执行日志备份文件解压缩gzip命令:选项参数:-c:将压缩后的数据显示到屏幕上,可以用于重定向;-d:解压缩的参数;-t:检验压缩的一致性,看是否有错误;-v:显示 源文件大小/压缩文件大小 的压缩比;-#:# 为数字的意思,代表压缩等級,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6gzip -v => 压缩文件,-v查看压缩比gzip -d gunzip file.gz ...

January 14, 2019 · 2 min · jiezi

LNMP+HAProxy+Keepalived负载均衡(三)- 配置文件汇总

Nginx的操作命令vim /usr/local/nginx/conf/nginx.conf# 将端口由80修改为10001,修改内容如下:listen 10001 default_server;# 具体配置可参考下面的nginx配置文件# 重启Nginx,并查看其状态;service nginx restart & service nginx statusNginx的配置文件(Web服务器需要修改的配置,仅用参考)user www www;worker_processes auto;error_log /home/wwwlogs/nginx_error.log crit;pid /usr/local/nginx/logs/nginx.pid;#Specifies the value for maximum file descriptors that can be opened by this process.worker_rlimit_nofile 51200;events{ use epoll; worker_connections 51200; multi_accept on;}http{ include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable “MSIE [1-6].”; #limit_conn_zone $binary_remote_addr zone=perip:10m; ##If enable limit_conn_zone,add “limit_conn perip 10;” to server section. server_tokens off; access_log off; server { # 端口根据自己的情况修改 listen 10001 default_server; server_name _; index index.html index.htm index.php default.html default.htm default.php; # 站点根目录 root /home/wwwroot/publishPath; include rewrite/laravel.conf; #error_page 404 /404.html; # Deny access to PHP files in specific directory #location ~ /(wp-content|uploads|wp-includes|images)/..php$ { deny all; } include enable-php.conf; location ~ ..(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ ..(js|css)?$ { expires 12h; } location ~ /.well-known { allow all; } location ~ /. { deny all; } access_log off; } # 可以加载自己的配置文件,这里我把配置文件中的内容直接替换了原本的server节点配置; # include vhost/.conf;}MySQL的操作命令vim /etc/my.cnfservice mysql restart & service mysql statuslnmp restartMySQL的配置文件(DB服务器需要修改的配置,仅用参考)[client]port = 10002socket = /tmp/mysql.sock[mysqld]port = 10002socket = /tmp/mysql.sock# 数据库文件存放位置datadir = /home/lnmp/mysql/dataskip-external-lockingkey_buffer_size = 128Mmax_allowed_packet = 1Mtable_open_cache = 512sort_buffer_size = 2Mnet_buffer_length = 8Kread_buffer_size = 2Mread_rnd_buffer_size = 512Kmyisam_sort_buffer_size = 32Mthread_cache_size = 64query_cache_size = 64Mtmp_table_size = 64Mperformance_schema_max_table_instances = 4000explicit_defaults_for_timestamp = true#skip-networkingmax_connections = 500max_connect_errors = 100open_files_limit = 65535log-bin=mysql-binbinlog_format=mixedserver-id = 51lower_case_table_names = 1expire_logs_days = 10replicate_wild_do_table=lgd_system.%# relay_log=mysqld-relay-binlog-slave-updates=YESdefault_storage_engine = InnoDBinnodb_file_per_table = 1innodb_data_home_dir = /home/lnmp/mysql/datainnodb_data_file_path = ibdata1:10M:autoextendinnodb_log_group_home_dir = /home/lnmp/mysql/datainnodb_buffer_pool_size = 512Minnodb_log_file_size = 128Minnodb_log_buffer_size = 8Minnodb_flush_log_at_trx_commit = 1innodb_lock_wait_timeout = 50[mysqldump]# 数据库备份账户,自行创建并分配相应的权限user=bakuserpassword=ZXdfty^&quickmax_allowed_packet = 16M[mysql]no-auto-rehash[myisamchk]key_buffer_size = 128Msort_buffer_size = 2Mread_buffer = 2Mwrite_buffer = 2M[mysqlhotcopy]interactive-timeoutHAProxy的操作命令# 负载状态监测:# Web服务器HAProxy - http://192.168.6.111:8080/web# DB服务器HAProxy - http://192.168.6.211:8080/db# 如果需要通过外网访问,需要把8080端口映射到外网端口即可。# 常用命令:vim /etc/haproxy/haproxy.cfgservice haproxy restart & service haproxy statusHAProxy的配置文件(Web服务器)#———————————————————————# Global settings#———————————————————————global # 全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local0日志设备,记录日志等级为info的日志 log 127.0.0.1 local3 # 软件工作目录 chroot /var/lib/haproxy # haproxy的pid存放路径,启动进程的用户必须有权限访问此文件 pidfile /usr/local/haproxy/haproxy.pid # 最大连接数,默认4000 maxconn 30000 # 所属用户 user haproxy # 所属组 group haproxy # 以守护进程方式运行haproxy daemon # turn on stats unix socket # stats socket /var/lib/haproxy/stats # socket路径#———————————————————————# common defaults that all the ’listen’ and ‘backend’ sections will# use if not designated in their block#———————————————————————defaults mode http # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK log global # 采用全局定义的日志 option httplog # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志 option dontlognull # 不记录健康检查的日志信息 option http-server-close # 每次请求完毕后主动关闭http通道 # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip option forwardfor except 127.0.0.0/8 option redispatch # serverId对应的服务器挂掉后,强制定向到其他健康的服务器 retries 3 # 3次连接失败就认为服务不可用,也可以通过后面设置 timeout http-request 10s # http请求超时时间 timeout queue 1m # 一个请求在队列里的超时时间 timeout connect 10s # 连接超时 timeout client 1m # 客户端连接超时 timeout server 1m # 服务器连接超时 timeout http-keep-alive 10s # 设置http-keep-alive的超时时间 timeout check 10s # 检测超时 maxconn 3000 # 最大连接数#———————————————————————# main frontend which proxys to the backends#———————————————————————# 前端配置frontend main *:80 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend servers#———————————————————————# static backend for serving up images, stylesheets and such#———————————————————————# 后台静态文件服务配置backend static balance roundrobin server static1 192.168.6.100:10001 check inter 2000 fall 3 weight 50 server static2 192.168.6.110:10001 check inter 2000 fall 3 weight 50#———————————————————————# round robin balancing between the various backends#———————————————————————# 后台服务配置backend servers balance roundrobin # 添加cookie配置,将某客户端引导到之前为其服务过的后端服务器上,即和后端某服务器保持联系,防止登录验证失效 cookie app_cook insert nocache server app1 192.168.6.100:10001 check inter 2000 fall 3 weight 50 cookie server1 server app2 192.168.6.110:10001 check inter 2000 fall 3 weight 50 cookie server2# HAProxy状态监控服务配置listen stats # 绑定端口 bind *:8080 mode http # stats enable # 访问地址:192.168.6.100:8080/web 和 192.168.6.110:8080/web stats uri /web stats realm Global\ statistics # 管理员账户 stats auth hapadmin:1qazse$#2HAProxy的配置文件(DB服务器)#———————————————————————# Global settings#———————————————————————global pidfile /var/run/haproxy.pid maxconn 30000 user haproxy group haproxy daemon nbproc 1#———————————————————————# common defaults that all the ’listen’ and ‘backend’ sections will# use if not designated in their block#———————————————————————defaults mode tcp option redispatch retries 3 timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout check 10s maxconn 4096 option abortonclosefrontend main bind :3306 default_backend serversbackend servers server mysql1 192.168.6.200:10002 check inter 3000 fall 3 weight 50 server mysql2 192.168.6.210:10002 check inter 3000 fall 3 weight 50# 监控访问地址:192.168.6.210:8080/db 和 192.168.6.200:8080/dblisten stats mode http bind 0.0.0.0:8080 stats enable stats uri /db stats realm Global\ statistics stats auth dbadmin:1qazse$#2Keeplived的操作命令# 查看已安装的Keepalived的版本:keepalived -v# 查看配置:cat /etc/keepalived/keepalived.conf# 编辑配置文件:vim /etc/keepalived/keepalived.conf# 测试高可用的远程访问:mysql -h 远程数据库ip地址 -P 端口 -u 用户名 -pmysql -h 192.168.6.200 -P 3306 -u dbuser -p# 开通服务器间的 vrrp 协议通信,用于Keepalived通信:firewall-cmd –direct –permanent –add-rule ipv4 filter INPUT 0 –in-interface 网卡名称 –destination 224.0.0.18 –protocol vrrp -j ACCEPT;firewall-cmd –reload;# 服务器的网卡名称请根据自己的情况修改,# INPUT代表接收224.0.0.18的报文。# 在VIP服务器上测试VIP漂移:ip addr | grep 网卡名称# 停止VIP所在服务器的keepalived服务,并查看VIP是否移除,并查看备用服务器是否获取到VIP:service keepalived stop && service keepalived statusip addr | grep 网卡名称# 在之前停止keepalived服务的服务器上开启keepalived服务,查看VIP是否已取回:service keepalived start && service keepalived statusip addr | grep 网卡名称Keeplived的配置(Web服务器)Web主服务器的配置:# Master的配置内容:! Configuration File for keepalivedglobal_defs { notification_email { example@domain.com # 收邮件人,可以定义多个 } notification_email_from HaproxyMaster@web.haproxy # 发件人,可伪装 smtp_server 127.0.0.1 # 发送邮件的服务器地址 smtp_connect_timeout 30 # 连接超时时间 no_email_faults router_id WebMaster vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}vrrp_script chk_haproxy { # HAProxy服务监测脚本 script ‘/etc/keepalived/check_haproxy.sh’ interval 2 weight 2}vrrp_instance VI_1 { # 每一个vrrp_instance就是定义一个虚拟路由器 state MASTER # 由初始状态状态转换为master状态 interface 网卡名称 # 网卡名称,如eth0,根据自己的情况修改 virtual_router_id 100 # 虚拟路由的id号,一般不能大于255的 priority 100 # 优先级,数字越大,优先级越高,主比次大 advert_int 1 # 初始化通告 authentication { # 认证机制 auth_type PASS auth_pass 666 # 密码,自行更改,主备一致即可 } track_script { chk_haproxy } virtual_ipaddress { # Web服务的虚拟ip地址:vip,前面提到的备用的虚拟IP。 #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL> #192.168.200.18/24 dev eth2 label eth2:1 192.168.6.111 } notify_master ‘/etc/keepalived/clean_arp.sh 192.168.6.111’}Web备服务器的配置:# Backup的配置内容:! Configuration File for keepalivedglobal_defs { notification_email { example@domain.com # 收邮件人,可以定义多个 } notification_email_from HaproxyBackup@web.haproxy # 发件人,可伪装 smtp_server 127.0.0.1 # 发送邮件的服务器地址 smtp_connect_timeout 30 # 连接超时时间 no_email_faults router_id WebBackup vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}vrrp_script chk_haproxy { # HAProxy服务监测脚本 script ‘/etc/keepalived/check_haproxy.sh’ interval 2 weight 2}vrrp_instance VI_1 { # 每一个vrrp_instance就是定义一个虚拟路由器 state BACKUP # 由初始状态状态转换为backup状态 interface 网卡名称 # 网卡名称,如eth0,根据自己的情况修改 virtual_router_id 100 # 虚拟路由的id号,一般不能大于255的 priority 90 # 优先级,数字越大,优先级越高,主比次大 advert_int 1 # 初始化通告 authentication { # 认证机制 auth_type PASS auth_pass 666 # 密码,自行更改,主备一致即可 } track_script { chk_haproxy } virtual_ipaddress { # Web服务的虚拟ip地址:vip,前面提到的备用的虚拟IP。 #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL> #192.168.200.18/24 dev eth2 label eth2:1 192.168.6.111 } notify_master ‘/etc/keepalived/clean_arp.sh 192.168.6.111’}Keeplived的配置(DB服务器)DB主服务器的配置:# Master的配置内容:! Configuration File for keepalivedglobal_defs { notification_email { example@domain.com # 收邮件人,可以定义多个 } notification_email_from HaproxyMaster@db.haproxy # 发件人,可伪装 smtp_server 127.0.0.1 # 发送邮件的服务器地址 smtp_connect_timeout 30 # 连接超时时间 no_email_faults router_id DBMaster vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}vrrp_script chk_haproxy { # HAProxy服务监测脚本 script ‘/etc/keepalived/check_haproxy.sh’ interval 2 weight 2}vrrp_instance VI_1 { # 每一个vrrp_instance就是定义一个虚拟路由器 state MASTER # 由初始状态状态转换为master状态 interface 网卡名称 # 网卡名称,如eth0,根据自己的情况修改 virtual_router_id 99 # 虚拟路由的id号,一般不能大于255的 priority 100 # 优先级,数字越大,优先级越高,主比次大 advert_int 1 # 初始化通告 authentication { # 认证机制 auth_type PASS auth_pass 666 # 密码,自行更改,主备一致即可 } track_script { chk_haproxy } virtual_ipaddress { # DB服务的虚拟ip地址:vip,前面提到的备用的虚拟IP。 #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL> #192.168.200.18/24 dev eth2 label eth2:1 192.168.6.211 } notify_master ‘/etc/keepalived/clean_arp.sh 192.168.6.211’}DB备服务器的配置:# Backup的配置内容:! Configuration File for keepalivedglobal_defs { notification_email { example@domain.com # 收邮件人,可以定义多个 } notification_email_from HaproxyBackup@db.haproxy # 发件人,可伪装 smtp_server 127.0.0.1 # 发送邮件的服务器地址 smtp_connect_timeout 30 # 连接超时时间 no_email_faults router_id DBBackup vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}vrrp_script chk_haproxy { # HAProxy服务监测脚本 script ‘/etc/keepalived/check_haproxy.sh’ interval 2 weight 2}vrrp_instance VI_1 { # 每一个vrrp_instance就是定义一个虚拟路由器 state BACKUP # 由初始状态状态转换为master状态 interface 网卡名称 # 网卡名称,如eth0,根据自己的情况修改 virtual_router_id 99 # 虚拟路由的id号,一般不能大于255的 priority 90 # 优先级,数字越大,优先级越高,主比次大 advert_int 1 # 初始化通告 authentication { # 认证机制 auth_type PASS auth_pass 666 # 密码,自行更改,主备一致即可 } track_script { chk_haproxy } virtual_ipaddress { # DB服务的虚拟ip地址:vip,前面提到的备用的虚拟IP。 #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL> #192.168.200.18/24 dev eth2 label eth2:1 192.168.6.211 } notify_master ‘/etc/keepalived/clean_arp.sh 192.168.6.211’}创建Keepalived调用的脚本操作命令mkdir /etc/keepalived/echo ’’ > /etc/keepalived/check_haproxy.shecho ’’ > /etc/keepalived/clean_arp.shchmod +x /etc/keepalived/.sh# 然后编辑两个脚本的内容,如下/etc/keepalived/check_haproxy.sh#!/bin/bash# 判断haproxy是否已经启动if [ $(ps -C haproxy –no-header | wc -l) -eq 0 ]; then # 如果没有启动,则启动haproxy程序 haproxy -f /etc/haproxy/haproxy.cfgfi# 睡眠两秒钟,等待haproxy完全启动sleep 2# 判断haproxy是否已经启动if [ $(ps -C haproxy –no-header | wc -l) -eq 0 ]; then # 如果haproxy没有启动起来,则将keepalived停掉,则VIP自动漂移到另外一台haproxy机器,实现了对haproxy的高可用 service keepalived stop/etc/keepalived/clean_arp.sh#!/bin/shVIP=$1GATEWAY=192.168.6.255 # 本机的网卡网关地址/sbin/arping -I ens160 -c 5 -s $VIP $GATEWAY &>/dev/null发布文件的配置# 站点根目录赋权chmod -R 777 /home/wwwroot/publishPath# PHP环境配置vim /home/wwwroot/publishPath/.env# 编辑配置内容:APP_DEBUG=false# Web的内网VIP,如需外网访问,则需要将192.168.6.111映射到外网,然后将该处的IP改成外网IPAPP_URL=http://192.168.6.111DB_CONNECTION=mysql# DB的内网VIPDB_HOST=192.168.6.211# DB的内网端口DB_PORT=3306# 数据库名称DB_DATABASE=dbName# 数据库用户名DB_USERNAME=dbuser# 数据库密码DB_PASSWORD=dbpwd# 其他配置选项使用默认设置,这里省略。# 配置保存退出后重启php服务:service php-fpm restart关于IP的说明 以上说到的IP都是内网IP,所有的配置都使用内网IP即可。如需外网访问,只需要把两个虚拟IP和端口映射到外网即可(注意修改php配置的APP_URL)。 ...

January 14, 2019 · 6 min · jiezi

LNMP+HAProxy+Keepalived负载均衡 - 基础服务准备

日志服务修改日志服务配置并重启日志服务;vim /etc/rsyslog.conf编辑系统日志配置,指定包含的配置文件路径和规则:$IncludeConfig /etc/rsyslog.d/.conf为haproxy创建一个独立的配置文件;vim /etc/rsyslog.d/haproxy.conf编辑配置文件的内容如下:$ModLoad imudp # 取消注释$UDPServerRun 514 # 取消注释# 与“/etc/haproxy/haproxy.cfg”中的配置“log 127.0.0.1 local3”对应local3. /var/log/haproxy.log# 如果不加 “&~”,则除了在/var/log/haproxy.log中写入日志外,也会写入message文件&~配置“rsyslog”的主配置文件,开启远程日志;vim /etc/sysconfig/rsyslog修改配置内容如下:SYSLOGD_OPTIONS="-c 2 -r -m 0"# -c 2 使用兼容模式,默认是 -c 5# -r 开启远程日志# -m 0 标记时间戳,单位是分钟,为0表示禁用该功能重启HAProxy和日志服务并查看各自服务状态:service haproxy restart & service haproxy statusservice rsyslog restart & service rsyslog status# 查看PHP的错误日志配置cat /usr/local/php/etc/php.ini | grep error_log防火墙服务开通端口(根据自身需求配置):firewall-cmd –zone=public –add-port=3306/tcp –permanentfirewall-cmd –zone=public –add-port=873/tcp –permanentfirewall-cmd –zone=public –add-port=10002/tcp –permanentfirewall-cmd –zone=public –add-port=10001/tcp –permanentfirewall-cmd –zone=public –add-port=80/tcp –permanentfirewall-cmd –zone=public –add-port=8080/tcp –permanent重启/重新加载防火墙服务并查看其状态:systemctl restart firewalld.serviceservice firewalld restart && service firewalld statusfirewall-cmd –reload测试端口:telnet ip port第三方防火墙 这里推荐semanage,优点自行百度,安装配置:# 安装端口管理工具semanage;yum -y install policycoreutils-python# 查看已开通端口;semanage port -l|grep http# 开通端口;semanage port -a -t http_port_t -p tcp port_number # 开放端口port_number,要开通的端口号semanage port -d -t http_port_t -p tcp port_number # 关闭端口port_number,http_port_t为端口组名其他命令# 查看服务的pid:ps -ef | grep ServiceName# 停止服务:kill -9 service_pid# 查看端口占用情况:lsof -i tcp:80# 列出所有端口:netstat -ntlp# 分区及挂载操作# 查看当前空间df -h# 查看可用磁盘fdisk -lfdisk /dev/sdb# 创建分区,多数操作可以默认Command (m for help): m# 根据提示进行操作:# 分区后格式化mkfs -t ext4 /dev/sdb1mkfs -t ext4 /dev/sdb2# 挂载到已有目录mount -w /dev/sdb1 /mnt/lnmpmount -w /dev/sdb2 /mnt/backupmount -o remount -w /dev/sdb2 /mnt/backup ...

January 12, 2019 · 1 min · jiezi

LNMP+HAProxy+Keepalived负载均衡 - LNMP基础环境准备

环境版本说明:服务器系统:CentOS 7.5:cat /etc/redhat-releaseCentOS Linux release 7.5.1804 (Core) # 输出结果服务器IP地址: 服务器A:192.168.6.100 服务器B:192.168.6.200LNMP版本: lnmp1.5 下载地址:http://soft.vpser.net/lnmp/ln…准备安装环境(两台服务器都需要执行):# 关闭selinux(如果是centos系统,默认会开启selinux,会引发很多权限问题)vim /etc/selinux/config# 把SELINUX=enforcing改为SELINUX=disabled# 保存退出,并执行下面的命令使配置立即生效:setenforce 0# 升级所有包,改变软件设置和系统设置,系统版本内核都升级# yum -y update# 升级所有包,不改变软件设置和系统设置,系统版本升级,内核不改变yum -y upgrade# 安装后面用到的软件yum -y install haproxy keepalived vim crontabs mlocate && updatedb# 创建文件夹,并将lnmp安装包下载到当前新创建的文件夹mkdir -p /home/soft && cd /home/soft && wget http://soft.vpser.net/lnmp/lnmp1.5-full.tar.gz# 解压安装包tar -xvf lnmp1.5-full.tar.gz安装lnmp:cd /home/soft/lnmp1.5-full./install.sh根据自己的需要选择MySQL、PHP等软件的版本,按提示操作,然后等待安装完成。我这里都选择最新版本。记好设置的相关密码,后面会用到。其他命令集合(仅用参考,无需执行):# 添加用户组和用户,并为其分配相关文件夹的最高权限:groupadd -r GroupName useradd -g UserName -M -s /sbin/nologin GroupNamechown -R GroupName:UserName /usr/local/haproxy# 工具版本查看mysql -uroot -pPwdStr # 登录后就可以看到mysql的版本nginx -v # nginx versionhaproxy -v # HA-Proxy versionkeepalived -v # keepalived 版本# 编辑配置文件集合:vim /etc/keepalived/keepalived.confvim /etc/rsyslog.conf # 编辑系统日志配置vim /etc/rsyslog.d/haproxy.conf # HAProxy的日志vim /etc/sysconfig/rsyslog # rsyslog的主配置vim /usr/local/nginx/conf/nginx.conf # Nginx的配置vim /etc/haproxy/haproxy.cfg # HAProxy的配置vim /etc/my.cnf # MySQL的配置# 将相关服务设置为开机启动:chkconfig nginx on # Web服务chkconfig mysql on # 数据库服务chkconfig haproxy on # 反向代理服务chkconfig keepalived on # 服务状态监测chkconfig crond on # 计划任务服务chkconfig rsyslog on # 日志服务# 重启各服务集合:service haproxy restart & service haproxy statusservice rsyslog restart & service rsyslog statusservice nginx restart & service nginx statusservice mysql restart & service mysql statusservice keepalived restart & service keepalived statusservice crond restart & service crond statuslnmp restart离线安装 如果要安装的服务器无法连接外网,安装就要麻烦很多,无法使用lnmp的一键安装包了。只能通过PC下载,然后远程上传到服务器,然后再编译安装。这里就不列举所有软件的安装。下载MySQL 点击官方下载 mysql-8.0.13-1.el7.x86_64.rpm-bundle.tar;安装MySQL# 卸载系统自带数据库:rpm -qa | grep MySQL-rpm -ev xxxrpm -e –nodeps mysqlyum -y remove mari*# 将下载的文件通过Xftp上传到服务器# 解压文件到当前目录:tar -xvf mysql-8.0.13-1.el7.x86_64.rpm-bundle.tar# 安装 MySQL:rpm -ivh MySQL_# 创建用户组和用户:groupadd -r mysqluseradd -g mysql mysql# 为MySQL的数据库文件夹授权:chown -R mysql:mysql /home/lnmp/mysql/data/# 相应的依赖 # 1. libaio # 2. net-tools # 3. perl# 安装perl./Configure -des -Dprefix=/usr/bin/perlmake && make testmake installperl -v# 只需要安装一下四个组件就可以了:# 因为具有依赖关系,所以需要按顺序执行:rpm -ivh mysql-community-common-.rpmrpm -ivh mysql-community-libs-.rpmrpm -ivh mysql-community-client-.rpmrpm -ivh mysql-community-server-*.rpm# 查看mysql是否启动service mysqld status# 启动mysqlservice mysqld start# 停止mysqlservice mysqld stop# 重启mysqlservice mysqld restart配置MySQL# 安装完成后,打印出的安装日志里面有一些有用的提示信息,如:# 查看临时密码:cat /root/.mysql_secret# /usr/bin/mysql_secure_installation# New default config file was created as /usr/my.cnf and# will be used by default by the server when you start it.# WARNING: Default config file /etc/my.cnf exists on the system# This file will be read by default by the MySQL server# If you do not want to use this, either remove it, or use the# –defaults-file argument to mysqld_safe when starting the server# 登录后修改密码:mysql> SET PASSWORD = PASSWORD(‘DBPwdStr’);# 为数据库创建访问账户,修改账户的限制IP,查询用户表:mysql> GRANT ALL ON . TO ‘username’@’%’ IDENTIFIED BY ‘DBPwdStr’ WITH GRANT OPTION;mysql> update mysql.user set host=’%’ where host=’::1’;mysql> delete from mysql.user where host<>’%’;mysql> select * from mysql.user \G;# 编辑MySQL的配置文件:vim /etc/my.cnf# 启动MySQL服务:service mysql restart && service mysql status# 启动错误# The server quit without updating PID file (/home/lnmp/mysql/data/localhost.localdomain.pid).# 1.可能是/usr/local/mysql/data/rekfan.pid文件没有写的权限# 解决方法 :给予权限,执行 “chown -R mysql:mysql /var/data” “chmod -R 755 /usr/local/mysql/data” 然后重新启动mysqld!# 2.可能进程里已经存在mysql进程# 解决方法:用命令“ps -ef|grep mysqld”查看是否有mysqld进程,如果有使用“kill -9 进程号”杀死,然后重新启动mysqld!# 3.可能是第二次在机器上安装mysql,有残余数据影响了服务的启动。# 解决方法:去mysql的数据目录/data看看,如果存在mysql-bin.index,将它删除。# 4.mysql在启动时没有指定配置文件时会使用/etc/my.cnf配置文件,查看该文件的[mysqld]下有没有指定的数据目录(datadir)。# 解决方法:请在[mysqld]下设置这一行:datadir = /usr/local/mysql/data安装计划任务管理工具 - crontabs 点击链接下载 crontabs-1.11-6.20121102git.el7.noarch.rpm,如需下载其他版本,请访问官网; 安装:rpm -ivh crontabs-1.11-6.20121102git.el7.noarch.rpm 添加自动备份任务,具体操作请参考MySQL的自动备份。下载(需要连接VPN)并安装HAProxy 点击链接下载 haproxy-1.5.19.tar.gz,如需下载其他版本请访问官网; 安装HAProxy:# 添加用户组和用户:groupadd -r haproxy useradd -g haproxy -M -s /sbin/nologin haproxy# 为安装文件夹授权:chown -R haproxy:haproxy /usr/local/haproxy# 查看内核:uname -r# 解压安装包tar -xvf haproxy-1.5.19.tar.gzcd haproxy-1.5.19# 根据内核版本进行编译(这里的版本对应的目标是linux310):make TARGET=linux310 ARCH=x86_64 PREFIX=/usr/local/haproxymake install PREFIX=/usr/local/# 将可执行文件拷贝到全局目录下:cp /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy配置HAProxy# 配置HAProxy;cat /etc/haproxy/haproxy.cfgvim /etc/haproxy/haproxy.cfg# 编辑配置文件内容,请参考HAProxy的负载均衡# 重启HAProxy服务;haproxy -f /etc/haproxy/haproxy.cfg# 测试HAProxy;ps -ef | grep haproxy# 访问HAProxy代理的地址和端口,分别停掉备服务器的Nginx服务后,继续访问正常则说明基本配置没问题;下载并安装Keepalived 点击链接下载Keepalived 1.4.5,下载其他版本请访问官网; 安装Keeplived;tar -xvf keepalived-1.4.5.tar.gzcd keepalived-1.4.5./configure –prefix=/usr/local/keepalivedmake && make installmkdir /etc/keepalivedcp /usr/local/keepalived/sbin/keepalived /usr/bin/keepalivedcp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.confcp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived# 设置开机启动chkconfig keepalived on# 服务操作命令service keepalived startservice keepalived stopservice keepalived restartservice keepalived statusservice keepalived restart & service keepalived status配置Keepalived;# 编辑配置文件:vim /etc/keepalived/keepalived.conf# 主从服务器的配置略有差别,具体配置请参照Keepalived的配置; ...

January 10, 2019 · 3 min · jiezi