Drupal 7.28, Nginx 1.6, PostgreSQL 9.3.4, PHP 5.4, fpm install on CentOS 6.x x64

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介:
安装Drupal的系统需求, 需要web server, database, php.
本文以Drupal 7.28, Nginx 1.6, PostgrSQL 9.3.4, PHP 5.4为例写一下Drupal的部署.
不涉及任何优化, 例如使用fpm, 用unix sock连接效率会更高.

安装参考

一. nginx 安装, 本文选择使用rpm安装 : 
首先要把nginx的源添加进来.
# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1

使用yum安装nginx
# yum install -y nginx
Dependencies Resolved

====================================================================================================================================
 Package                     Arch                         Version                                 Repository                   Size
====================================================================================================================================
Installing:
 nginx                       x86_64                       1.6.0-1.el6.ngx                         nginx                       335 k
Transaction Summary
====================================================================================================================================
Install       1 Package(s)

# rpm -ql nginx
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/conf.d/example_ssl.conf
/etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/etc/rc.d/init.d/nginx
/etc/sysconfig/nginx
/usr/sbin/nginx
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx

# id nginx
uid=494(nginx) gid=490(nginx) groups=490(nginx)


配置nginx, 可参考.

# vi /etc/nginx/nginx.conf 

user  nginx;
worker_processes  4;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  2;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

# vi /etc/nginx/conf.d/default.conf 
server {
    listen       80;
    server_name  _;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        root   /opt/site/drupal;  # drupal下载后重命名到这里.
        index  index.php index.html index.htm;
        error_page 404 = @drupal;
    }

    location @drupal {
        rewrite ^(.*)$ /index.php?q=$1 last;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}
        location ~ \.php$ {
                root /opt/site/drupal;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass   127.0.0.1:9000;   # php-fpm的监听
                fastcgi_index  index.php;
                fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;   
        }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

# service nginx start
Starting nginx: [  OK  ]
# netstat -anp|grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      10382/nginx  

测试nginx服务是否正常 : 
Drupal 7.28, Nginx 1.6, PostgreSQL 9.3.4, PHP 5.4, fpm  install on CentOS 6.x x64 - 德哥@Digoal - PostgreSQL research

二. PostgreSQL的安装和配置, 简单的写一下, 使用9.3.4的源码安装. (假设服务器内存96G).
  1. Linux 内核参数

vi /etc/sysctl.conf
# add by digoal.zhou
kernel.shmmni = 4096
kernel.sem = 50100 64128000 50100 1280
fs.file-max = 7672460
net.ipv4.ip_local_port_range = 9000 65000
net.core.rmem_default = 1048576
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.core.netdev_max_backlog = 10000
fs.aio-max-nr = 1048576
net.ipv4.tcp_timestamps = 0
vm.overcommit_memory = 0
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10

vi /etc/security/limits.conf
# add by digoal.zhou
* soft    nofile  131072
* hard    nofile  131072
* soft    nproc   131072
* hard    nproc   131072
* soft    core    unlimited
* hard    core    unlimited
* soft    memlock 50000000
* hard    memlock 50000000

vi /etc/security/limits.d/90-nproc.conf
# 注释所有并添加
* soft    nproc   131072
* hard    nproc   131072

生效
sysctl -p


  2. PostgreSQL 9.3.4 编译项
./configure '--with-perl' '--with-tcl' '--with-python' '--with-openssl' '--with-pam' '--with-ldap' '--with-libxml' '--with-libxslt' '--enable-thread-safety' '--with-blocksize=32'
gmake world
gmake install-world


  3. PostgreSQL 参数
