Docker使用示例(2) – 管理容器

列出容器

  1. $ docker ps
  2. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
  3. 2bc9b1988080        redis               "docker-entrypoint.sh"   2 weeks ago         Up 2 hours          0.0.0.0:6379->6379/tcp    elephant-redis
  4. 817879be2230        postgres            "/docker-entrypoint.s"   2 weeks ago         Up 2 hours          0.0.0.0:65432->5432/tcp   pt-postgres

docker ps只列出正在运行的容器。要查看所有容器(包括已停止的),使用-a选项:

  1. $ docker ps -a
  2. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                     NAMES
  3. 9cc69f11a0f7        docker/whalesay     "ls /"                   26 hours ago        Exited (0) 26 hours ago                             berserk_wozniak
  4. 2bc9b1988080        redis               "docker-entrypoint.sh"   2 weeks ago         Up 2 hours                0.0.0.0:6379->6379/tcp    elephant-redis
  5. 817879be2230        postgres            "/docker-entrypoint.s"   2 weeks ago         Up 2 hours                0.0.0.0:65432->5432/tcp   pt-postgres

要列出特定状态的容器,可以使用-f选项指定。如下例子是列出已经退出的容器:

  1. $ docker ps -a -f status=exited
  2. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                     NAMES
  3. 9cc69f11a0f7        docker/whalesay     "ls /"                   26 hours ago        Exited (0) 26 hours ago

也可以使用-q选项来列出容器的ID:

  1. $ docker ps -aq
  2. 9cc69f11a0f7
  3. 2bc9b1988080
  4. 817879be2230

如果在生成容器时使用了–name mycontainer1指定名称,我们可以使用此名称来找到这个容器:

  1. docker ps -f name=mycontainer1

引用容器

Docker命令可以使用以下三种方式来引用容器:
Full UUID:9cc69f11a0f76073e87f25cb6eaf0e079fbfbd1bc47c063bcd25ed3722a8cc4a
Short UUID:9cc69f11a0f7
Name:berserk_wozniak
使用docker ps可以看到这三种形式。
UUID是Docker自动生成的,不能更改。你可以使用–name来指定一个你的名称。如果不指定,Docker则会分配一个随机的名称。

删除所有退出的容器

  1. docker ps -aq -f status=exited | xargs -r docker rm

其中docker ps -aq -f status=exited会列出所有已退出的容器的ID
或者使用:

  1. docker rm $(docker ps -aq -f status=exited)

连接后台运行的容器

  1. docker attach –sig-proxy=false <container>

使用这个命令会连接到容器的bash,意味着如果容器里运行着一个脚本,你会看到脚本的输出。
如果要断开连接,使用Ctrl-P Ctrl-Q。
如果要创建一个新的容器bash环境并进入,可以使用:

  1. docker exec -it <container> bash

从/到容器复制文件

从容器到宿主:

  1. docker cp CONTAINER_NAME:PATH_IN_CONTAINER PATH_IN_HOST

从宿主到容器:

  1. docker cp PATH_IN_HOST CONTAINER_NAME:PATH_IN_CONTAINER

启动/停止/重启容器

启动:

  1. docker start <container> [<container>…]

停止:

  1. docker stop <container> [<container>…]

重启:

  1. docker restart <container> [<container>…]

Docker使用示例(1) – 创建容器

容器运行后自动删除

一般情况下,退出一个Docker容器后它仍然会存在。这允许你再次运行容器,查看其文件系统等。不过,有时候你可能想运行容器后马上自动删除。例如想执行一个命令或者查看一个文件。Docker为此提供了一个–rm命令行参数来实现它。

  1. docker run –rm ubuntu cat /etc/hosts

