Installation issues

Hi All

I am not a linux expert by any means. I managed to get Centos7 installed with apache and php72

Copied the files to the html root in a folder and even tried making everything 777 but the installer still says directories are not writeable. very frustrating

Installer also says parts of XML-Parser are missing. Which bits are missing? How must i know?

The installation documentation is so confusing when it comes to the permissions.

I put up a simple guide for Ubuntu/PHP 7 here:

You can have a look at the modules I’m installing, and try to find their equivalents for CentOS/PHP 7.2. That’s what will solve your XML parser problem, and the other ones you will get after you solve that one :slight_smile:

The SuiteCRM permissions issues are only as tricky as Linux permissions are themselves. I can help you get through the ordeal. First, you need to find out what user name your web server is running under.

If you’re lucky this will tell you:

ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print $1}'

Hi pgr, thanks

i know the apache user is “apache”

i have given ownership of all of SuiteCRM to apache

Hi Again

after following your link i added the missing php stuff and altered the php.ini file.

Now xml parser is fixed but i still get “not writable” errors on the custom and cache directories. Both directories are owned by the apache user and are 777, does not make sense to me.

Hi Again

one more thing

“sudo chmod -R 775 cache custom modules themes data upload config_override.php”

there is no file called “config_override.php”

Just remove that part about config_override.php

The installer creates that file, it will exist after you install. Sometimes these commands to reset permissions are used in systems that already have been installed once, that’s why that file is included in the list.

I will fix the documentation for initial installations anyway. Thanks

About the permissions problems: it might be problems with .htaccess files limiting access.

Have you set up your cron jobs yet? Exactly where did you configure them?

Please also fill in the user name and mode in config.php, default_permissions array.



i still have the wtite issues 2 posts above with cache and custom


I just did the crontab command as you said, don’t know where it put it. Then rebooted.

Where is config.php?

config.php is in the root of your SuiteCRM installation.

I don’t remember telling you to do any crontab command, but it’s possible I am forgetting (I am on too many threads).

If you type

crontab -l -u apache

and then

crontab -l -u root

It will list the crontabs of those two users, you can see in which one you’re calling cron.php. If it’s on the root one, it’s wrong and will break your permissions.


no cron for root
i added “* * * * * cd /var/www/html; php -f cron.php > /dev/null 2>&1” to cron for apache as per the link you gave at the top.

The download does not have a config.php file in it. downloaded it last thursday.

The config.php gets created during the installation. Sorry but I am a bit confused with where you’re getting those “not writeable” errors.

If you do this command from the root of your SuiteCRM install, what do you get (please post the full results):

ls -al


as requested