vi postgresql.conf
listen_addresses = '0.0.0.0'            # what IP address(es) to listen on;
port = 5432  # (change requires restart)
max_connections = 2000                  # (change requires restart)
superuser_reserved_connections = 13     # (change requires restart)
unix_socket_directories = '.'   # comma-separated list of directories
unix_socket_permissions = 0700          # begin with 0 to use octal notation
password_encryption = on
tcp_keepalives_idle = 60                # TCP_KEEPIDLE, in seconds;
tcp_keepalives_interval = 10            # TCP_KEEPINTVL, in seconds;
tcp_keepalives_count = 10               # TCP_KEEPCNT;
shared_buffers = 2048MB                 # min 128kB
work_mem = 1024MB                               # min 64kB
maintenance_work_mem = 1024MB           # min 1MB
shared_preload_libraries = 'pg_stat_statements'         # (change requires restart)
vacuum_cost_delay = 10                  # 0-100 milliseconds
vacuum_cost_limit = 10000               # 1-10000 credits
bgwriter_delay = 10ms                   # 10-10000ms between rounds
wal_level = hot_standby                 # minimal, archive, or hot_standby
synchronous_commit = off                # synchronization level;
wal_buffers = 16384kB                   # min 32kB, -1 sets based on shared_buffers
wal_writer_delay = 10ms         # 1-10000 milliseconds
checkpoint_segments = 128               # in logfile segments, min 1, 16MB each
archive_mode = on               # allows archiving to be done
archive_command = '/bin/date'           # command to use to archive a logfile segment
max_wal_senders = 32            # max number of walsender processes
wal_keep_segments = 512         # in logfile segments, 16MB each; 0 disables
hot_standby = on                        # "on" allows queries during recovery
max_standby_archive_delay = 300s        # max delay before canceling queries
max_standby_streaming_delay = 300s      # max delay before canceling queries
wal_receiver_status_interval = 1s       # send replies at least this often
hot_standby_feedback = on               # send info from standby to prevent
effective_cache_size = 96000MB
log_destination = 'csvlog'              # Valid values are combinations of
logging_collector = on          # Enable capturing of stderr and csvlog
log_directory = 'pg_log'                # directory where log files are written,
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
log_file_mode = 0600                    # creation mode for log files,
log_truncate_on_rotation = on           # If on, an existing log file with the
log_rotation_age = 1d                   # Automatic rotation of logfiles will
log_rotation_size = 10MB                # Automatic rotation of logfiles will
log_min_duration_statement = 1s # -1 is disabled, 0 logs all statements
log_checkpoints = on
log_connections = on
log_disconnections = on
log_error_verbosity = verbose           # terse, default, or verbose messages
log_statement = 'ddl'                   # none, ddl, mod, all
log_timezone = 'PRC'
track_activity_query_size = 4096        # (change requires restart)
autovacuum = on                 # Enable autovacuum subprocess?  'on'
log_autovacuum_min_duration = 0 # -1 disables, 0 logs all actions and
datestyle = 'iso, mdy'
timezone = 'PRC'
lc_messages = 'C'                       # locale for system error message
lc_monetary = 'C'                       # locale for monetary formatting
lc_numeric = 'C'                        # locale for number formatting
lc_time = 'C'                           # locale for time formatting
default_text_search_config = 'pg_catalog.english'
pg_stat_statements.max = 1000
pg_stat_statements.track = all
pg_stat_statements.save = on
其他的全部注释掉.

pg_hba.conf
host all all 0.0.0.0/0 md5

生效
重启数据库


  4. 存储
pg_xlog, 活跃表, 索引 等 分开到不同的块设备(底层也分开)存储.

  5. 活跃表优化
下载这个插件安装
http://git.postgresql.org/gitweb/?p=pgfincore.git;a=summary
mv pgfincore $PGSRC/contrib
export PATH=$PGHOME/bin:$PATH
确保pg_config命令在当前路径
cd $PGSRC/contrib/pgfincore
make clean
make && make install

psql dbname superuser
create extension pgfincore;
select * from pgfadvise_willneed('$sechema.活跃表'::regclass);
select * from pgfadvise_willneed('$sechema.活跃索引'::regclass);


  6. 请求跟踪, SQL优化
psql postgres postgres
create extension pg_stat_statements;
select pg_stat_statements_reset();
执行应用压力测试.
完了后查询CPU耗时排前5的SQL.
select query,calls,total_time,total_time/calls from pg_stat_statements order by 3 desc limit 5 offset 0;


这些SQL 的执行计划
explain $SQL;
看看有没有优化空间.

三. 安装PHP

