Ubuntu 20.04 LTS If install in VM, disconnect network before install sudo su passwd root vi /etc/sudoers %admin ALL=(ALL) ALL #%sudo ALL=(ALL:ALL) ALL exit su root timedatectl set-timezone Asia/Shanghai date vi /etc/apt/sources.list Add in file top position: deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse apt-get update apt-get upgrade If show: The following packages have been kept back: fwupd fwupd-signed libfwupd2 then: apt-get install fwupd-signed fwupd libfwupd2 ... apt install net-tools reboot vi /etc/ssh/sshd_config #PermitRootLogin prohibit-password UsePAM yes to PermitRootLogin no UsePAM no systemctl restart sshd 验证是否有账号存在空口令的情况: awk -F: '($2 == "") { print $1 }' /etc/shadow 检查除了root以外是否还有其它账号的UID为0:(任何UID为0的账号在系统上都具有超级用户权限.) awk -F: '($3 == 0) { print $1 }' /etc/passwd apt-get install fail2ban cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local vi /etc/fail2ban/jail.local Edit [sshd] to: [sshd] enabled=true systemctl enable fail2ban systemctl start fail2ban fail2ban-client status sshd /etc/init.d/fail2ban status -l Unlock: fail2ban-client set sshd unbanip you.wantto.unban.ip ufw status ufw default allow outgoing ufw default deny incoming ufw allow 80/tcp ufw allow 22/tcp ufw allow 10022/tcp ufw enable ufw status verbose vi /etc/fail2ban/jail.local 注释掉第一个[sshd] 修改第二个[sshd] port = ssh 为 enabled = true port = 10022 vi /etc/ssh/sshd_config 修改 #Port 22 为 Port 10022 systemctl restart fail2ban systemctl restart sshd 在终端中登录: ssh user@IP地址 -p port
apt install curl gnupg2 ca-certificates lsb-release echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \ | tee /etc/apt/sources.list.d/nginx.list echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \ | tee /etc/apt/preferences.d/99nginx curl -o /tmp/nginx_signing.key https://nginx.org/keys/nginx_signing.key gpg --dry-run --quiet --import --import-options show-only /tmp/nginx_signing.key mv /tmp/nginx_signing.key /etc/apt/trusted.gpg.d/nginx_signing.asc apt update apt install nginx systemctl enable nginx systemctl start nginx
apt install software-properties-common add-apt-repository ppa:ondrej/php apt update apt install php8.0 php8.0-fpm php8.0-common apt install php8.0-dev php8.0-bcmath php8.0-gd apt install libjpeg8-* apt install php8.0-curl php8.0-intl php8.0-ldap php8.0-mbstring php8.0-mcrypt php8.0-mysqlnd php8.0-odbc php8.0-pdo php8.0-memcache php8.0-memcached php8.0-opcache php8.0-redis php8.0-soap php8.0-xml php8.0-xmlrpc php8.0-zip php8.0-mongodb #php-mhash php-pear cp /lib/systemd/system/php8.0-fpm.service /lib/systemd/system/php-fpm.service systemctl daemon-reload systemctl stop php8.0-fpm systemctl disable php8.0-fpm systemctl enable php-fpm systemctl start php-fpm systemctl status php-fpm systemctl restart nginx vi /etc/php/8.0/fpm/php.ini cgi.fix_pathinfo=0 session.cookie_httponly = 1 post_max_size = 8M upload_max_filesize = 8M max_execution_time=60 vi /etc/php/8.0/fpm/pool.d/www.conf listen.owner = nobody listen.group = nobody ... user = nobody group = nobody vi /etc/nginx/nginx.conf user nobody; client_max_body_size 8M; keepalive_timeout 65; vi /etc/nginx/conf.d/default.conf server { listen 80; server_name localhost; root /usr/share/nginx/html; index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/run/php/php8.0-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\. { deny all; } } groupadd nobody systemctl restart php-fpm systemctl restart nginx vi /usr/share/nginx/html/info.php <?php phpinfo(); ?> http://your_server_IP_address/info.php rm /usr/share/nginx/html/info.php vi /etc/nginx/nginx.conf 在 http 区段中加入: server_tokens off; proxy_hide_header X-Powered-By; X-Frame限制同源: add_header X-Frame-Options SAMEORIGIN; 保存 检查配置文件是否有错误: /usr/sbin/nginx -t 重启 Nginx : systemctl reload nginx or: sudo systemctl restart nginx vi /etc/php/8.0/fpm/php.ini date.timezone = PRC 禁止显示php版本的信息: expose_php = Off 禁止显示错误信息: display_errors = Off display_startup_errors = Off error_reporting = E_ALL log_errors = On opcache.enable=1 opcache.jit=1205 opcache.jit_buffer_size=128M vi /etc/php/8.0/fpm/pool.d/www.conf catch_workers_output = yes 重启 php-fpm: systemctl restart php-fpm log会输出到:/var/log/php8.0-fpm.log vi /etc/nginx/nginx.conf 在 http 区段里加入: gzip on; gzip_min_length 1k; gzip_comp_level 6; gzip_buffers 32 4k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_vary on; vi /etc/nginx/conf.d/default.conf 修改: location ~*^.+.(jpg|jpeg|gif|png)$ { expires 30d; add_header Cache-Control private; } apt install redis vi /etc/redis/redis.conf maxmemory 100MB systemctl enable redis systemctl start redis chown -R root:root /usr/share/nginx/html/ 禁止IP直接访问,防止恶意解析: vi /etc/nginx/nginx.conf 在 listen [::]:80 default_server; 之后添加: return 403; 如果 /etc/nginx/nginx.conf 文件中没有,则在 /etc/nginx/conf.d/default.conf 文件顶部添加: server { listen 80; listen [::]:80 default_server; return 403; } 强制使用 www 二级域名访问: vi /etc/nginx/conf.d/default.conf # FORCE WWW server { server_name site.com; rewrite ^/(.*)$ http://www.site.com$1 permanent; } 限制 PHP 脚本的文件访问范围,防止一个站点被攻陷后殃及整个服务器(重要!!!): vi /etc/nginx/conf.d/default.conf 增加: fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/"; or:{ vi /etc/php/8.0/fpm/php.ini 在末尾加入: [HOST=testdomain.com] open_basedir=/usr/share/nginx/html/:/tmp/ } 注意用open_basedir指定的限制实际上是前缀,而不是目录名。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。 systemctl restart nginx 禁用某些 PHP 内置函数: vi /etc/php/8.0/fpm/php.ini disable_functions = pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,phpinfo,exec,passthru,chroot,shell_exec,system,chgrp,chown,dl,show_source,highlight_file,gzinflate,str_rot13,pfsockopen,syslog,readlink,symlink,stream_socket_server,leak,popepassthru,escapeshellcmd,escapeshellarg,max_execution_time,ini_alter,pcntl_wifcontinued,pcntl_signal_dispatch,pcntl_unshare,ini_restore,popen,pclose,delete,fputs,openlog,link,imap_open,mail,rename,putenv,getcwd,proc_open,proc_close,proc_get_status,pcntl_signal_get_handler,pcntl_async_signals,pcntl_signal,pcntl_alarm ;For Laravel composer command: ;rename,putenv,getcwd,proc_open,proc_close,proc_get_status,pcntl_signal_get_handler ;For Laravel queue job: ;pcntl_async_signals,pcntl_signal,pcntl_alarm ;上面两个根据情况添加 ;For Laravel Web: ;assert,file_get_contents,fopen,fwrite,opendir,ini_set,chmod,unlink,copy,mkdir,rmdir ;For WordPress: ;file,scandir,readdir,dir,set_time_limit 禁用远程url文件处理功能(打开它容易引起性能的问题,建议禁止,禁用之后 file_get_contents 函数将无法读取远程文件,可以用curl代替): # 容易造成任意文件读取和包含问题,注意,此项默认就是开启的 allow_url_fopen = Off # 容易造成远程包含,强烈建议关闭此项 allow_url_include = Off 禁止加载动态连接库 enable_dl = Off systemctl restart php-fpm
apt install mysql-server mysql-client systemctl enable mysql systemctl start mysql vi /etc/mysql/mysql.conf.d/mysqld.cnf [mysqld] default-time_zone = '+8:00' character-set-server = utf8mb4 default-authentication-plugin=mysql_native_password #bind-address = 127.0.0.1 #comment this if need remote login #mysqlx-bind-address = 127.0.0.1 #comment this if need remote login [client] default-character-set=utf8mb4 systemctl restart mysql mysql_secure_installation mysql -uroot -p mysql> create user 'dba'@'localhost' identified by 'password'; mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; mysql> ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; mysql> flush privileges; apt install mongodb vi /etc/mongodb.conf bind_ip = 0.0.0.0 port = 27017 systemctl restart mongodb
Nginx log添加host和请求时长
Nginx + php-fpm 性能优化
MySQL 5.7/8.0 优化
CentOS 7.0 添加 SWAP