apache虚拟主机配置

1. 检查配置/etc/httpd/conf/httpd.conf

查看虚拟主机 httpd -S

  • 去掉 NameVirtualHost *:80 前的#
  • 去掉 ServerName 前的#

2. 虚拟主机配置代码

# Ensure that Apache listens on port 80
Listen 80
<VirtualHost *:80>
DocumentRoot "/www/example1"
    ServerName www.example.com

# Other directives here
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "/www/example2"
    ServerName www.example.org

# Other directives here
</VirtualHost>

CentOS 7系统上部署Apache+PHP+MariaDB+xcache使用rpm,php module

在进行部署之前需要确保当前的CentOS系统可以连接到任意一个repo软件仓库——如果网络通畅,直接使用默认repo仓库(最好使用本地yum仓库,速度快),如果无法连接网络使用本地repo仓库通过修改/etc/yum.repo.d/中的配置文件进行配置。

在配置好后使用以下命令安装Apache+PHP+MariaDB:

~]# yum install httpd php php-mysql mariadb* -y

在安装完成之后可以将其设为开机启动:

~]# systemctl start mariadb
~]# systemctl start httpd

使用下面这条命令可以检查一个服务是否设为开机启动:

~]# systemctl is-enabled SERVICE.service

到这里,基本的安装文件已经安装完成,但是从windows中使用浏览器访问此主机IP时还是不能访问,因为被防火墙阻止了,我们可以先将防火墙关闭和selinux,使用以下命令:

~]# iptables -F
~]# setenforce 0

就可以看到以下画面(172.16.7.100是这台主机的IP):

未分类

接下来开始配置两个虚拟主机,目的是当使用不同的网址访问此主机的时候能够返回不同的页面。首先添加一个配置文件到/etc/httpd/conf.d/中,文件中写入以下内容:

~]# vim /etc/httpd/conf.d/vhost-myweb
<VirtualHost *:80>
        ServerName myweb.wordpress.com
        DocumentRoot /myweb/wordpress
        ErrorLog logs/wordpress-error_log
        CustomLog logs/wordpress-access_log combiend
        <Directory "/myweb/wordpress">
                Options None
                AllowOverride   None
                Require all granted
        </Directory>
</VirtualHost>
<VirtualHost *:80>
        ServerName myweb.phpmyadmin.com
        DocumentRoot /myweb/phpmyadmin
        ErrorLog logs/phpmyadmin-error_log
        CustomLog logs/phpmyadmin-access_log combiend
        <Directory "/myweb/phpmyadmin">
                Options None
                AllowOverride None
                Require all granted
        </Directory>
</VirtualHost>

然后创建两个虚拟主机对应的家目录,并重新加载服务:

~]# mkdir -pv /myweb/{wordpress,phpmyadmin}
~]# systemctl reload httpd
~]# echo "<h1>wordpress</h1>"> /myweb/wordpress/index.html
~]# echo "<h1>phpmyadmin</h1>"> /myweb/phpmyadmin/index.html

通过上面两条输出重定向命令创建测试文件分别到各自对应的目录,创建完成之后回到windows中修改hosts配置文件(此文件在C:WindowsSystem32driversetc目录中的hosts文件,这个文件保存了本地的DNS记录),在其中加入这两条(如果提示不能修改,那么鼠标右键此文件,属性→安全→编辑,在下方权限那里将修改权限的勾打上):

172.16.7.100 myweb.wordpress.com
172.16.7.100 myweb.phpmyadmin.com

配置保存之后在浏览器通过访问两个网址即可看到不同的网址:

未分类

未分类

接下来删除这两个测试文件(~]# rm -frv /myweb/*),开始配置wordpress和phpmyadmin,wordpress的配置请参考上一篇博客:http://11142243.blog.51cto.com/11132243/1964468 ,在这里只进行phpmyadmin的配置。

配置好的wordpress:

未分类

下面开始配置phpmyadmin,下载地址:https://files.phpmyadmin.net/phpMyAdmin/3.5.4/phpMyAdmin-3.5.4-all-languages.tar.gz

(在这里一定要注意版本,我因为没有注意版本,下载了一个高版本的,但是它所依赖的其他软件版本没跟上,调试了快一整天才发现这个问题 = =!)

调试的时候将下边的语句写到要调适的php文件开头,将错误输出打开:

    <?php
    ini_set('display_errors','on');
    error_reporting(E_ALL);
    ?>

当软件下载完成之后(可以通过

wget -c https://files.phpmyadmin.net/phpMyAdmin/3.5.4/phpMyAdmin-3.5.4-all-languages.tar.gz

命令下载或者从windows中下载之后导入到linux系统中(使用xshell自带功能或者FileZilla软件))

未分类

 ~]# cd /myweb/phpmyadmin/
 phpmyadmin]# tar -zxvf ~/phpMyAdmin-3.5.4-all-languages.tar.gz -C ./

然后将phpMyAdmin-4.7.4-all-languages/目录中的文件复制到当前目录中:

phpmyadmin]# mv phpMyAdmin-3.5.4-all-languages/* ./