yum install -y php php-xml php-fpm php-pgsql php-pdo php-common php-cli php-intl php-gd 
# rpm -qa|grep php
php-pdo-5.4.30-1.el6.remi.x86_64
php-common-5.4.30-1.el6.remi.x86_64
php-5.4.30-1.el6.remi.x86_64
php-cli-5.4.30-1.el6.remi.x86_64
php-intl-5.4.30-1.el6.remi.x86_64
php-pgsql-5.4.30-1.el6.remi.x86_64
php-xml-5.4.30-1.el6.remi.x86_64
php-fpm-5.4.30-1.el6.remi.x86_64 

# php -v
PHP 5.4.30 (cli) (built: Jun 25 2014 15:27:51) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies

启动php-fpm服务, 默认监听9000端口.php配置变更的话, 需要重启这个服务来生效.
[root@db-172-16-3-150 drupal]# service php-fpm start
Starting php-fpm: [  OK  ]
[root@db-172-16-3-150 drupal]# netstat -anp|grep 9000
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      14159/php-fpm  


配置php,  参见 : 

vi /etc/php.ini
Recommended PHP configuration settings
Setting: session.cache_limiter = nocache

Setting: session.auto_start = 0

Setting: expose_php = off
Reason: Shows current PHP version in all header requests, security disclosure, see here
Example: X-Powered-By: PHP/5.3.8

Setting: allow_url_fopen = off
Reason: This is a security issue: see here

Setting: magic_quotes_gpc = off
Reason: Forces quotes in variables - This feature has been deprecated as of PHP 5.3.0 and removed as of PHP 5.4.0.

Setting: register_globals = off
Reason: Security issue - having this enabled subjects PHP variables to input from any source:
This feature has been deprecated as of PHP 5.3.0 and removed as of PHP 5.4.0.

Setting: display_errors = Off
Reason: Hides errors output to display (website) we want to send to log file instead.


四. 安装Drupal 7.28
下载drupal

wget http://ftp.drupal.org/files/projects/drupal-7.28.tar.gz
tar -zxvf drupal-7.28.tar.gz
# ll drupal-7.28
total 252
-rw-r--r--  1 6226 6226  6604 May  8 12:05 authorize.php
-rw-r--r--  1 6226 6226 88691 May  8 12:05 CHANGELOG.txt
-rw-r--r--  1 6226 6226  1481 May  8 12:05 COPYRIGHT.txt
-rw-r--r--  1 6226 6226   720 May  8 12:05 cron.php
drwxr-xr-x  4 6226 6226  4096 May  8 12:05 includes
-rw-r--r--  1 6226 6226   529 May  8 12:05 index.php
-rw-r--r--  1 6226 6226  1717 May  8 12:05 INSTALL.mysql.txt
-rw-r--r--  1 6226 6226  1874 May  8 12:05 INSTALL.pgsql.txt
-rw-r--r--  1 6226 6226   703 May  8 12:05 install.php
-rw-r--r--  1 6226 6226  1298 May  8 12:05 INSTALL.sqlite.txt
-rw-r--r--  1 6226 6226 17995 May  8 12:05 INSTALL.txt
-rwxrwxrwx  1 6226 6226 18092 Nov  1  2013 LICENSE.txt
-rw-r--r--  1 6226 6226  8191 May  8 12:05 MAINTAINERS.txt
drwxr-xr-x  4 6226 6226  4096 May  8 12:05 misc
drwxr-xr-x 42 6226 6226  4096 May  8 12:05 modules
drwxr-xr-x  5 6226 6226  4096 May  8 12:05 profiles
-rw-r--r--  1 6226 6226  5382 May  8 12:05 README.txt
-rw-r--r--  1 6226 6226  1561 May  8 12:05 robots.txt
drwxr-xr-x  2 6226 6226  4096 May  8 12:05 scripts
drwxr-xr-x  4 6226 6226  4096 May  8 12:05 sites
drwxr-xr-x  7 6226 6226  4096 May  8 12:05 themes
-rw-r--r--  1 6226 6226 19986 May  8 12:05 update.php
-rw-r--r--  1 6226 6226  9642 May  8 12:05 UPGRADE.txt
-rw-r--r--  1 6226 6226  2178 May  8 12:05 web.config
-rw-r--r--  1 6226 6226   417 May  8 12:05 xmlrpc.php

