{"id":3565,"date":"2019-02-07T15:09:55","date_gmt":"2019-02-07T09:39:55","guid":{"rendered":"https:\/\/pheonixsolutions.com\/blog\/?p=3565"},"modified":"2026-10-07T14:53:20","modified_gmt":"2026-10-07T09:23:20","slug":"allow-ftp-access-to-developers-for-wordpress-sites","status":"publish","type":"post","link":"https:\/\/pheonixsolutions.com\/blog\/allow-ftp-access-to-developers-for-wordpress-sites\/","title":{"rendered":"Allow FTP access to developers for wordpress sites"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong><strong>Post Dat<\/strong>e:<\/strong> February 07, 2018<br><strong>Last Updated:<\/strong> October 07, 2026<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One of the most common issues WordPress developers encounter is being unable to upload files, install plugins, update themes, or perform WordPress core updates through the WordPress Admin Dashboard.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In most cases, these problems are caused by <strong>incorrect file ownership and permission settings<\/strong> on the WordPress installation directory. When the web server user and the FTP\/SFTP user do not have the appropriate permissions, WordPress may continuously request FTP credentials or fail to write files altogether.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide explains how to properly configure file ownership and permissions to allow seamless file uploads and plugin management through WordPress.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Common Symptoms<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You may be facing a permissions issue if you experience any of the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WordPress asks for FTP credentials during plugin installation.<\/li>\n\n\n\n<li>Plugin or theme updates fail.<\/li>\n\n\n\n<li>Media uploads do not work.<\/li>\n\n\n\n<li>Unable to create or modify files through WordPress Admin.<\/li>\n\n\n\n<li>&#8220;Permission Denied&#8221; errors appear in logs.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Solution Overview<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The process consists of the following steps:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Create a dedicated user.<\/li>\n\n\n\n<li>Point the user&#8217;s home directory to the WordPress document root.<\/li>\n\n\n\n<li>Add the user to the web server group.<\/li>\n\n\n\n<li>Assign correct ownership.<\/li>\n\n\n\n<li>Apply proper file and directory permissions.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Create a New User<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create a dedicated user that will manage the WordPress files.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">useradd devs<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Set the User Home Directory<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Modify the user&#8217;s home directory to point to the WordPress document root.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">usermod -d \/var\/www\/pheonixsolutions.com devs<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verify the change:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">grep devs \/etc\/passwd<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Add the User to the Web Server Group<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">First identify the web server user.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For Apache:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ps aux | grep apache<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ps aux | grep httpd<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For Nginx:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ps aux | grep nginx<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Most servers use either:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>apache<\/li>\n\n\n\n<li>www-data<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Add the user to the appropriate group:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">usermod -aG apache devs<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For Ubuntu\/Debian systems:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">usermod -aG www-data devs<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Change Ownership of WordPress Files<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Move to the WordPress document root and update ownership.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cd \/var\/www\/pheonixsolutions.com\n\nchown -R devs:apache \/var\/www\/pheonixsolutions.com<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For Ubuntu\/Debian:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">chown -R devs:www-data \/var\/www\/pheonixsolutions.com<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Set Correct File Permissions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Apply recommended WordPress permissions.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Files<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">find . -type f -exec chmod 664 {} \\;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Directories<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">find . -type d -exec chmod 775 {} \\;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Permission Flow Diagram<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2019\/02\/WordPress-FTP-Permissions-Fix-Flowchart.png\"><img fetchpriority=\"high\" decoding=\"async\" width=\"683\" height=\"1024\" src=\"https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2019\/02\/WordPress-FTP-Permissions-Fix-Flowchart-683x1024.png\" alt=\"\" class=\"wp-image-12156\" srcset=\"https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2019\/02\/WordPress-FTP-Permissions-Fix-Flowchart-683x1024.png 683w, https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2019\/02\/WordPress-FTP-Permissions-Fix-Flowchart-200x300.png 200w, https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2019\/02\/WordPress-FTP-Permissions-Fix-Flowchart-768x1152.png 768w, https:\/\/pheonixsolutions.com\/blog\/wp-content\/uploads\/2019\/02\/WordPress-FTP-Permissions-Fix-Flowchart.png 1024w\" sizes=\"(max-width: 683px) 100vw, 683px\" \/><\/a><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Verify Permissions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check ownership:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ls -lah \/var\/www\/pheonixsolutions.com<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">drwxrwxr-x devs apache<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check current user groups:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">id devs<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Security Best Practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Never use <code>777<\/code> permissions.<\/li>\n\n\n\n<li>Use a dedicated deployment user.<\/li>\n\n\n\n<li>Restrict SSH access where possible.<\/li>\n\n\n\n<li>Keep WordPress, plugins, and themes updated.<\/li>\n\n\n\n<li>Regularly audit file permissions.<\/li>\n\n\n\n<li>Take backups before making ownership changes.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Proper file ownership and permissions are essential for a secure and functional WordPress installation. By assigning the correct user, group, ownership, and permissions, developers can manage plugins, themes, uploads, and updates directly from the WordPress Admin Dashboard without FTP-related errors.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Following the steps in this guide will help eliminate common permission issues while maintaining server security and operational efficiency.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Thank you for using Pheonix Solutions. We hope this guide helps simplify WordPress management and troubleshooting.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently Asked Questions (FAQ)<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">1. Why does WordPress keep asking for FTP credentials?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">This usually happens when the web server user does not have write permissions on the WordPress directory.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">2. Should I use 777 permissions?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">No. Using <code>777<\/code> permissions creates a significant security risk and should be avoided in production environments.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">3. What permissions does WordPress recommend?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Generally:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Files: <code>664<\/code><\/li>\n\n\n\n<li>Directories: <code>775<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">These permissions provide the required access while maintaining security.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4. How do I find my web server user?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ps aux | egrep 'apache|httpd|nginx'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Common users are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>apache<\/li>\n\n\n\n<li>www-data<\/li>\n\n\n\n<li>nginx<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5. Will this fix plugin installation issues?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. In most cases, correct ownership and permissions allow WordPress to install, update, and remove plugins without requesting FTP credentials.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Related Articles<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/pheonixsolutions.com\/blog\/pureftp-configuration-issue-cpanelfailed-retrieve-directory-listing\/\">Pureftp configuration issue on cpanel|Failed to retrieve directory listing<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/pheonixsolutions.com\/blog\/ftp-backup-scipt-for-all-the-mysql-databases\/\">FTP backup scipt for all the mysql databases<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Talk to our experts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Have a technology challenge or looking for the right solution for your business? Our team can help you with <strong>cloud, DevOps, development, infrastructure, design, and more<\/strong>. Feel free to reach out to our experts <a href=\"https:\/\/pheonixsolutions.com\/contact\">here<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Post Date: February 07, 2018Last Updated: October 07, 2026 Introduction One of the most common issues WordPress developers encounter is [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1022],"tags":[185,167],"class_list":["post-3565","post","type-post","status-publish","format-standard","hentry","category-web-architecture","tag-ftp-2","tag-wordpress-2","psol-cat-web-architecture"],"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/phn2x7-Vv","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/3565","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/comments?post=3565"}],"version-history":[{"count":2,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/3565\/revisions"}],"predecessor-version":[{"id":12157,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/3565\/revisions\/12157"}],"wp:attachment":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/media?parent=3565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/categories?post=3565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/tags?post=3565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}