这样,phpMyAdmin远程管理软件即配置完成,我们可以通过远程来管理数据库中的内容:

未分类

但是因为我们只给wordpress账户赋予了远程登陆的权限,所以在这里只能登陆账号“wordpress”(如果想要登陆root账户,只需要按照在数据库中给wordpress账户分配权限的方法给root用户分配远程登陆的权限即可)

未分类

未分类

此时网站已经部署好了,我们接下来需要对其进行测试,可以在另外一台能够连接到这台主机的主机中使用以下命令(同样需要修改hosts文件——/etc/hosts):

echo '172.16.7.100    myweb.phpmyadmin.com myweb.wordpress.com' >> /etc/hosts
~]# ab -c 100 -n 1000 myweb.phpmyadmin.com/index.php

此时,我正好有一台IP为172.16.6.11的主机,ab压力测试结果如下:

未分类

未分类

为了进一步提升访问速度,我们可以安装php的xcache模块:

]# yum install php-xcache

未分类

安装之后使用以下命令就可以看到如下图所示的效果(没有安装的使用这个命令效果如上图)

~]# php -v

未分类

安装成功之后再进行测试,发现速度提升了将近一倍

未分类

未分类

apache的工作模式

apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件,其工作模式有许多中,目前 主要有两种模式:prefork模式和worker模式

prefork模式:

这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它要求将每个请求相互独立的情况下 最好的MPM,这样若一个请求出现问题就不会影响到其他请求。 这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将MaxClients设置为一个足 够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。

worker模式:

此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以 可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是它也使用了多进程,每个进程又有多个 线程,以获得基于进程的MPM的稳定性。 控制这个MPM的最重要的指令是,控制每个子进程允许建立的线程数ThreadsPerChild指令,和控制允许 建立的总线程数的MaxClients指令。

apache模式的查看和安装:

如果apache已经安装,我们可以用 httpd -l 命令查看当前模式(只可能有一种)

如果找到 prefork.c 则表示当前工作在prefork模式,同理出现worker.c则工作在worker模式。

如果apache还未安装,我们在编译的时候可以加入 –with-pem=(prefork|worker)选项决定启用 什么模式。

当然如果你安装过了(笔者模式为prefork) 也可以使用以下命令来切换

mv httpd httpd.prefork
mv httpd.worker httpd

重启之后,模式就会改变。

不同模式配置:

针对不通的模式配置文件也是不一样的,他们都是在httpd的默认配置文件httpd.conf中

<IfModule prefork.c> StartServers             5 MinSpareServers        5 MaxSpareServers     20 ServerLimit            256 MaxClients             256 MaxRequestsPerChild    4000
</IfModule>
#这是prefork的配置文件
<IfModule worker.c>
StartServers                 2 MaxClients                 150 MinSpareThreads         25 MaxSpareThreads         75 ThreadsPerChild         25 MaxRequestsPerChild    0
</IfModule>
#这是worker的配置文件

prefork.c模块

prefork MPM 使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连 接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无 线程设计在某些情况下将比worker更有优势:他能够使用那些没有处理好线程安全的第三方模块,并 且 对于那些线程调试困难的平台而言,他也更容易调试一些。

ServerLimit 20000 StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 1000 MaxRequestsPerChild 0
//默认的MaxClient最大是256个线程,假如想配置更大的值,就的加上ServerLimit这个参数。20000 是ServerLimit这个参数的最大值。假如需要更大,则必须编译apache,此前都是无需重新编译Apache。 生效前提:必须放在其他指令的前面

StartServers 5
//指定服务器启动时建立的子进程数量,prefork默认为5。 

MinSpareServers 5
//指定空闲子进程的最小数量,默认为5。假如当前空闲子进程数少于MinSpareServers ,那么Apache将 以最大每秒一个的速度产生新的子进程。此参数不要设的太大。

MaxSpareServers 10
//配置空闲子进程的最大数量,默认为10。假如当前有超过MaxSpareServers数量 的空闲子进程,那么 父进程将杀死多余的子进程。此参数不要 设的太大。假如您将该指令的值配置为比MinSpareServers 小,Apache将会自动将其修改成"MinSpareServers+1"。

MaxClients 256
//限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为256。任何超过MaxClients限 制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,您必须同 时增大ServerLimit 。

MaxRequestsPerChild 10000
//每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制 后,子进程将会结束。假如MaxRequestsPerChild为"0",子进程将永远不会结束。 将MaxRequestsPerChild配置成非零值有两个好处: 
1.能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。 
工作方式:
一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图 保持一些备用的 (spare)或是空闲的子进程 用于迎接即将到来的请求。这样客户端就无需在得到服务前 等候子进程的产生。在Unix系统中,父进程通常以root身份运行以便邦定80端口,而 Apache产生的子进 程通常以一个低特权的用户运行。User和Group指令用于配置子进程的低特权用户。运行子进程的用户必 须要对他所服务的内容有 读取的权限,但是对服务内容之外的其他资源必须拥有尽可能少的权限。 worker.c模块
worker MPM 使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。 通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用 比Prefork MPM要低得多。但worker MPM也由不完善的地方,假如一个线程崩溃,整个进程就会连同其任 何线程一起"死掉".由于线程共享内存空间,所以一个程式在运行时必须被系统识别为"每 个线程都是安 全的"。