创建站点目录, 和nginx配置的root一致.
[root@db-172-16-3-150 ~]# mkdir /opt/site
[root@db-172-16-3-150 ~]# mv /opt/soft_bak/drupal-7.28 /opt/site/drupal
[root@db-172-16-3-150 ~]# chown -R nginx:nginx /opt/site/drupal


安装语言文件至 drupal/profiles/standard/translations/
https://localize.drupal.org/translate/downloads
[root@db-172-16-3-150 drupal]# cd /opt/site/drupal/profiles/standard/translations/
[root@db-172-16-3-150 translations]# ll
total 4
-rw-r--r-- 1 nginx nginx 92 May  8 12:05 README.txt
[root@db-172-16-3-150 translations]# wget http://ftp.drupal.org/files/translations/7.x/drupal/drupal-7.28.zh-hans.po


五. 创建数据库
digoal=# create role drupal nosuperuser login encrypted password 'drupal123';
CREATE ROLE
pg93@db-172-16-3-150-> cd /ssd4/pg93
pg93@db-172-16-3-150-> mkdir tbs_drupal
digoal=# create tablespace tbs_drupal location '/ssd4/pg93/tbs_drupal';
CREATE TABLESPACE
digoal=# create database drupal728 with template template0 encoding 'UTF8' tablespace tbs_drupal;
CREATE DATABASE
digoal=# grant all on tablespace tbs_drupal to drupal;
GRANT
digoal=# grant all on database drupal728 to drupal;
GRANT
digoal=# \c drupal728 drupal
You are now connected to database "drupal728" as user "drupal".
drupal728=> create schema drupal;
CREATE SCHEMA


测试连接 : 
pg93@db-172-16-3-150-> psql -h 172.16.3.150 -p 5432 -U drupal drupal728
Password for user drupal: 
psql (9.3.3)
Type "help" for help.
drupal728=> \dn
  List of schemas
  Name  |  Owner   
--------+----------
 drupal | drupal
 public | postgres
(2 rows)


六. 配置drupal.
在浏览器运行install.php脚本前的配置.

[root@db-172-16-3-150 drupal]# cd /opt/site/drupal/
[root@db-172-16-3-150 drupal]# cp sites/default/default.settings.php sites/default/settings.php
[root@db-172-16-3-150 drupal]# chmod a+w sites/default/settings.php 
[root@db-172-16-3-150 drupal]# chmod a+w sites/default


打开一个IE浏览器, 输入WEB SERVER的IP.
Drupal 7.28, Nginx 1.6, PostgreSQL 9.3.4, PHP 5.4, fpm  install on CentOS 6.x x64 - 德哥@Digoal - PostgreSQL research
 
Drupal 7.28, Nginx 1.6, PostgreSQL 9.3.4, PHP 5.4, fpm  install on CentOS 6.x x64 - 德哥@Digoal - PostgreSQL research
 
Drupal 7.28, Nginx 1.6, PostgreSQL 9.3.4, PHP 5.4, fpm  install on CentOS 6.x x64 - 德哥@Digoal - PostgreSQL research
说明缺少php的gd模块和mbstring模块.
安装即可
# yum install -y php-gd php-mbstring

查看GD库是否启用, 现在不需要配置在php.ini, 这些配置在/etc/php.d中:
# less /etc/php.ini
;;;;
; Note: packaged extension modules are now loaded via the .ini files
; found in the directory /etc/php.d; these are loaded by default.
;;;;
查看当前加载的配置文件.

# php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File:         /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed:      /etc/php.d/curl.ini,
/etc/php.d/dom.ini,
/etc/php.d/fileinfo.ini,
/etc/php.d/gd.ini,
/etc/php.d/intl.ini,
/etc/php.d/json.ini,
/etc/php.d/mbstring.ini,
/etc/php.d/pdo.ini,
/etc/php.d/pdo_pgsql.ini,
/etc/php.d/pdo_sqlite.ini,
/etc/php.d/pgsql.ini,
/etc/php.d/phar.ini,
/etc/php.d/sqlite3.ini,
/etc/php.d/wddx.ini,
/etc/php.d/xmlreader.ini,
/etc/php.d/xmlwriter.ini,
/etc/php.d/xsl.ini,
/etc/php.d/zip.ini
查看是否启用gd和mbstring库
[root@db-172-16-3-150 drupal]# cat /etc/php.d/gd.ini
; Enable gd extension module
extension=gd.so
[root@db-172-16-3-150 drupal]# cat /etc/php.d/mbstring.ini 
; Enable mbstring extension module
extension=mbstring.so


