介绍
今天的高流量Web应用程序由快速响应的Web服务器,可扩展的企业级数据库和功能丰富的脚本语言提供的动态内容提供动力。典型的Linux Web应用程序堆栈遵循LAMP架构(Linux,Apache,MySQL和PHP/Python)。
在专业的三层设置中,数据库后端将被封锁在自己的服务器中;Web服务器将其请求发送到应用层,作为数据库和网站之间的中间软件。
虽然Apache仍然是迄今为止最广泛使用的Web服务器,但 Nginx因其小足迹和快速响应时间而迅速获得了普及,MySQL的社区版本仍然是数据库的受欢迎选择,但许多网站还使用另一个名为PostgreSQL的开源数据库平台。
目标
在本教程中,我们将在两层架构中创建一个简单的Web应用程序. 我们的基础操作系统为两个节点将是CentOS 7. 该网站将由一个运行PHP代码的NginxWeb服务器驱动,它与PostgreSQL数据库交谈。
而不是采用其他LAMP或LEMP教程中看到的上下
的方法,我们将使用地面上
的方法:我们将首先创建数据库层,然后创建Web服务器,然后看看Web服务器如何连接到数据库。
我们将这个配置称为LEPP(Linux, Nginx,PHP,PostgreSQL)堆栈。
前提条件
要遵循本教程,您将需要以下内容:
- 两个 CentOS 7 Droplets 至少有 2 GB 的 RAM 和 2 个 CPU 内核,每个为数据库服务器和 Web 服务器。
我们将分别将这些机器的IP地址称为your_db_server_ip
和your_web_server_ip
;您可以在DigitalOcean控制面板上找到这些机器的实际IP地址。
- 在两个Droplets上使用 Sudo 非根用户. 要设置此设置,请遵循 此教程。
第一步:安装PostgreSQL
在此步骤中,我们将在数据库服务器上安装PostgreSQL。
连接到空的,新安装的 CentOS 7 框,您想安装 PostgreSQL. 它的存储器不与 CentOS 7 默认,所以我们需要先下载 yum 存储器 RPM。
1sudo wget http://yum.postgresql.org/9.4/redhat/rhel-7Server-x86_64/pgdg-centos94-9.4-1.noarch.rpm
一旦 RPM 已保存,请安装存储库。
1sudo yum install pgdg-centos94-9.4-1.noarch.rpm -y
最后,安装 PostgreSQL 9.4 服务器及其贡献模块。
1sudo yum install postgresql94-server postgresql94-contrib -y
步骤二:配置 PostgreSQL
在此步骤中,我们将定制 PostgreSQL 的一些后安装配置。
在 CentOS 7 中,PostgreSQL 9.4 数据和配置文件的默认位置是 /var/lib/pgsql/9.4/data/
,而程序二进制的位置是 /usr/pgsql-9.4/bin/
。
1sudo /usr/pgsql-9.4/bin/postgresql94-setup initdb
一旦数据库集群已初始化,数据文件夹中将有名为postgresql.conf的文件,这是PostgreSQL的主要配置文件,我们将更改该文件中的两个参数。
1sudo vi /var/lib/pgsql/9.4/data/postgresql.conf
更改以下几条线:
- 将
#listen_addresses = 'localhost' 变为
listen_addresses = '*' - 将
#port = 5432' 变为
port = 5432`
第一个参数指定了数据库服务器将收听的 IP 地址。作为安全措施,外包 Postgres 安装只允许本地主机连接。将此变更为*
意味着 Postgres 会收听来自任何源的流量。
保存和退出文件。
接下来,我们将编辑 pg_hba.conf
,这是PostgreSQL 的 Host Based Access (HBA) 配置文件. 它指定了哪些主机和 IP 范围可以连接到数据库服务器。 每个条目都指定了连接是否可以本地或远程(主机),它可以连接到哪个数据库,它可以连接到哪个用户,请求的 IP 封锁可以来自哪个位置,以及应该使用哪种身份验证模式。
打开「pg_hba.conf」进行编辑。
1sudo vi /var/lib/pgsql/9.4/data/pg_hba.conf
滚到文件的底部,并添加此行:
1host all all your_web_server_ip/32 md5
此行告诉 PostgreSQL 只接受来自 IP 地址 your_web_server_ip
的数据库连接,使用标准的 md5 验证值来验证密码。
保存和退出文件。
接下来,开始 Postgres 服务:
1sudo systemctl start postgresql-9.4.service
然后,让它:
1sudo systemctl enable postgresql-9.4.service
要检查数据库服务器是否接受连接,我们可以查看最新 Postgres 日志文件的最后几行。数据库错误日志存储在 /var/lib/pgsql/9.4/data/pg_log
目录中。
1sudo ls -l /var/lib/pgsql/9.4/data/pg_log
日志文件名具有模式 postgresql-day_of_week.log
(例如, postgresql-Wed.log
)。
1sudo tail -f -n 20 /var/lib/pgsql/9.4/data/pg_log/postgresql-day_of_week.log
输出应该显示类似于此的东西:
1...
2
3< 2015-02-26 21:32:24.159 EST >LOG: database system is ready to accept connections
4< 2015-02-26 21:32:24.159 EST >LOG: autovacuum launcher started
按 Ctrl + C 以停止从尾巴
命令的输出。
第三步:更新数据库服务器防火墙
我们还需要允许Postgres数据库流量通过防火墙。CentOS 7通过防火墙
大门实现动态防火墙;服务不需要重新启动以便更改生效。
1sudo firewall-cmd --state
默认状态应该是运行
,但如果是不运行
,请开始使用:
1sudo systemctl start firewalld
接下来,添加端口 5432 的规则,这是 PostgreSQL 数据库流量的端口。
1sudo firewall-cmd --permanent --zone=public --add-port=5432/tcp
然后重新加载防火墙。
1sudo firewall-cmd --reload
第四步:创建和人口化数据库
在此步骤中,我们将创建一个数据库并添加一些数据,这是我们的Web应用程序将动态收集和显示的数据。
第一步是更改 Postgres 超级用户的密码,称为 postgres,这是在第一次安装 PostgreSQL 时创建的。
1sudo su - postgres
这将更改命令提示为bash-4.2$
。接下来,启动内置的客户端工具。
1psql
默认情况下,这将登录 postgres 用户到 Postgres 数据库. 您的提示将更改为postgres=#
, psql 提示,而不是 OS 提示. 发出\password
命令将导致提示要求更改密码。
1\password
给 Postgres 用户一个安全的密码。
然后创建一个名为 product的数据库:
1CREATE DATABASE product;
然后连接到产品数据库:
1\connect product;
接下来,在数据库中创建一个名为 product_list的表:
1CREATE TABLE product_list (id int, product_name varchar(50));
运行下列命令一次,每个命令将添加一个单个记录到product_list
表。
1INSERT INTO product_list VALUES (1, 'Book');
2INSERT INTO product_list VALUES (2, 'Computer');
3INSERT INTO product_list VALUES (3, 'Desk');
最后,检查数据是否正确添加。
1SELECT * FROM product_list;
输出应该是这样的:
1id | product_name
2----+--------------
3 1 | Book
4 2 | Computer
5 3 | Desk
6(3 rows)
这就是我们在数据库服务器上所需要做的;您现在可以从中断连接。
步骤五:安装 Nginx
接下来,我们将安装并配置另一个Droplet中的 Nginx Web 服务器. 连接到另一个空的,新安装的 CentOS 7 框。
与PosgreSQL一样,Nginx存储器默认情况下不配备CentOS 7,我们需要先下载Yum存储器RPM。
1sudo wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
一旦 RPM 已保存,请安装存储库。
1sudo yum install nginx-release-centos-7-0.el7.ngx.noarch.rpm -y
最后,安装 Nginx Web 服务器。
1sudo yum install nginx -y
步骤六:更新 Web 服务器防火墙
在此步骤中,我们将配置防火墙以允许 Nginx 流量,并定制一些 Nginx 配置。
我们需要允许HTTP/HTTPS流量通过防火墙,就像以前一样,检查防火墙
服务是否正在运行。
1sudo firewall-cmd --state
默认状态应该是运行
,但如果它是不运行
,启动它:
1sudo systemctl start firewalld
现在为端口 80 (HTTP) 添加防火墙规则:
1sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
对于端口 443 (HTTPS) 添加另一个:
1sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
然后,重新加载防火墙。
1sudo firewall-cmd --reload
接下来,启动 Nginx。
1sudo systemctl start nginx.service
并允许它。
1sudo systemctl enable nginx.service
将我们的浏览器指向服务器的IP地址应该向我们显示默认的网页:
步骤七:配置 Nginx
此步骤中有两个 Nginx 配置文件,第一个是主配置文件,第二个是网站特定的配置文件。
一般配置文件控制服务器的整体特性 Nginx 可以服务于许多网站,每个网站都被称为服务器块(Apache 称之为虚拟主机或vhost)。
让我们编辑主服务器配置文件。
1sudo vi /etc/nginx/nginx.conf
在文件的第二行上,从1到2更改worker_processes
参数,这告诉Nginx的工人线程使用所有可用的CPU核心。
相反,我们将在默认服务器块中创建我们的Web应用程序,所以让我们编辑默认服务器块配置文件。
1sudo vi /etc/nginx/conf.d/default.conf
内容看起来像这样,你要编辑的部分都被突出。
1server {
2 listen 80;
3 server_name localhost;
4
5 ...
6
7 location / {
8 root /usr/share/nginx/html;
9 index index.html index.htm;
10 }
11
12 #error_page 404 /404.html;
13
14 ...
15
16 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
17 #
18 #location ~ \.php$ {
19 # root html;
20 # fastcgi_pass 127.0.0.1:9000;
21 # fastcgi_index index.php;
22 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
23 # include fastcgi_params;
24 #}
25
26 ...
27}
做以下编辑:
- 将
服务员_名称 ' 从
当地主机 ' 设置为`你的_web_server_ip'。 - 在
index.php'指令中添加
index.php',因此改为`index.php index.html index.htm'。 - 删除 " 位置 " 和 " 包含 " 根 " 和 " 索引 " 指示的 " 位置 " 二行。 如果没有这个更改,您可能会发现您的网页没有在浏览器中显示,并且Nginx错误日志记录了像 ` 无法打开主脚本 : /etc/nginx/html/index.php 这样的信件 (无此类文件或目录)``
- 解析** 通过 PHP 脚本到 FastCGI 服务器** 注释下的"位置~.php$"块(包括最后一个卷括号).
- 删除同一 " 位置~.php$ " 块下的根指令。
- 将快取指令值从‘127.0.0.1:900'改为‘unix:/var/run/php-fpm/php5-fpm.sock'. 这是为了确保PHP FastCGI 进程管理器(我们将在下一步安装)将会收听Unix socket.
- 改变
fastcgi_ param
指令值到 SCRIPT_FILENME $document_root$fastcgi_script_name' 。 这告诉了网络服务器,PHP脚本文件将保存在文档根目录下. (英语)
完成编辑后,文件应该是这样的:
1server {
2 listen 80;
3 server_name your_web_server_ip;
4
5 ...
6
7 root /usr/share/nginx/html;
8 index index.php index.html index.htm;
9
10 ...
11
12 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
13 #
14 location ~ \.php$ {
15 fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock;
16 fastcgi_index index.php;
17 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
18 include fastcgi_params;
19 }
20
21 ...
保存和退出文件,然后启动 Web 服务器。
1sudo systemctl restart nginx.service
步骤八:安装PHP
现在,我们将在 Web 服务器上安装三个 PHP 组件: PHP 引擎本身、FastCGI 流程管理器(FPM)和 PostgreSQL 的 PHP 模块。
首先,安装 PHP。
1sudo yum install php -y
接下来,我们将安装FastCGI流程管理器(FPM),这是PHP的FastCGI的实现。FastCGI就像一个在您的Web服务器顶部的插件,它独立运行,并通过将其整合到一个单一的流程中来加速用户请求,从而加速响应时间。
1sudo yum install php-fpm -y
最后,安装 PHP Postgres 模块:
1sudo yum install php-pgsql -y
第九步:配置PHP
在此步骤中,我们将配置PHP。
打开 PHP 配置文件。
1sudo vi /etc/php.ini
做下列变化:
将这个参数设置为关闭
,只意味着PHP不会将其签名添加到Web服务器的头部,也不会暴露服务器正在运行PHP的事实。
保存并退出文件. 接下来,编辑 FPM 配置文件。
1sudo vi /etc/php-fpm.d/www.conf
做下列变化:
- 更改
user = apache
到user = nginx
. - 同样,更改
group = apache
到group = nginx
. - 更改
listen = 127.0.0.1:9000
到listen = /var/run/php-fpm/php5-fpm.sock
. 我们在 Nginx 默认服务器块的配置文件中设置了相同的值。
保存和退出 vi. 接下来开始 PHP-FPM。
1sudo systemctl start php-fpm.service
然后允许它。
1sudo systemctl enable php-fpm.service
步骤十:创建Web应用程序
现在是时候我们创建我们的PHP应用程序了,创建一个名为index.php
的文件在/usr/share/nginx/html
。
1sudo vi /usr/share/nginx/html/index.php
请确保您分别用您的数据库服务器 IP 地址和 Postgres 密码替换突出变量。
1<html>
2
3<head>
4 <title>LEPP Stack Example</title>
5</head>
6
7<body>
8
9<h4>LEPP (Linux, Nginx, PHP, PostgreSQL) Sample Page</h4>
10<hr/>
11<p>Hello and welcome. This web page is dynamically showing a product list from a PostgreSQL database</p>
12
13<?php
14
15 $host = "your_db_server_ip";
16 $user = "postgres";
17 $password = "your_postgres_password";
18 $dbname = "product";
19
20 $con = pg_connect("host=$host dbname=$dbname user=$user password=$password")
21 or die ("Could not connect to server\n");
22
23 $query = "SELECT * FROM product_list";
24 $resultset = pg_query($con, $query) or die("Cannot execute query: $query\n");
25 $rowcount = pg_numrows($resultset);
26
27 for($index = 0; $index < $rowcount; $index++) {
28 $row = pg_fetch_array($resultset, $index);
29 echo $row["id"], "-", $row["product_name"];
30 echo "<br>";
31 }
32?>
33
34</body>
35</html>
这是一个简单的网页,包含嵌入式PHP代码. 首先,它为数据库连接字符串定义了一些参数。 接下来,对数据库服务器建立了一个连接(指定为$con
) 然后指定一个查询,然后对 product_list 表执行。
一旦文件被写成并保存,打开一个浏览器窗口,并将其指向your_web_server_ip
。
结论
我们从头开始构建了两个盒子,安装并配置了所有必要的软件,然后部署了我们的Web应用程序。生产堆栈将具有额外的复杂性,例如添加外部防火墙和负载平衡器,但这是一个坚实的基本配置,您可以使用来开始。