ServerLimit 50 ThreadLimit 200 StartServers 5 MaxClients 5000 MinSpareThreads 25 MaxSpareThreads 500 ThreadsPerChild 100 MaxRequestsPerChild 0 ServerLimit 16
//服务器允许配置的进程数上限。这个指令和ThreadLimit结合使用配置了MaxClients最大允许配置的数 值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。

ThreadLimit 64
//每个子进程可配置的线程数上限。这个指令配置了每个子进程可配置的线程数ThreadsPerChild上限。 任何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild的修改却会生效。默认值是"64". 

StartServers 3
//服务器启动时建立的子进程数,默认值是"3"。 MinSpareThreads 75
//最小空闲线程数,默认值是"75"。这个MPM将基于整个服务器监控空闲线程数。假如服务器中总的空闲 线程数太少,子进程将产生新的空闲线程。

MaxSpareThreads 250
//配置最大空闲线程数。默认值是"250"。这个MPM将基于整个服务器监控空闲线程数。假如服 务器中总 的空闲线程数太多,子进程将杀死多余的空闲线 程。MaxSpareThreads的取值范围是有限制的。Apache 将按照如下限制自动修正您配置的值:worker需要其大于等于 MinSpareThreads加上ThreadsPerChild的 和

MaxClients 400
//允许同时伺服的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候 队 列。默认值是"400",16 (ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时 候,您必须同时增加 ServerLimit的值。

ThreadsPerChild 25
//每个子进程建立的常驻的执行线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的 线程了。

MaxRequestsPerChild 0
//配置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程 将会结束。假如MaxRequestsPerChild为"0",子进程将永远不会结束。 将MaxRequestsPerChild配置成非零值有两个好处: 
1.能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。 
注意
对于KeepAlive链接,只有第一个请求会被计数。事实上,他改变了每个子进程限制最大链接数量的行 为。
工作方式: 每个进程能够拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制 进程(父进程)负责子进程的建 立。每个子进程能够建立 ThreadsPerChild数量的服务线程和一个监听线 程,该监听线程监听接入请求并将其传递给服务线程处理和应答。Apache总是试图维持一个备 用 (spare)或是空闲的服务线程池。这样,客户端无须等待新线程或新进程的建立即可得到处理。在Unix 中,为了能够绑定80端口,父进程一般都是以 root身份启动,随后,Apache以较低权限的用户建立子进 程和线程。User和Group指令用于配置Apache子进程的权限。虽然子进程必须对 其提供的内容拥有读权 限,但应该尽可能给予他较少的特权。另外,除非使用了suexec ,否则,这些指令配置的权限将被CGI 脚本所继承。

查看apache进程:

因为apache工作模式关系所以,httpd的进程查看也是不一样的。 对于prefork来说,因为一个进程只对应一个线程所以查看的时候我们可以使用

# ps aux | grep httpd |grep -v grep    root            3704    0.0    0.9    10548    3452
?                Ss     Sep08     0:00 /usr/sbin/httpd apache        3778    0.0    0.5    10548    2112
?                S        Sep08     0:00 /usr/sbin/httpd apache        3779    0.0    0.5    10548    2112
?                S        Sep08     0:00 /usr/sbin/httpd apache        3780    0.0    0.5    10548    2112
?                S        Sep08     0:00 /usr/sbin/httpd apache        3781    0.0    0.5    10548    2112
?                S        Sep08     0:00 /usr/sbin/httpd apache        3782    0.0    0.5    10548    2112
?                S        Sep08      0:00 /usr/sbin/httpd

而worker模式则需要

# pstree    |grep httpd
   |-httpd---2*[httpd---26*[{httpd}]]

以前apache主流模式为prefork,现在worker模式也开始多了起来,区别来说,worker模式可以应对 高流量,但是安全性不太好;prefork模式安全性比较好,但是性能会差一点,各位可以根据自己服务器 的类别 选取不同的模式,更好的使用apache。

apache二级域名80端口通过代理映射到Tomcat8080端口

apache域名解析设置

第一步:打开apache2/conf/httpd.conf 文件

找到:

#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
# mod_proxy_ajp.so

将前面的#号注释去掉。

第二步:打开apache2/conf/extra/httpd-vhosts.conf文件

添加虚拟主机:

<VirtualHost *:80>
    ServerName api.lanshiqin.com
    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass / ajp://127.0.0.1:8009/
</VirtualHost>

注:ServerName的值为域名,访问该域名apache将会将请求通过代理ajp解析到tomcat的8080端口。

如果域名为自定义为了开发方便,需要在本地hosts文件中添加对应的ip为127.0.0.1。

Vagrant CentOS 共享目录挂载问题解决

一直以来都是使用Vagrant与VirtualBox运行CentOS系统来搭建环境,然而有一天突然出现Windows下面的目录无法映射进去了,报错:

D:projectvagrantcentos64php56>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
  default: Adapter 1: nat
  default: Adapter 2: hostonly