现在要重启php-fpm服务来生效新安装的php模块.
service php-fpm restart

点击"进行安装", 检测全部通过, 进行下一步, 数据库配置.
注意这里配置的Table prefix不是schema, 而且表的前缀, 防止一个schema下有多个Drupal实例存在的情况造成表名重复.
如果不可能重复的话, 建议字母+下划线的前缀. 或者不要前缀.
Drupal 7.28, Nginx 1.6, PostgreSQL 9.3.4, PHP 5.4, fpm  install on CentOS 6.x x64 - 德哥@Digoal - PostgreSQL research

开始安装, 提示需要配置bytea output参数 : 
Drupal 7.28, Nginx 1.6, PostgreSQL 9.3.4, PHP 5.4, fpm  install on CentOS 6.x x64 - 德哥@Digoal - PostgreSQL research
配置方法很多, 随便选一种.
配置连接数据库的用户的默认参数, 

digoal=# alter role drupal set bytea_output = 'escape';
ALTER ROLE
或者配置drupal728数据库的参数,
digoal=# alter database drupal728 set bytea_output = 'escape';
ALTER DATABASE
或者配置PG集群的默认参数.
vi $PGDATA/postgresql.conf
bytea_output = 'escape';
pg_ctl reload


接下来安装过程出错, 违反非空约束如下, 
Drupal 7.28, Nginx 1.6, PostgreSQL 9.3.4, PHP 5.4, fpm  install on CentOS 6.x x64 - 德哥@Digoal - PostgreSQL research

但是表已经安装好了.

drupal728=> \dt
                      List of relations
 Schema |               Name                | Type  | Owner  
--------+-----------------------------------+-------+--------
 drupal | drupalactions                     | table | drupal
 drupal | drupalauthmap                     | table | drupal
 drupal | drupalbatch                       | table | drupal
 drupal | drupalblock                       | table | drupal
 drupal | drupalblock_custom                | table | drupal
 drupal | drupalblock_node_type             | table | drupal
 drupal | drupalblock_role                  | table | drupal
 drupal | drupalblocked_ips                 | table | drupal
 drupal | drupalcache                       | table | drupal
 drupal | drupalcache_block                 | table | drupal
 drupal | drupalcache_bootstrap             | table | drupal
 drupal | drupalcache_field                 | table | drupal
 drupal | drupalcache_filter                | table | drupal
 drupal | drupalcache_form                  | table | drupal
 drupal | drupalcache_image                 | table | drupal
 drupal | drupalcache_menu                  | table | drupal
 drupal | drupalcache_page                  | table | drupal
 drupal | drupalcache_path                  | table | drupal
 drupal | drupalcomment                     | table | drupal
 drupal | drupaldate_format_locale          | table | drupal
 drupal | drupaldate_format_type            | table | drupal
 drupal | drupaldate_formats                | table | drupal
 drupal | drupalfield_config                | table | drupal
 drupal | drupalfield_config_instance       | table | drupal
 drupal | drupalfield_data_body             | table | drupal
 drupal | drupalfield_data_comment_body     | table | drupal
 drupal | drupalfield_data_field_image      | table | drupal
 drupal | drupalfield_data_field_tags       | table | drupal
 drupal | drupalfield_revision_body         | table | drupal
 drupal | drupalfield_revision_comment_body | table | drupal
 drupal | drupalfield_revision_field_image  | table | drupal
 drupal | drupalfield_revision_field_tags   | table | drupal
 drupal | drupalfile_managed                | table | drupal
 drupal | drupalfile_usage                  | table | drupal
 drupal | drupalfilter                      | table | drupal
 drupal | drupalfilter_format               | table | drupal
 drupal | drupalflood                       | table | drupal
 drupal | drupalhistory                     | table | drupal
 drupal | drupalimage_effects               | table | drupal
 drupal | drupalimage_styles                | table | drupal
 drupal | drupalmenu_custom                 | table | drupal
 drupal | drupalmenu_links                  | table | drupal
 drupal | drupalmenu_router                 | table | drupal
 drupal | drupalnode                        | table | drupal
 drupal | drupalnode_access                 | table | drupal
 drupal | drupalnode_comment_statistics     | table | drupal
 drupal | drupalnode_revision               | table | drupal
 drupal | drupalnode_type                   | table | drupal
 drupal | drupalqueue                       | table | drupal
 drupal | drupalrdf_mapping                 | table | drupal
 drupal | drupalregistry                    | table | drupal
 drupal | drupalregistry_file               | table | drupal
 drupal | drupalrole                        | table | drupal
 drupal | drupalrole_permission             | table | drupal
 drupal | drupalsearch_dataset              | table | drupal
 drupal | drupalsearch_index                | table | drupal
 drupal | drupalsearch_node_links           | table | drupal
 drupal | drupalsearch_total                | table | drupal
 drupal | drupalsemaphore                   | table | drupal
 drupal | drupalsequences                   | table | drupal
 drupal | drupalsessions                    | table | drupal
 drupal | drupalshortcut_set                | table | drupal
 drupal | drupalshortcut_set_users          | table | drupal
 drupal | drupalsystem                      | table | drupal
 drupal | drupaltaxonomy_index              | table | drupal
 drupal | drupaltaxonomy_term_data          | table | drupal
 drupal | drupaltaxonomy_term_hierarchy     | table | drupal
 drupal | drupaltaxonomy_vocabulary         | table | drupal
 drupal | drupalurl_alias                   | table | drupal
 drupal | drupalusers                       | table | drupal
 drupal | drupalusers_roles                 | table | drupal
 drupal | drupalvariable                    | table | drupal
 drupal | drupalwatchdog                    | table | drupal