这会从ubuntu镜像创建一个容器,显示/etc/hosts的内容,然后退出后立即销毁容器。
这避免了你只是想做下实验后再清理容器的麻烦。
注意:–rm选项在与-d(–detach)选项时失效。
当使用–rm选项时,Docker被删除后也会删除与之关系的volumes。这与执行docker rm -v my-container类似。只删除未命名的volumes。
例如,运行docker run -it –rm -v /etc -v logs:/var/log centos /bin/produce_some_logs,/etc数据卷会被删除,/var/log则不会。

容器重启策略

  1. docker run –restart=always -d <container>

默认情况下,当Docker守护进程重启时(如主机系统重启),容器不会跟着重启。Docker为容器提供了一个重启策略,选项为–restart=always。使用此选项一旦Docker守护里程重启后,容器也会重启。
不过,如果是手动停止的容器(如docker stop ),重启策略则不会生效。

设置容器名称

默认下,使用docker run创建容器时会分配一个随机的名称,如small_roentgen或modest_dubinsky。这种名称对识别容器不会有任何帮助。我们可以通过–name选项来指定一个有意义的名称。

  1. docker run –name my-ubuntu ubuntu:14.04

名称必须是唯一的。如果指定了一个与正在运行容器的名称一样,docker会报错并且不会创建任何容器。

后台运行容器

为了让容器在后台运行,我们可以在生成容器时使用-d选项。

  1. docker run -d busybox top

给容器分配数据卷

Docker 数据卷(volume)其实是一个文件或者目录,它在容器生命周期结束后还会保留。我们可以挂载宿主机的一个文件或目录作为Docker的数据卷。
使用-v选项添加一个数据卷:

  1. docker run -d -v "/data" awesome/app bootstrap.sh

这会创建一个数据卷并把它挂载到容器的/data目录。

挂载宿主目录

挂载宿主文件或目录到容器:

  1. docker run -d -v "/home/foo/data:/data" awesome/app bootstrap.sh

这会把宿主的/home/foo/data目录挂载到容器里的/data目录。这个操作就会Linux的mount命令。因此这个挂载只存在于容器的生命周期。更改宿主/home/foo/data的文件会立即影响到容器的/data对应的文件里,因为它们是指向硬盘上的同一个文件。

命名数据卷

可以在创建数据卷时指定一个名称,而不只是主机目录路径。

  1. docker run -d -v "my-volume:/data" awesome/app bootstrap.sh

命名的数据卷创建后,可以通过此名称来与其它容器共享。

交互方式运行容器

使用-it选项来以交互方式运行容器。

  1. $ docker run -it ubuntu:14.04 bash
  2. root@8ef2356d919a:/# echo hi
  3. hi
  4. root@8ef2356d919a:/#

-i选项保持STDIN打开,而-t则分配一个伪TTY。

登录正在运行的容器

我们可以使用如下命令来登录正在运行的容器

  1. docker exec -it jovial_morse bash

Ubuntu 16.04配置Nginx使用GeoIP

本文解释如何在Ubuntu 16.04上使用nginx的GeoIP模块,以了解您的访问者来自哪里。 GeoIP模块设置多个变量,如$geoip_country_name,$geoip_country_code,$geoip_city等,您可以在PHP脚本中或直接在nginx配置中使用这些变量,例如,根据用户所在的国家/地区以不同的语言提供内容。

了解Nginx是否支持GeoIP

在我们开始之前,我们必须找出GeoIP模块是否内置到我们的nginx服务器:

  1. nginx -V