drwxrwxrwx.  19 apache apache   4096 Apr 10 12:17 .
drwxr-xr-x.   3 root   root       38 Apr 10 12:17 ..
-rwxrwxrwx.   1 apache apache    411 Apr 10 12:17 bower.json
drwxrwxrwx.   4 apache apache     35 Apr 10 12:17 cache
-rwxrwxrwx.   1 apache apache   3587 Apr 10 12:17 campaign_tracker.php
-rwxrwxrwx.   1 apache apache   3094 Apr 10 12:17
-rwxrwxrwx.   1 apache apache   1188 Apr 10 12:17 composer.json
-rwxrwxrwx.   1 apache apache  39639 Apr 10 12:17 composer.lock
-rwxrwxrwx.   1 apache apache   5052 Apr 10 12:17 cron.php
-rwxrwxrwx.   1 apache apache   2446 Apr 10 12:17 crossdomain.xml
drwxrwxrwx.   5 apache apache     75 Apr 10 12:17 custom
drwxrwxrwx.   3 apache apache    104 Apr 10 12:17 data
-rwxrwxrwx.   1 apache apache   2386 Apr 10 12:17 dictionary.php
-rwxrwxrwx.   1 apache apache  12733 Apr 10 12:17 download.php
-rwxrwxrwx.   1 apache apache   2390 Apr 10 12:17 emailmandelivery.php
-rwxrwxrwx.   1 apache apache   4918 Apr 10 12:17 export.php
-rwxrwxrwx.   1 apache apache 967627 Apr 10 12:17 files.md5
-rwxrwxrwx.   1 apache apache   2808 Apr 10 12:17 HandleAjaxCall.php
-rwxrwxrwx.   1 apache apache   2367 Apr 10 12:17 ical_server.php
drwxrwxrwx.  58 apache apache   4096 Apr 10 12:17 include
-rwxrwxrwx.   1 apache apache   2374 Apr 10 12:17 index.php
drwxrwxrwx.   6 apache apache   4096 Apr 10 12:17 install
-rwxrwxrwx.   1 apache apache  31893 Apr 10 12:17 install.php
-rwxrwxrwx.   1 apache apache   2275 Apr 10 12:17 json_server.php
drwxrwxrwx.   3 apache apache    125 Apr 10 12:17 jssource
drwxrwxrwx.   6 apache apache     67 Apr 10 12:17 lib
-rwxrwxrwx.   1 apache apache  34539 Apr 10 12:17 LICENSE.txt
-rwxrwxrwx.   1 apache apache   2313 Apr 10 12:17 log_file_restricted.html
-rwxrwxrwx.   1 apache apache   2376 Apr 10 12:17 maintenance.php
drwxrwxrwx.   2 apache apache   4096 Apr 10 12:17 metadata
drwxrwxrwx.   3 apache apache    102 Apr 10 12:17 ModuleInstall
drwxrwxrwx. 119 apache apache   4096 Apr 10 12:17 modules
-rwxrwxrwx.   1 apache apache   2886 Apr 10 12:17 pdf.php
-rwxrwxrwx.   1 apache apache    304 Apr 10 12:17 php_version.php
-rwxrwxrwx.   1 apache apache   3760 Apr 10 12:17
-rwxrwxrwx.   1 apache apache     73 Apr 10 12:17 robots.txt
-rwxrwxrwx.   1 apache apache   3588 Apr 10 12:17 run_job.php
drwxrwxrwx.  12 apache apache    133 Apr 10 12:17 service
drwxrwxrwx.   2 apache apache   4096 Apr 10 12:17 soap
-rwxrwxrwx.   1 apache apache   4031 Apr 10 12:17 soap.php
-rwxrwxrwx.   1 apache apache   5327 Apr 10 12:17 SugarSecurity.php
-rwxrwxrwx.   1 apache apache    154 Apr 10 12:17 sugar_version.json
-rwxrwxrwx.   1 apache apache   2296 Apr 10 12:17 sugar_version.php
-rwxrwxrwx.   1 apache apache    170 Apr 10 12:17 suitecrm_version.php
drwxrwxrwx.   4 apache apache     35 Apr 10 12:17 themes
-rwxrwxrwx.   1 apache apache   5839 Apr 10 12:17 TreeData.php
drwxrwxrwx.   2 apache apache     24 Apr 10 12:17 upload
-rwxrwxrwx.   1 apache apache   2248 Apr 10 12:17 vcal_server.php
-rwxrwxrwx.   1 apache apache   2976 Apr 10 12:17 vCard.php
drwxrwxrwx.  21 apache apache   4096 Apr 10 12:17 vendor
drwxrwxrwx.   2 apache apache     37 Apr 10 12:17 XTemplate
drwxrwxrwx.   7 apache apache    198 Apr 10 12:17 Zend

trying to attach a screenshot of the errors but the “add File” button does nothing

As you said, it doesn’t make much sense that you’re not getting access (if you are really correct that your web server user name is “apache”). It could be something in your web server configuration, something is blocking access…

You can try adding the sticky bits to your directories

sudo chmod -R 2775 upload cache

No difference

below if my httpd.conf file, maybe i missed something

# This is the main Apache HTTP server configuration file.  It contains the
# configuration directives that give the server its instructions.
# See <URL:> for detailed information.
# In particular, see
# <URL:>
# for a discussion of each configuration directive.
# Do NOT simply read the instructions in here without understanding
# what they do.  They're here only as hints or reminders.  If you are unsure
# consult the online docs. You have been warned.
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path.  If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so 'log/access_log'
# with ServerRoot set to '/www' will be interpreted by the
# server as '/www/log/access_log', where as '/log/access_log' will be
# interpreted as '/log/access_log'.

# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
# Do not add a slash at the end of the directory path.  If you point
# ServerRoot at a non-local disk, be sure to specify a local disk on the
# Mutex directive, if file-based mutexes are used.  If you wish to share the
# same ServerRoot for multiple httpd daemons, you will need to change at
# least PidFile.
ServerRoot "/etc/httpd"

# Listen: Allows you to bind Apache to specific IP addresses and/or

# ports, instead of the default. See also the <VirtualHost>
# directive.
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
Listen 80

# Dynamic Shared Object (DSO) Support
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need