(73 rows)

drupal728=> \df
                                List of functions
 Schema |      Name       | Result data type |    Argument data types    |  Type  
--------+-----------------+------------------+---------------------------+--------
 drupal | concat          | text             | anynonarray, anynonarray  | normal
 drupal | concat          | text             | anynonarray, text         | normal
 drupal | concat          | text             | text, anynonarray         | normal
 drupal | concat          | text             | text, text                | normal
 drupal | greatest        | numeric          | numeric, numeric          | normal
 drupal | greatest        | numeric          | numeric, numeric, numeric | normal
 drupal | rand            | double precision |                           | normal
 drupal | substring_index | text             | text, text, integer       | normal
(8 rows)


非空约束错误, 从postgresql查看日志 : 
2014-07-11 21:54:12.543 CST,"drupal","drupal728",21209,"172.16.3.150:62904",53bfec82.52d9,150,"INSERT",2014-07-11 21:54:10 CST,3/290
7,0,ERROR,23502,"null value in column ""rid"" violates not-null constraint","Failing row contains (null, administer blocks, block)."
,,,,,"INSERT INTO drupalrole_permission (rid, permission, module) VALUES (NULL, 'administer blocks', 'block')",,"ExecConstraints, ex
ecMain.c:1610",""


这个错误可以直接点击the error page, 跳到手工处理配置界面.
Drupal 7.28, Nginx 1.6, PostgreSQL 9.3.4, PHP 5.4, fpm  install on CentOS 6.x x64 - 德哥@Digoal - PostgreSQL research
 
Drupal 7.28, Nginx 1.6, PostgreSQL 9.3.4, PHP 5.4, fpm  install on CentOS 6.x x64 - 德哥@Digoal - PostgreSQL research

完成配置 : 
Drupal 7.28, Nginx 1.6, PostgreSQL 9.3.4, PHP 5.4, fpm  install on CentOS 6.x x64 - 德哥@Digoal - PostgreSQL research

现在可以打开drupal了.
Drupal 7.28, Nginx 1.6, PostgreSQL 9.3.4, PHP 5.4, fpm  install on CentOS 6.x x64 - 德哥@Digoal - PostgreSQL research
 

执行完配置后改回权限