==> default: Forwarding ports...
  default: 80 (guest) => 8080 (host) (adapter 1)
  default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
  default: SSH address: 127.0.0.1:2222
  default: SSH username: vagrant
  default: SSH auth method: private key
  default: Warning: Connection reset. Retrying...
  default: Warning: Connection aborted. Retrying...
  default: Warning: Connection reset. Retrying...
  default: Warning: Remote connection disconnect. Retrying...
==> default: Machine booted and ready!
[default] GuestAdditions versions on your host (5.1.26) and guest (4.3.6) do not matc
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
 * base: mirrors.btte.net
 * epel: repo.fedoralinux.ir
 * extras: mirrors.btte.net
 * updates: mirrors.btte.net
No package kernel-devel-2.6.32-358.23.2.el6.x86_64 available.
Package gcc-4.4.7-18.el6.x86_64 already installed and latest version
Package binutils-2.20.51.0.2-5.47.el6_9.1.x86_64 already installed and latest version
Package 1:make-3.81-23.el6.x86_64 already installed and latest version
Package 4:perl-5.10.1-144.el6.x86_64 already installed and latest version
Package bzip2-1.0.5-7.el6_0.x86_64 already installed and latest version
Nothing to do
Copy iso file C:Program FilesOracleVirtualBoxVBoxGuestAdditions.iso into the box
Installing Virtualbox Guest Additions 5.1.26 - guest version is 4.3.6
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.1.26 Guest Additions for Linux...........
VirtualBox Guest Additions installer
Removing installed version 5.1.26 of VirtualBox Guest Additions...
vboxadd.sh: Stopping VirtualBox Additions.
Copying additional installer modules ...
Installing additional modules ...
vboxadd.sh: Starting the VirtualBox Guest Additions.
Failed to set up service vboxadd, please check the log file
/var/log/VBoxGuestAdditions.log for details.
An error occurred during installation of VirtualBox Guest Additions 5.1.26. Some func
In most cases it is OK that the "Window System drivers" installation failed.
vboxadd.sh: Starting the VirtualBox Guest Additions.
vboxadd.sh: failed: Look at /var/log/vboxadd-install.log to find out what went wrong.
vboxadd.sh: failed: modprobe vboxguest failed.
==> default: Checking for guest additions in VM...
  default: The guest additions on this VM do not match the installed version of
  default: VirtualBox! In most cases this is fine, but in rare cases it can
  default: prevent things such as shared folders from working properly. If you see
  default: shared folder errors, please make sure the guest additions within the
  default: virtual machine match the version of VirtualBox you have installed on
  default: your host and reload your VM.
  default:
  default: Guest Additions Version: 4.3.6
  default: VirtualBox Version: 5.1
==> default: Configuring and enabling network interfaces...
  default: SSH address: 127.0.0.1:2222
  default: SSH username: vagrant
  default: SSH auth method: private key
==> default: Mounting shared folders...
  default: /home/rc => D:/project/vagrant/centos64php56
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=500,gid=500 home_rc_ /home/rc

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

这里提示虚拟机里CentOS的VBoxGuestAdditions与VirtualBox的版本匹配,需要升级:

[default] GuestAdditions versions on your host (5.1.26) and guest (4.3.6) do not matc

应该是升级了VirtualBox导致的。然而自动安装新插件失败:

vboxadd.sh: Starting the VirtualBox Guest Additions.
Failed to set up service vboxadd, please check the log file
/var/log/VBoxGuestAdditions.log for details.
An error occurred during installation of VirtualBox Guest Additions 5.1.26. Some func
In most cases it is OK that the "Window System drivers" installation failed.
vboxadd.sh: Starting the VirtualBox Guest Additions.
vboxadd.sh: failed: Look at /var/log/vboxadd-install.log to find out what went wrong.
vboxadd.sh: failed: modprobe vboxguest failed.

导致共享目录无法映射。但是虚拟机仍然是启动成功的,可以ssh进去,或者使用sftp挂载。

Google了下有说是VirtualBox bug的,也有说是Windows问题的,各种折腾不能解决。升级插件也无效:vagrant plugin install vagrant-vbguest。重新安装VirtualBox和Vagrant,并不会影响现有虚拟机及网络配置,但不能解决问题。

直到看到这篇文章,决定从CentOS入手解决。

启动虚拟机后,使用sftp上传VBoxGuestAdditions.iso,ssh进入手动安装:

$ sudo
$ mount VBoxGuestAdditions.iso -o loop /mnt
$ cd /mnt
$ sh VBoxLinuxAdditions.run

安装失败,查看日志:

Building the main Guest Additions module                   [FAILED]
(Look at /var/log/vboxadd-install.log to find out what went wrong)

vboxadd-install.log日志:

/tmp/vbox.0/Makefile.include.header:97: *** Error: unable to find the sources of your current Linux kernel. Specify KERN_DIR=<directory> and run Make again.  Stop.

参照: https://www.centos.org/forums/viewtopic.php?t=45163 ,查看kernel版本