root@server1:~# nginx -V
nginx version: nginx/1.10.0 (Ubuntu)
built with OpenSSL 1.0.2g-fips 1 Mar 2016
TLS SNI support enabled
configure arguments: –with-cc-opt=’-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2′ –with-ld-opt=’-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now’ –prefix=/usr/share/nginx –conf-path=/etc/nginx/nginx.conf –http-log-path=/var/log/nginx/access.log –error-log-path=/var/log/nginx/error.log –lock-path=/var/lock/nginx.lock –pid-path=/run/nginx.pid –http-client-body-temp-path=/var/lib/nginx/body –http-fastcgi-temp-path=/var/lib/nginx/fastcgi –http-proxy-temp-path=/var/lib/nginx/proxy –http-scgi-temp-path=/var/lib/nginx/scgi –http-uwsgi-temp-path=/var/lib/nginx/uwsgi –with-debug –with-pcre-jit –with-ipv6 –with-http_ssl_module –with-http_stub_status_module –with-http_realip_module –with-http_auth_request_module –with-http_addition_module –with-http_dav_module –with-http_geoip_module –with-http_gunzip_module –with-http_gzip_static_module –with-http_image_filter_module –with-http_v2_module –with-http_sub_module –with-http_xslt_module –with-stream –with-stream_ssl_module –with-mail –with-mail_ssl_module –with-threads
如果看到–with-http_geoip_module,则已经把geoip模块编译到nginx中了。

下载GeoIP数据库

在Debian和Ubuntu上,有一个通过apt安装的geoip数据库,但它有点过旧了,只包含GeoIP.dat(国家数据库),而不是GeoLiteCity.dat(城市数据库)。 因此,我们不安装该软件包,从GeoIP网站下载新的到/etc/nginx/geoip目录:

  1. mkdir /etc/nginx/geoip
  1. cd /etc/nginx/geoip
  2. wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
  3. gunzip GeoIP.dat.gz
  4. wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
  5. gunzip GeoLiteCity.dat.gz

配置Nginx

现在我们配置nginx。 打开/etc/nginx/nginx.conf …

  1. nano /etc/nginx/nginx.conf