cd /opt/site/drupal/
chmod 644 sites/default/settings.php
chmod 755 sites/default


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
30天前
|
应用服务中间件 Linux 网络安全
如何在 CentOS 7 上为 Nginx 创建自签名 SSL 证书
如何在 CentOS 7 上为 Nginx 创建自签名 SSL 证书
97 1
|
1月前
|
SQL 关系型数据库 Linux
搭建 PostgreSQL 流复制主从指南(适用于 CentOS 7.x)
搭建 PostgreSQL 流复制主从指南(适用于 CentOS 7.x)
49 7
|
2月前
|
应用服务中间件 Linux nginx
让 CentOS 定时重启 Nginx
在CentOS上设置Nginx定时重启可通过`cron`或`systemctl`
171 0
|
26天前
|
应用服务中间件 Linux 网络安全
2022年超详细在CentOS 7上安装Nginx方法(源码安装)
这篇文章提供了在CentOS 7系统上通过源码安装Nginx的详细步骤,包括从官网下载Nginx源码包、上传至虚拟机、解压、删除压缩包、编译安装前的配置、安装PCRE库(因为Nginx使用PCRE库解析正则表达式)、安装zlib和OpenSSL库(用于支持HTTPS协议)、重新编译Nginx、安装后启动Nginx服务、关闭服务、修改默认端口、以及重启服务测试等步骤。文章还提供了相关命令和操作截图,帮助用户更好地理解和执行安装过程。
2022年超详细在CentOS 7上安装Nginx方法(源码安装)
|
30天前
|
应用服务中间件 Linux nginx
在CentOS上使用源码包安装Nginx、以及手动启动Nginx的步骤过程
这篇文章介绍了在CentOS系统上使用Nginx源码包进行安装和配置的详细步骤,包括源码包的获取、解压、配置、编译、安装、启动验证以及注意事项。
63 0
在CentOS上使用源码包安装Nginx、以及手动启动Nginx的步骤过程
|
1月前
|
物联网 应用服务中间件 Linux
CentOS7.9 Nginx+EMQX集群组建MQTTS平台
通过以上步骤,您已成功搭建了一个基于CentOS 7.9、Nginx和EMQX的MQTTS平台。这个平台既能保证数据传输的安全性,又能利用Nginx的负载均衡能力和EMQX的高性能、高并发处理能力,实现稳定高效的消息服务。在部署和配置过程中,务必注意证书、域名以及EMQX配置的正确性,确保系统安全和稳定运行。此外,定期更新软件和系统,以及监控系统性能,也是保证MQTTS平台长期稳定运行的重要环节。
65 4
|
1月前
|
物联网 应用服务中间件 Linux
CentOS7.9 Nginx+EMQX集群组建MQTTS平台
通过以上步骤,您已成功搭建了一个基于CentOS 7.9、Nginx和EMQX的MQTTS平台。这个平台既能保证数据传输的安全性,又能利用Nginx的负载均衡能力和EMQX的高性能、高并发处理能力,实现稳定高效的消息服务。在部署和配置过程中,务必注意证书、域名以及EMQX配置的正确性,确保系统安全和稳定运行。此外,定期更新软件和系统,以及监控系统性能,也是保证MQTTS平台长期稳定运行的重要环节。
56 3
|
23天前
|
应用服务中间件 Linux PHP
Linux搭建tengine2.0<Nginx>+php7环境
本文介绍了在Linux系统上搭建Tengine 2.0(一个Nginx的增强版本)和PHP 7环境的详细步骤,包括创建安装目录、下载源码包及依赖库、编译安装Nginx、配置Nginx、安装PHP及其依赖、设置PHP-FPM、配置环境变量、安装Git和Composer,以及服务管理和日志查看等。
49 0
|
30天前
|
Ubuntu 应用服务中间件 Linux
如何在Ubuntu 14.04上使用Nginx和Php-fpm安全地托管多个网站
如何在Ubuntu 14.04上使用Nginx和Php-fpm安全地托管多个网站
13 0
|
30天前
|
应用服务中间件 Linux 网络安全
如何在 CentOS 6.5 上使用 Unicorn 和 Nginx 部署 Rails 应用
如何在 CentOS 6.5 上使用 Unicorn 和 Nginx 部署 Rails 应用
25 0