$ rpm -qa kernel* | sort
kernel-2.6.32-358.23.2.el6.x86_64
kernel-devel-2.6.32-696.10.2.el6.x86_64
kernel-firmware-2.6.32-358.10.2.el6.noarch
kernel-headers-2.6.32-696.10.2.el6.x86_64

$ uname -r
2.6.32-358.10.2.el6.x86_64

其实一开始是更多版本不匹配的,尝试更新kernel:

yum update
yum install kernel-headers kernel-devel

结果部分更新失败:

Warning: No matches found for: kernel-devel
No Matches found

参照: https://stackoverflow.com/questions/29396322/warning-no-matches-found-for-kernel-devel 解除版本锁定,设置enabled = 0:

$ vim /etc/yum/pluginconf.d/versionlock.conf

再次运行升级kernel就可以了。安装成功后,重启后,再次运行sh VBoxLinuxAdditions.run 就可以了。事实上Vagrant启动时就会自动安装VBoxGuestAdditions:

[default] GuestAdditions 5.1.26 running --- OK.

Vagrant升级到后发现vagrant up初始化下载box卡住了,那是你的vagrant版本太高与对应的powershell版本对应不上,可以下载最新的powershell安装即可。

如果box下载很慢,可以参照这里的方法自我映射取得url单独下载:

https://app.vagrantup.com/box-cutter/boxes/centos73
==> https://atlas.hashicorp.com/box-cutter/boxes/centos73/versions/2.0.21/providers/virtualbox.box

Debian/Ubuntu 下 Nginx+Lua 环境搭建

前言

  • 关于lua的特性不再赘述;
  • 以下步骤均使用了apt-get进行操作,免去了诸如ng-lua组件手动加载等繁琐的步骤,妄图使用其他方式安装的请移步官方文档:https://github.com/openresty/lua-nginx-module#installation
  • lua在web上基于lua-nginx-module运作,目前还没有Apache的支持组件,所以妄图使用Apache的可以撤了;

本人环境供参考:

Distributor ID: Debian
Description:    Debian GNU/Linux 8.8 (jessie)
Release:    8.8
Codename:   jessie

注:不确定wheezy版本的Linux下luajit是否可用。

搭建步骤

1、首先确定自己的APT源是否可用,是否足够新.

本人最开始使用了一个较为老旧的dotdeb版本,导致apt-cache查询不到lua-nginx-module,甚至一度尝试手动加载该模块,由此浪费了许多时间;
本人使用的apt source list供参考:

sudo vi /etc/apt/sources.list

>
deb http://mirrors.aliyun.com/dotdeb jessie all
deb http://mirrors.aliyun.com/debian jessie main contrib non-free
deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free
deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free

需要注意的是:添加源的时候需要注意完整性,本人最开始图省事,仅用了一个all,发现apt并不能找到luajit模块,又浪费了很多时间。

2、没有nginx的先安装nginx;

不再赘述

sudo apt-get install nginx-full

3、安装lua及相关组件

不再赘述

apt-get install lua5.2 lua5.2-doc liblua5.2-dev

4、安装luajit

sudo apt-get install luajit

关于JIT :

通常,程序有两种运行方式:静态编译与动态直译。
静态编译的程序在执行前全部被翻译为机器码,而动态直译执行的则是一句一句边运行边翻译。
即时编译(Just-In-Time Compiler)则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。

此外,使用luajit可以大大提高lua的运行效率,由此也被官方钦定。

It is highly recommended to use OpenResty releases which integrate Nginx, ngx_lua, LuaJIT 2.1, as well as other powerful companion Nginx modules and Lua libraries.

5、安装nginx的lua模块 lua-nginx-module

sudo apt-get install libnginx-mod-http-lua

需要注意的是:如果前面apt源不够新或不够全,很可能会在安装此模块的时候出现找不到luajit依赖项的情况,此时请寻找新的可靠的源并确保完整性,不要在这里浪费时间。

6、配置nginx

nginx的配置中,核心在于content_by_lua_file。

关于 content_by_lua_file 的官方文档: https://github.com/openresty/lua-nginx-module#content_by_lua_file

本人的配置代码供参考:

server {
            listen 80;
            server_name ebid.xxxx.com;
            root /home/separes/xxx;

            location / {
                    lua_code_cache off;  // 缓存
                    content_by_lua_file /home/separes/xxx/index.o;
            }
}

需要注意的是:这里的nginx缓存是默认开启的,推荐调试及开发环境中手动关闭 lua_code_cache。

7、其它

这里推荐几个组件

// cjson
sudo apt-get install lua-cjson

// lyaml
sudo luarocks install lyaml

// dbi
sudo luarocks install luadbi-mysql MYSQL_INCDIR=/usr/include/mysql
//实测后面必须指定MYSQL路径,指向系统中的mysql根目录,匹配mysql.c文件

需要注意的是,使用 luarocks/apt-get 安装或升级 lua-DBI 的时候,需要注意新版本的DBI并不完全向下兼容,其中dbi参数由全局变量改为了局部变量,如果在以前的代码中使用过,需要重新进行声明,否则该参数会报错。

文档:

Lua官方文档: https://www.lua.org/manual/5.3