# Example:
# LoadModule foo_module modules/
Include conf.modules.d/*.conf

# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
User apache
Group apache
# 'Main' server configuration
# The directives in this section set up the values used by the 'main'
# server, which responds to any requests that aren't handled by a
# <VirtualHost> definition.  These values also provide defaults for
# any <VirtualHost> containers you may define later in the file.
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
# virtual host being defined.

# ServerAdmin: Your address, where problems with the server should be
# e-mailed.  This address appears on some server-generated pages, such
# as error documents.  e.g.
ServerAdmin root@localhost

# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
# If your host doesn't have a registered DNS name, enter its IP address here.

# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other
# <Directory> blocks below.
<Directory />
    AllowOverride none
    Require all denied

# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.

# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
DocumentRoot "/var/www/html"

    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    # The Options directive is both complicated and important.  Please see
    # for more information.
    Options Indexes FollowSymLinks

    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    AllowOverride None

    # Controls who can get stuff from this server.
    Require all granted

# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
<IfModule dir_module>
    DirectoryIndex index.html

# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
<Files ".ht*">
    Require all denied

# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
ErrorLog "logs/error_log"

# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

<IfModule log_config_module>
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio


    # The location and format of the access logfile (Common Logfile Format).
    # If you do not define any access logfiles within a <VirtualHost>
    # container, they will be logged here.  Contrariwise, if you *do*
    # define per-<VirtualHost> access logfiles, transactions will be
    # logged therein and *not* in this file.
    #CustomLog "logs/access_log" common

    # If you prefer a logfile with access, agent, and referer information
    # (Combined Logfile Format) you can use the following directive.
    CustomLog "logs/access_log" combined

<IfModule alias_module>

    # Redirect: Allows you to tell clients about documents that used to
    # exist in your server's namespace, but do not anymore. The client
    # will make a new request for the document at its new location.
    # Example:
    # Redirect permanent /foo

    # Alias: Maps web paths into filesystem paths and is used to
    # access content that does not live under the DocumentRoot.
    # Example:
    # Alias /webpath /full/filesystem/path
    # If you include a trailing / on /webpath then the server will
    # require it to be present in the URL.  You will also likely
    # need to provide a <Directory> section to allow access to
    # the filesystem path.
    # ScriptAlias: This controls which directories contain server scripts.
    # ScriptAliases are essentially the same as Aliases, except that
    # documents in the target directory are treated as applications and
    # run by the server when requested rather than as documents sent to the
    # client.  The same rules about trailing "/" apply to ScriptAlias
    # directives as to Alias.
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"


# "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted

<IfModule mime_module>
    # TypesConfig points to the file containing the list of mappings from
    # filename extension to MIME-type.
    TypesConfig /etc/mime.types

    # AddType allows you to add to or override the MIME configuration
    # file specified in TypesConfig for specific file types.
    #AddType application/x-gzip .tgz
    # AddEncoding allows you to have certain browsers uncompress
    # information on the fly. Note: Not all browsers support this.
    #AddEncoding x-compress .Z
    #AddEncoding x-gzip .gz .tgz
    # If the AddEncoding directives above are commented-out, then you
    # probably should define those extensions to indicate media types:
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz

    # AddHandler allows you to map certain file extensions to "handlers":
    # actions unrelated to filetype. These can be either built into the server
    # or added with the Action directive (see below)
    # To use CGI scripts outside of ScriptAliased directories:
    # (You will also need to add "ExecCGI" to the "Options" directive.)
    #AddHandler cgi-script .cgi

    # For type maps (negotiated resources):
    #AddHandler type-map var

    # Filters allow you to process content before it is sent to the client.
    # To parse .shtml files for server-side includes (SSI):
    # (You will also need to add "Includes" to the "Options" directive.)
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml

# Specify a default charset for all content served; this enables
# interpretation of all content as UTF-8 by default.  To use the
# default browser choice (ISO-8859-1), or to allow the META tags
# in HTML content to override this choice, comment out this
# directive:
AddDefaultCharset UTF-8

<IfModule mime_magic_module>
    # The mod_mime_magic module allows the server to use various hints from the
    # contents of the file itself to determine its type.  The MIMEMagicFile
    # directive tells the module where the hint definitions are located.
  GNU nano 2.3.1                                      File: /etc/httpd/conf/httpd.conf

    MIMEMagicFile conf/magic

# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/"
#ErrorDocument 402

# EnableMMAP and EnableSendfile: On systems that support it,
# memory-mapping or the sendfile syscall may be used to deliver
# files.  This usually improves server performance, but must
# be turned off when serving from networked-mounted
# filesystems or if support for these functions is otherwise
# broken on your system.
# Defaults if commented: EnableMMAP On, EnableSendfile Off
#EnableMMAP off
EnableSendfile on

# Supplemental configuration
# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf

I’m sorry, I am no Apache configuration guru…

Can you find your web server error log (usually errors.log or php_errors.log) and check if there are any clues there?

If not, I am starting to run out of ideas to help you… normally this is quite easy, I don’t know what’s making it so hard for your web server process to access those directories…

Thanks for taking the time to help. i am going to rebuild tomorrow with things in the right order and change to nginx, see if that works.

i will let you know what happens

Again thanks


I came right in the end. it was SELinux that was blocking it.


sudo setenforce 0

that fixed it

Thank you all for your help

I’ve seen that problem before, but here there was no clue pointing to it… maybe there’s something in some log somewhere…

Anyway I’m glad you were able to nail it!