…并将geoip_country和geoip_city指令添加到http {}代码块中:

  1. […]
  2. http {
  3.  
  4.  ##
  5.  # Basic Settings
  6.  ##
  7.  
  8.  geoip_country /etc/nginx/geoip/GeoIP.dat; # the country IP database
  9.  geoip_city /etc/nginx/geoip/GeoLiteCity.dat; # the city IP database
  10. […]

geoip_country指令可用变量如下:
$geoip_country_code – 两个字母的国家/地区代码,例如RU,US。
$geoip_country_code3 – 三个字母的国家/地区代码,例如,RUS,USA。
$geoip_country_name – 国家/地区的(详细)名称,例如俄罗斯联邦,美国等。
geoip_city指令提供以下变量:
$geoip_city_country_code – 两个字母的国家/地区代码,例如RU,US。
$geoip_city_country_code3 – 三字母国家/地区代码,例如,RUS,USA。
$geoip_city_country_name – 国家/地区的名称,例如,俄罗斯联邦,美国 – 如果可用。
$geoip_region – 区域的名称(省,地区,州,省,联邦土地等),例如,Moscow City,DC – 如果可用。
$geoip_city – 城市的名称,例如,莫斯科,华盛顿,里斯本等 – 如果可用。
$geoip_postal_code – 邮政编码或邮政编码(如果有)。
$geoip_city_continent_code – 如果可用。
$geoip_latitude – latitude – 如果可用。
$geoip_longitude – longitude – 如果可用。
为了使这些变量可用于您的PHP脚本,我们必须设置一些fastcgi_param指令。 最好在文件/etc/nginx/fastcgi_params中执行此操作,其他fastcgi_param指令为:

  1. nano /etc/nginx/fastcgi_params
  1. […]
  2. ### SET GEOIP Variables ###
  3. fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
  4. fastcgi_param GEOIP_COUNTRY_CODE3 $geoip_country_code3;
  5. fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;
  6.  
  7. fastcgi_param GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;
  8. fastcgi_param GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3;
  9. fastcgi_param GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name;
  10. fastcgi_param GEOIP_REGION $geoip_region;
  11. fastcgi_param GEOIP_CITY $geoip_city;
  12. fastcgi_param GEOIP_POSTAL_CODE $geoip_postal_code;
  13. fastcgi_param GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code;
  14. fastcgi_param GEOIP_LATITUDE $geoip_latitude;
  15. fastcgi_param GEOIP_LONGITUDE $geoip_longitude;

(确保在你的location〜 .php $ {}容器包含/etc/nginx/fastcgi_params;。)
如果你使用nginx作为反向代理,并希望将GeoIP变量传递给后端,你应该创建/编辑文件/etc/nginx/proxy.conf …

  1. nano /etc/nginx/proxy.conf

…并添加以下行:

  1. […]
  2. ### SET GEOIP Variables ###
  3. proxy_set_header GEOIP_COUNTRY_CODE $geoip_country_code;
  4. proxy_set_header GEOIP_COUNTRY_CODE3 $geoip_country_code3;
  5. proxy_set_header GEOIP_COUNTRY_NAME $geoip_country_name;
  6.  
  7. proxy_set_header GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;
  8. proxy_set_header GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3;
  9. proxy_set_header GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name;
  10. proxy_set_header GEOIP_REGION $geoip_region;
  11. proxy_set_header GEOIP_CITY $geoip_city;
  12. proxy_set_header GEOIP_POSTAL_CODE $geoip_postal_code;
  13. proxy_set_header GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code;
  14. proxy_set_header GEOIP_LATITUDE $geoip_latitude;
  15. proxy_set_header GEOIP_LONGITUDE $geoip_longitude;

(确保您在nginx代理配置中使用了include /etc/nginx/proxy.conf行,否则后端不能使用GeoIP变量。)
现在重新加载nginx …

  1. systemctl reload nginx.service

重新启动PHP-FPM,如下所示:

  1. systemctl restart php7.0-fpm.service

简单的测试

要查看GeoIP模块是否正常工作,我们可以在www.example.com根目录(例如/var/www/www.example.com/web)中创建一个PHP文件:

  1. nano /var/www/www.example.com/web/geoiptest.php

我们可以按如下方式访问GeoIP变量:
$geoip_country_code = getenv(GEOIP_COUNTRY_CODE);
或者:
$geoip_country_code = $_SERVER[‘GEOIP_COUNTRY_CODE’];

  1. <html>
  2. <body>
  3. <?php
  4.  
  5. $geoip_country_code = getenv(GEOIP_COUNTRY_CODE);
  6. /*
  7. $geoip_country_code = $_SERVER[‘GEOIP_COUNTRY_CODE’]; // works as well
  8. */
  9. $geoip_country_code3 = getenv(GEOIP_COUNTRY_CODE3);
  10. $geoip_country_name = getenv(GEOIP_COUNTRY_NAME);
  11.  
  12. $geoip_city_country_code = getenv(GEOIP_CITY_COUNTRY_CODE);
  13. $geoip_city_country_code3 = getenv(GEOIP_CITY_COUNTRY_CODE3);
  14. $geoip_city_country_name = getenv(GEOIP_CITY_COUNTRY_NAME);
  15. $geoip_region = getenv(GEOIP_REGION);
  16. $geoip_city = getenv(GEOIP_CITY);
  17. $geoip_postal_code = getenv(GEOIP_POSTAL_CODE);
  18. $geoip_city_continent_code = getenv(GEOIP_CITY_CONTINENT_CODE);
  19. $geoip_latitude = getenv(GEOIP_LATITUDE);
  20. $geoip_longitude = getenv(GEOIP_LONGITUDE);
  21.  
  22. echo ‘country_code: ‘.$geoip_country_code.'<br>’;
  23. echo ‘country_code3: ‘.$geoip_country_code3.'<br>’;
  24. echo ‘country_name: ‘.$geoip_country_name.'<br>’;
  25.  
  26. echo ‘city_country_code: ‘.$geoip_city_country_code.'<br>’;
  27. echo ‘city_country_code3: ‘.$geoip_city_country_code3.'<br>’;
  28. echo ‘city_country_name: ‘.$geoip_city_country_name.'<br>’;
  29. echo ‘region: ‘.$geoip_region.'<br>’;
  30. echo ‘city: ‘.$geoip_city.'<br>’;
  31. echo ‘postal_code: ‘.$geoip_postal_code.'<br>’;
  32. echo ‘city_continent_code: ‘.$geoip_city_continent_code.'<br>’;
  33. echo ‘latitude: ‘.$geoip_latitude.'<br>’;
  34. echo ‘longitude: ‘.$geoip_longitude.'<br>’;
  35.  
  36. ?>
  37. </body>
  38. </html>

在浏览器打开此文件后将会看到你本地IP的详细信息

docker化你的PHP应用环境Nginx PHP-FPM

开始之前

在开始之前,我们假设你对Docker使用已经有了一些经验。本文尝试使用Docker官方存储库来运行一个简单的PHP应用程序,环境是Nginx和PHP。首先第一件事当然是安装Docker(如果你还没安装)。第二获取Docker Compose。

配置Nginx

我们从配置Web服务器开始,这里我们使用Docker官方的Nginx镜像。既然我们准备使用Docker Compose,我们接下来先创建docker-compose.yml文件,其实docker nginx的80端口映射到宿主机的8080端口:

  1. web:
  2.  image: nginx:latest
  3.  ports:
  4.  – "8080:80"

现在我们运行:

  1. docker-compose up

现在我们应该通过ip:8080会得到nginx的默认页面了。
Nginx
现在nginx是启动了,让我们再来添加一些配置。首先更新docker-compose.yml使它挂载到一个本地目录。我们使用目录code。

  1. web:
  2.     image: nginx:latest
  3.     ports:
  4.         – "8080:80"
  5.     volumes:
  6.         – ./code:/code

下一步我们创建一个虚拟机配置文件site.conf,设置其根目录为/code,把该文件放置到与docker-compose.yml同级目录。

  1. server {
  2.     index index.html;
  3.     server_name php-docker.local;
  4.     error_log  /var/log/nginx/error.log;
  5.     access_log /var/log/nginx/access.log;
  6.     root /code;
  7. }

为了让这个虚拟机配置生效,我们还需要再次更改docker-compose.yml文件:

  1. web:
  2.     image: nginx:latest
  3.     ports:
  4.         – "8080:80"
  5.     volumes:
  6.         – ./code:/code
  7.         – ./site.conf:/etc/nginx/conf.d/site.conf

此次更新是把本地的site.conf挂载docker nginx里的/etc/nginx/conf.d/site.conf,这样这个配置文件就被添加到docker nginx里了。下面我们执行这个命令生效它:

  1. docker-compose up

配置PHP

现在我们已经把nginx配置好了,接下来配置PHP。首先是拉取官方的PHP7-FPM镜像,并链接到Nginx容器,docker-compose.yml如下:

  1. web:
  2.     image: nginx:latest
  3.     ports:
  4.         – "8080:80"
  5.     volumes:
  6.         – ./code:/code
  7.         – ./site.conf:/etc/nginx/conf.d/site.conf
  8.     links:
  9.         – php
  10. php:
  11.     image: php:7-fpm

下一步是配置nginx使用php-fpm容器来解析php文件。更新后的site.conf如下:

  1. server {
  2.     index index.php index.html;
  3.     server_name php-docker.local;
  4.     error_log  /var/log/nginx/error.log;
  5.     access_log /var/log/nginx/access.log;
  6.     root /code;
  7.  
  8.     location ~ .php$ {
  9.         try_files $uri =404;
  10.         fastcgi_split_path_info ^(.+.php)(/.+)$;
  11.         fastcgi_pass php:9000;
  12.         fastcgi_index index.php;
  13.         include fastcgi_params;
  14.         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  15.         fastcgi_param PATH_INFO $fastcgi_path_info;
  16.     }
  17. }

为了测试,让我们在./code目录新建一个index.php,内容如下:

  1. <?php
  2. phpinfo();
  3. ?>

然后通过ip:8080打开,但出现File not found错误。这是因为PHP容器找不到此文件,我们也需要像nginx一样挂载code目录,更新docker-compose.yml文件如下:

  1. web:
  2.     image: nginx:latest
  3.     ports:
  4.         – "8080:80"
  5.     volumes:
  6.         – ./code:/code
  7.         – ./site.conf:/etc/nginx/conf.d/site.conf
  8.     links:
  9.         – php
  10. php:
  11.     image: php:7-fpm
  12.     volumes:
  13.         – ./code:/code

最后,启动容器:

  1. docker-compose up

我们将会看到正常的phpinfo页面
Nginx

在Ubuntu 16.04 LTS安装WordPress Nginx MariaDB HHVM

安装条件

假设你机器已经满足:
Ubuntu 16.04 Server采用64位架构,因为HHVM仅在64位上运行。
以root/sudo进入系统

安装Nginx

Nginx Web服务器在Ubuntu存储库中可用。 您可以使用apt命令安装它:

  1. apt-get update
  2. apt-get install nginx

安装完成后启动Nginx。

  1. systemctl start nginx

现在用你的浏览器测试,打开服务器IP:http://192.168.1.108/。 将URL中的IP替换为您自己的IP。
Nginx

安装配置MariaDB

在本教程中,我将安装MariaDB作为MySQL的替代,以利用其更好的性能。 MariaDB是由MySQL开发人员Monty Widenius维护的MySQL的一个分支。
使用apt-get命令安装MariaDB:

  1. apt-get install mariadb-client mariadb-server

现在你可以启动MariaDB(MariaDB服务名为mysql):

  1. systemctl start mysql

当MariaDB运行时,设置MariaDB root密码以保护数据库:

  1. mysql_secure_installation

Enter current password for root (enter for none): PRESS ENTER

Set root password? [Y/n] Y
ENTER YOUR PASSWORD

Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
MariaDB的root密码已设置,您可以使用密码登录MariaDB终端。

  1. mysql -u root -p
  2.  
  3. TYPE YOUR PASSWORD

现在创建一个名为wordpressdb的新数据库,并为WordPress安装使用名称为wpuser的新用户。 你可以使用下面的命令。 请使用安全密码替换“wpuser @”,该密码将用于新的WordPress数据库的访问凭据。

  1. create database wordpressdb;
  2. create user wpuser@localhost identified by ‘wpuser@’;
  3. grant all privileges on wordpressdb.* to wpuser@localhost identified by ‘wpuser@’;
  4. flush privileges;
  5. q

Nginx

安装配置HHVM

将HHVM存储库添加到您的Ubuntu存储库文件/etc/apt/sources.list并更新存储库:

  1. wget -O – http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add –
  2. echo deb http://dl.hhvm.com/ubuntu xenial main | sudo tee /etc/apt/sources.list.d/hhvm.list
  3. apt-get update

现在让我们安装HHVM:

  1. apt-get install -y hhvm

安装完成后,配置Nginx Web服务器使用HHVM:

  1. /usr/share/hhvm/install_fastcgi.sh

要在系统引导时自动启动HHVM,请运行以下命令:

  1. update-rc.d hhvm defaults

我们使用HHVM替代/usr/bin/php,即使您安装了php-cli:

  1. /usr/bin/update-alternatives –install /usr/bin/php php /usr/bin/hhvm 60

现在启动HHVM:

  1. systemctl start hhvm

现在是测试HHVM的时候了,我将在浏览器和服务器控制台/终端上测试它。
在/var/www/html/目录中创建名为info.php的新文件:

  1. cd /var/www/html/
  2. nano info.php

并添加下面的PHP代码:

  1. <?php
  2. phpinfo();
  3. ?>

现在使用vim编辑nginx虚拟主机文件/etc/nginx/sites-available/default,并添加index.php:

  1. vim /etc/nginx/sites-available/default

添加新的index.php:

  1. index index.php index.html index.htm index.nginx-debian.html;

保存并退出。
Nginx
然后用浏览器访问:http://192.168.1.108/info.php。 如果您可以在您的网页中看到HHVm工作正常。
Nginx
最后,在服务器控制台/终端中测试HHVM,键入以下命令:

  1. php info.php
  2. php -v

Nginx
第一个命令应显示单词“HipHop”,第二个命令为HHVM版本。

安装Wordpress

下载WordPress并解压缩:

  1. cd /var/www/html/
  2. wget wordpress.org/latest.zip
  3. unzip latest.zip

WordPress已经提取到“wordpress”目录中,您必须将所有WordPress文件和目录移动到/var/www/html/,您可以使用以下命令执行此操作:

  1. cd /var/www/html/
  2. mv wordpress/* .
  3. rm -rf wordpress/

现在将WordPress文件的所有者更改为用户和组www-data,通常www-data用户和组拥有/var/www/html/目录下的所有文件。 运行这些命令以更改文件和目录所有权:

  1. find . -type d -exec chown www-data:www-data {} ;
  2. find . -type f -exec chown www-data:www-data {} ;
  1. 然后将文件wp-config-sample.php重命名为wp-config.php,并编辑该文件以设置在数据库设置期间创建的数据库名称,数据库用户和密码。
  2. mv wp-config-sample.php wp-config.php
  3. nano wp-config.php
  1. DB_NAME = wordpressdb
  2. DB_USER = wpuser
  3. DB_PASSWORD = wpuser@

Nginx
然后重启Nginx:

  1. systemctl restart nginx

当Nginx重新启动,尝试访问服务器IP:http://192.168.1.108/,您将被重定向到WordPress安装。

MySQL管理教程(一):MySQL性能调优 – 选择最佳硬件

电脑硬件变化非常快。 因此,不会提供特定的硬件建议。 但是,在购买服务器硬件时可以提高一些建议。

主板选择

第一个考虑是你应该总是购买64位硬件,因为mysqld可以利用64位操作系统支持每进程大量的内存。 在32位操作系统上,每个进程只能使用大约2.4 Gb的RAM,而mysqld当前是单线程的。 确保主板可以支持足够的RAM。 如果服务器要在高负载环境中使用,我们建议主板能够支持16 Gb RAM。
虽然你现在可能不需要它,但不要到时候需要更多的RAM了,而发现你的主板不支持更多的内存。
当涉及到RAM,所需的内存数量将根据您的应用程序大不相同。 如果整个数据库的大小为1 Gb,并且不会随时间增加,则服务器不需要8 Gb的RAM。 然而,许多应用程序具有比可用存储器的量大得多的数据库。 最重要的是数据库的工作集的大小。 数据库的工作集是每次处理的数据量。 如果数据库大小为100 Gb,但有一个工作集为10 Gb(只有10%需要在RAM中随时),那么给mysqld实例分配16 Gb内存就够用了。 工作集中的数据量随数据的使用方式而变化。

硬盘驱动器选择

您的I/O子系统通常是服务器中最难以准确预测的要求之一。 硬盘驱动器的当前选项包括传统的SCSI驱动器,SATA(串行ATA)驱动器,SAS(串行连接SCSI)驱动器和新的固态驱动器。 SATA驱动器的可靠性不如SAS驱动器。 除非服务器是非常低端的,它应该使用SAS驱动器。

RAID选择

在大型生产系统中,通常会有一个硬件RAID控制器或RAID通过操作系统级软件配置。 RAID代表独立磁盘冗余阵列。 顾名思义,RAID是将具有某些数据镜像的单元的磁盘组合在一起。 有各种级别的RAID。 下面列出了用于数据库服务器的最常用级别。
RAID 0:只有一个数据副本,但数据分散在多个磁盘上(条带化)。 如果一个磁盘发生故障,则所有数据从所有磁盘丢失。
RAID 1:两个大小相等的磁盘组合形成一个冗余阵列。 每个磁盘是另一个的副本(镜像)。 如果一个磁盘发生故障,则所有数据都完好无损。
RAID 5:以防止数据丢失任何一个磁盘的方式组合三个或更多磁盘; 阵列的存储容量减少一个磁盘。
RAID 10:RAID 1(镜像)和RAID 0(条带化)的组合。 阵列的存储容量是硬盘驱动器总容量的50%,但每个驱动器都是镜像的。
在寻找RAID控制器时,应选择支持所需RAID级别的控制器。 此外,大多数硬件RAID控制器具有RAM高速缓存。 这用作从数组读取和写入数组的缓冲区。 当选择控制器的规格时,找电池支持的写缓存。 这意味着控制器上的高速缓存使用电池,使得如果电力丢失,则高速缓存的内容保持一段时间。 这使您可以安全地使用写回功能,这意味着,当RAID控制器从服务器接收到写入请求时,它可以立即向操作系统返回写入完成的信号。 这可以提供良好的性能提升,因为操作系统不必等待硬盘驱动器实际将数据写入盘片并且发信号通知完成。 与系统RAM一样,RAID控制器上的RAM缓存越多越好。

固态硬盘

固态硬盘得到了很大的关注。 固态硬盘驱动器没有像传统磁盘那样的旋转头。 这些器件具有非易失性闪存或基于DRAM。 主要优点包括快速随机存取读取,因为没有磁头移动读取和写入。 基于DRAM的驱动器也具有极快的写入速度。 此时,与传统的硬盘驱动器相比,固态驱动器的成本比较高。

Nginx使用教程(八):使用Nginx缓存之Memcached缓存

使用Memcache

Memcache是一个通用的内存缓存系统。 它通常用于加速缓慢的数据访问。 NGINX memcached模块提供各种指令,可以配置为直接访问Memcache提供内容,从而避免对上游服务器的请求。
除了指令之外,模块还创建$ memcached_key变量,用于执行高速缓存查找。 在使用Memcache查找之前,必须在$memcached_key变量中设置一个值,该变量根据请求URL确定。

memcached_pass

此指令用于指定memcached服务器的位置。 地址可以通过以下任意方式指定:
•域名或IP地址,以及可选端口
•使用带unix:前缀的的Unix域套接字
•使用NGINX upstream指令创建的一组服务器
该指令仅在NGINX配置的location和location if中使用。 如下例子:

  1. location /myloc/{
  2.    set $memached_key $uri;
  3.    memcached_pass localhost:11211;
  4.    }

memcached_connect_timeout / memcached_ send_timeout / memcached_read_timeout

memcached connect_timeout指令设置在NGINX和memcached服务器之间建立连接的超时。
memcached_send_timeout指令设置将请求写入memcached服务器的超时。 memcached_read_timeout指令设置从memcached服务器读取响应的超时。
所有指令的默认值为60秒,可在NGINX配置的http,server和location区块下使用。 如下例子:

  1. http{
  2.    memcached_send_timeout 30s;
  3.    memcached_connect_timeout 30s;
  4.    memcached_read_timeout 30s;
  5.    }

memcached_bind

此指令指定服务器的哪个IP与memcached连接,默认为关闭,即不指定,那么Nginx会自动选择服务器的一个IP用来连接。

完整示例

  1. server{
  2.    location /python/css/ {
  3.    alias "/code/location/css/";
  4.    }
  5.    location /python/ {
  6.    set $memcached_key "$request_method$request_uri";
  7.    charset utf-8;
  8.    memcached_pass 127.0.0.1:11211;
  9.    error_page 404 502 504 = @pythonfallback;
  10.    default_type text/html;
  11.    }
  12.    location @pythonfallback {
  13.    rewrite ^/python/(.*) /$1 break;
  14.  
  15.    proxy_pass http://127.0.0.1:5000;
  16.    proxy_set_header X-Cache-Key "$request_method$request_uri";
  17.    }
  18.    # Rest NGINX configuration omitted for brevity
  19. }