lua-nginx-module官方文档: https://github.com/openresty/lua-nginx-module

环境搭建至此为止。

Linux下lua开发环境安装及安装luafilesystem

1. 先安装 lua 的相关依赖

安装 C 开发环境

由于 gcc 包需要依赖 binutils 和 cpp 包,另外 make 包也是在编译中常用的,所以一共需要 9 个包来完成安装,因此我们只需要执行 9 条指令即可:

gcc:命令未找到(解决方法)

yum install cpp
yum install binutils
yum install glibc
yum install glibc-kernheaders
yum install glibc-common
yum install glibc-devel
yum install gcc
yum install make
yum install readline-devel

2. 安装 lua5.1.5

未分类

下载地址:http://www.lua.org/ftp/

tar -zxvf lua-5.1.5.tar.gz
cd lua-5.1.5
vi Makefile

设置 INSTALL_TOP= /usr/local/lua

make linux
make test
make install
rm -rf  /usr/bin/lua
ln -s /usr/local/lua/bin/lua /usr/bin/lua
ln -s /usr/local/lua/share/lua /usr/share/lua

设置环境变量:

vim /etc/profile

添加:

export LUA_HOME=/usr/local/lua
export PATH=$PATH:$LUA_HOME/bin

环境变量生效:

source /etc/profile

3、安装 luarocks

是一个 Lua 包管理器,基于 Lua 语言开发,提供一个命令行的方式来管理 Lua 包依赖、安装第三方 Lua 包等。

地址:https://github.com/luarocks/luarocks

使用 luarocks-2.2.1 版本在我机器上没有问题,但是使用 luarocks-2.4.2 出现问题

wget http://luarocks.org/releases/luarocks-2.2.1.tar.gz
tar -zxvf luarocks-2.2.1.tar.gz
cd luarocks-2.2.1
./configure --with-lua=/usr/local --with-lua-include=/usr/local/lua/include

设置环境变量:

export LUA_LUAROCKS_PATH=/usr/local/luarocks-2.2.1
export PATH=$PATH:$LUA_LUAROCKS_PATH
make & make install

4、安装 luafilesystem

是一个用于 lua 进行文件访问的库,可以支持 lua 5.1 和 lua5.2,且是跨平台的,在为 lua 安装 lfs 之前需要先安装luarocks。因为自己的需求刚好需要这模块。

地址:https://github.com/keplerproject/luafilesystem

文档:http://keplerproject.github.io/luafilesystem/index.html
luarocks install luafilesystem

5、测试

测试 lua 是否安装成功

lua -v

结果:

Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio

测试 luafilesystem 是否安装成功

a.lua
local lfs = require"lfs"
function Rreturn(filePath)
local time = os.date("%a, %d %b %Y %X GMT", lfs.attributes(filePath).modification)

–打印文件的修改时间

print(time)
end
Rreturn("/opt/lua/a.txt")
a.txt
a
b
c

运行:

lua  a.lua

结果:

Tue, 16  Sep 2017 9:43:13 GMT

出现打印出时间的结果就意味着已经安装好了。

当然以上这是在 Linux 安装的, Windows 上的其实比这还简单了,但是安装 luafilesystem 的话需要自己去下载个 lfs.dll ,然后把这个放到 lua 的安装路径去。很简单的,这里就不细说了。

出现过的错误:

[root@n1 lua-5.1.5]# make linux test
cd src && make linux
make[1]: Entering directory `/opt/lua-5.1.5/src'
make all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"
make[2]: Entering directory `/opt/lua-5.1.5/src'
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lapi.o lapi.c
make[2]: gcc:命令未找到
make[2]: *** [lapi.o] 错误 127
make[2]: Leaving directory `/opt/lua-5.1.5/src'
make[1]: *** [linux] 错误 2
make[1]: Leaving directory `/opt/lua-5.1.5/src'
make: *** [linux] 错误 2

原因:最开始的那些依赖没安装。

简单的灰度测试,lua或者直接改nginx配置

配置过程:

1、根据cookies特征值实现

在做的过程中把login的操作给做了过滤。登录过程将cookie中设置了一个新的cookie值 GINA_gray_SESSIONID =gray这样在nginx配置中

加入筛选

Root不要配置在最前面而是配置在location中

#过滤login 请求进来会优先判断 请求是不是/ gina-client/login 然后判断是不是 / gina-client/

location /client/login {
     proxy_pass http://client_stable_gray;
}

登陆过程加上cookie

 location /client/{
                set $group "client_stable";

if ( $http_cookie ~* "GINA_gray_SESSIONID = gray" ) {

                set $group "client_stable_gray";

}

               proxy_pass http://$group;
        }

筛选root

location / {

                 set root /data0/project/gina/html/agent;

                 if ( $http_cookie ~*"GINA_gray_SESSIONID = gray" ) {

                      set root /data0/project/gina/html/agent_gray/magneto/dist/agent;

                 }

        }

2、根据cookie ||||| lua 方式

如果单独抽出来写lua脚本

cookies_gray.lua

local uin = ngx.var.cookie_loginuin

--取cookies里的loginuin字段,末尾被2整数的灰度

if uin ~= nil and string.sub(uin,string.len(uin))%2 == 0then

  ngx.exec("@gray_env")

else

  ngx.exec("@product_env")

end

nginx.conf

  ...

  #http

  lua_code_cacheoff; #正式上线记得打开cache

  lua_package_path"/usr/local/openresty/lualib/?.lua;;";

  lua_shared_dictconfig 1m;

  ...

  #server

  location / {

     #access_by_lua_file  conf/lua/ip_gray.lua;

    access_by_lua_file conf/lua/cookies_gray.lua;

  }

  location@gray_env {

      proxy_passhttp://gray_env;

     proxy_set_header Host $http_host;

  }

  location@product_env {

      proxy_passhttp://product_env;

     proxy_set_header Host $http_host;

  }

cal uin = ngx.var.cookie_GINA_gray_SESSIONID

if uin ~= nil and uin == 'gray' then

 ngx.say("Gray Environment World")

 #ngx.exec("@gray_env")

else

 ngx.exec("@product_env")

end

Mysql必读mysql数据库备份及恢复命令 mysqldump,source的用法

还原一个数据库:

mysql -h localhost -u root -p123456 www<c:www.sql 

备份一个数据库:

mysqldump -h localhost -u root -p123456 www > d:www2008-2-26.sql 

//以下是在程序中进行测试

//$command = "mysqldump --opt -h $dbhost -u $dbuser -p $dbpass $dbname | gzip > $backupFile"; 
$command="mysqldump -h localhost -u root -p123456 guestbook > guestbook2-29.sql"; 
system($command); 
echo "success"; 

备份MySQL数据库的命令

mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql 

备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库.

mysqldump -Cadd-drop-table -uusername -ppassword databasename > backupfile.sql 

直接将MySQL数据库压缩备份

mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz 

备份MySQL数据库某个(些)表

mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql 

同时备份多个MySQL数据库

mysqldump -hhostname -uusername -ppassword Cdatabases databasename1 databasename2 databasename3 > multibackupfile.sql 

仅仅备份数据库结构

mysqldump Cno-data Cdatabases databasename1 databasename2 databasename3 > structurebackupfile.sql 

备份服务器上所有数据库

mysqldump Call-databases > allbackupfile.sql 

还原MySQL数据库的命令

mysql -hhostname -uusername -ppassword databasename < backupfile.sql 

还原压缩的MySQL数据库

gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename 

将数据库转移到新服务器

mysqldump -uusername -ppassword databasename | mysql Chost=*.*.*.* -C databasename 

几个常用用例:

1、导出整个数据库

mysqldump -u 用户名 -p 数据库名 > 导出的文件名 
mysqldump -u root -p dataname >dataname.sql 

这个时候会提示要你输入root用户名的密码,输入密码后dataname数据库就成功备份在mysql/bin/目录中.

2、导出一个表

mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名 
mysqldump -u root -p dataname users> dataname_users.sql 

3、导出一个数据库结构

mysqldump -u wcnc -p -d Cadd-drop-table smgp_apps_wcnc >d:wcnc_db.sql 
-d 没有数据 Cadd-drop-table 在每个create语句之前增加一个drop table 

4、导入数据库

常用source 命令
进入mysql数据库控制台,
如mysql -u root -p

mysql>use 数据库

然后使用source命令,后面参数为脚本文件(如这里用到的.sql)

mysql>source d:wcnc_db.sql 

mysqldump支持下列选项:

  • Cadd-locks
    在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE.(为了使得更快地插入到MySQL).

  • Cadd-drop-table
    在每个create语句之前增加一个drop table.

  • Callow-keywords
    允许创建是关键词的列名字.这由表名前缀于每个列名做到.

  • -c, Ccomplete-insert
    使用完整的insert语句(用列名字).

  • -C, Ccompress
    如果客户和服务器均支持压缩,压缩两者间所有的信息.

  • Cdelayed
    用Insert DELAYED命令插入行.

  • -e, Cextended-insert
    使用全新多行Insert语法.(给出更紧缩并且更快的插入语句)

  • -#, Cdebug[=option_string]
    跟踪程序的使用(为了调试).

  • Chelp
    显示一条帮助消息并且退出.

Cfields-terminated-by=… 

Cfields-enclosed-by=… 

Cfields-optionally-enclosed-by=… 

Cfields-escaped-by=… 

Cfields-terminated-by=… 

这些选择与-T选择一起使用,并且有相应的LOAD DATA INFILE子句相同的含义.
LOAD DATA INFILE语法.

  • -F, Cflush-logs
    在开始导出前,洗掉在MySQL服务器中的日志文件.

  • -f, Cforce,
    即使我们在一个表导出期间得到一个SQL错误,继续.

  • -h, Chost=..
    从命名的主机上的MySQL服务器导出数据.缺省主机是localhost.

  • -l, Clock-tables.
    为开始导出锁定所有表.

  • -t, Cno-create-info
    不写入表创建信息(Create TABLE语句)

  • -d, Cno-data
    不写入表的任何行信息.如果你只想得到一个表的结构的导出,这是很有用的!

  • Copt
    同Cquick Cadd-drop-table Cadd-locks Cextended-insert Clock-tables.
    应该给你为读入一个MySQL服务器的尽可能最快的导出.

  • -pyour_pass, Cpassword[=your_pass]
    与服务器连接时使用的口令.如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令.

  • -P port_num, Cport=port_num
    与一台主机连接时使用的TCP/IP端口号.(这用于连接到localhost以外的主机,因为它使用 Unix套接字.)

  • -q, Cquick
    不缓冲查询,直接导出至stdout;使用mysql_use_result()做它.

  • -S /path/to/socket, Csocket=/path/to/socket
    与localhost连接时(它是缺省主机)使用的套接字文件.

  • -T, Ctab=path-to-some-directory
    对于每个给定的表,创建一个table_name.sql文件,它包含SQL Create 命令,和一个table_name.txt文件,它包含数据.注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作..txt文件的格式根据Cfields-xxx和 ClinesCxxx选项来定.

  • -u user_name, Cuser=user_name
    与服务器连接时,MySQL使用的用户名.缺省值是你的Unix登录名.

  • -O var=option, Cset-variable var=option
    设置一个变量的值.可能的变量被列在下面.

  • -v, Cverbose
    冗长模式.打印出程序所做的更多的信息.

  • -V, Cversion
    打印版本信息并且退出.

  • -w, Cwhere=’where-condition’
    只导出被选择了的记录;注意引号是强制的!
    “Cwhere=user=’jimf’” “-wuserid>1″ “-wuserid<1″

最常见的mysqldump使用可能制作整个数据库的一个备份:

mysqldump Copt database > backup-file.sql 

但是它对用来自于一个数据库的信息充实另外一个MySQL数据库也是有用的:

mysqldump Copt database | mysql Chost=remote-host -C database 

由于mysqldump导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了:

shell> mysqladmin create target_db_name 
shell> mysql target_db_name < backup-file.sql 

就是

shell> mysql 库名 < 文件名

结合mysqlbinlog与mysqldump进行MySQL数据备份与恢复(适用于较小的数据量)

通过mysqlbinlog工具备份二进制日志文件

mysqlbinlog  --read-from-remote-server --host=192.168.83.37 --port=55944 --user=us_yanzhaozhang --password --raw --to-last-log VMS00782-bin.000001
mysqlbinlog  --read-from-remote-server --host=192.168.83.37 --port=55944 --user=us_yanzhaozhang --password VMS00782-bin.000001  VMS00782-bin.000002  VMS00782-bin.000003 ...  VMS00782-bin.000017  

上述两条命令会将mysqlbinlog连接到的主机中的由VMS00782-bin.000001开始至最后一个二进制日志文件备份到启动mysqlbinlog的目录中。其中–raw参数表明输出二进制格式的文件而非文本格式,–read-from-remote-serve参数表明要连接至该server请求其二进制日志。需要注意的是即使是在本地也需要列出–read-from-remote-server参数。

默认情况下,上述命令会在备份完成后立即断开连接,若想保持连接进行持续备份可添加–stop-never参数。

mysqlbinlog  --read-from-remote-server --host=192.168.83.37 --port=55944 --user=us_yanzhaozhang --password --raw --stop-never VMS00782-bin.000001

指定了–stop-never参数后无需再指定–to-last-log参数。

默认情况下,mysqlbinlog 备份的二进制日志文件保持原名,且存放在当前目录中。可通过–result-file参数改变这个行为,该参数指定了输出文件名的前缀,假定原名为VMS00782-bin.000009,若指定–result-file=x则输出
为xVMS00782-bin.000001,若指定–result-file=/backup/则输出为/backup/VMS00782-bin.000001,若指定–result-file=/backup/x则输出为/backup/xVMS00782-bin.000001。

使用mysqldump和mysqlbinlog进行备份和恢复

假定欲备份的主机中第一个二进制日志文件为VMS00782-bin.000010
首先使用mysqlbinlog进行二进制日志文件的持续备份

mysqlbinlog  --read-from-remote-server --host=192.168.83.37 --port=55944 --user=us_yanzhaozhang --password --raw --stop-never VMS00782-bin.000010

然后使用mysqldump创建备份文件

mysqldump --host=192.168.83.37 --port=55944 --user=us_yanzhaozhang --password --all-databases --events --routines --master-data=2 > dump.sql

若发生数据丢失则使用最近的备份来恢复数据

mysql --host=192.168.83.37 -uus_yanzhaozhang -p -P55944 < dump.sql

根据dump.sql备份文件中– CHANGE MASTER TO MASTER_LOG_FILE=’VMS00782-bin.000018′, MASTER_LOG_POS=27284语句中的二进制日志文件名和位置重新执行该坐标之后的二进制日志备份文件中的事件。

若最新的二进制日志备份文件为VMS00782-bin.000020,如下重新执行日志事件

mysqlbinlog --start-position=27284 VMS00782-bin.000018 VMS00782-bin.000019 VMS00782-bin.000020| mysql --host=192.168.83.37 -uus_yanzhaozhang -p -P55944